diff --git a/build/actions/bookmark.d.ts b/build/actions/bookmark.d.ts new file mode 100644 index 000000000..7b1e63c15 --- /dev/null +++ b/build/actions/bookmark.d.ts @@ -0,0 +1,19 @@ +import { FacetedCompositeUnitSpec } from 'vega-lite/build/src/spec'; +import { ResultPlot } from '../models/result'; +import { PlainReduxAction, ReduxAction } from './redux-action'; +export declare type BookmarkAction = BookmarkAddPlot | BookmarkClearAll | BookmarkRemovePlot | BookmarkModifyNote; +export declare const BOOKMARK_ADD_PLOT = "BOOKMARK_ADD_PLOT"; +export declare type BookmarkAddPlot = ReduxAction; +export declare const BOOKMARK_REMOVE_PLOT = "BOOKMARK_REMOVE_PLOT"; +export declare type BookmarkRemovePlot = ReduxAction; +export declare const BOOKMARK_MODIFY_NOTE = "BOOKMARK_MODIFY_NOTE"; +export declare type BookmarkModifyNote = ReduxAction; +export declare const BOOKMARK_CLEAR_ALL = "BOOKMARK_CLEAR_ALL"; +export declare type BookmarkClearAll = PlainReduxAction; diff --git a/build/actions/bookmark.js b/build/actions/bookmark.js new file mode 100644 index 000000000..b2d206b60 --- /dev/null +++ b/build/actions/bookmark.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BOOKMARK_ADD_PLOT = 'BOOKMARK_ADD_PLOT'; +exports.BOOKMARK_REMOVE_PLOT = 'BOOKMARK_REMOVE_PLOT'; +exports.BOOKMARK_MODIFY_NOTE = 'BOOKMARK_MODIFY_NOTE'; +exports.BOOKMARK_CLEAR_ALL = 'BOOKMARK_CLEAR_ALL'; +//# sourceMappingURL=bookmark.js.map \ No newline at end of file diff --git a/build/actions/bookmark.js.map b/build/actions/bookmark.js.map new file mode 100644 index 000000000..9afdf3263 --- /dev/null +++ b/build/actions/bookmark.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bookmark.js","sourceRoot":"","sources":["../../src/actions/bookmark.ts"],"names":[],"mappings":";;AAMa,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAKxC,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAK9C,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAM9C,QAAA,kBAAkB,GAAG,oBAAoB,CAAC"} \ No newline at end of file diff --git a/build/actions/config.d.ts b/build/actions/config.d.ts new file mode 100644 index 000000000..332fee111 --- /dev/null +++ b/build/actions/config.d.ts @@ -0,0 +1,7 @@ +import { VoyagerConfig } from '../models/config'; +import { ReduxAction } from './redux-action'; +export declare type ConfigAction = SetConfig; +export declare const SET_CONFIG = "SET_CONFIG"; +export declare type SetConfig = ReduxAction; diff --git a/build/actions/config.js b/build/actions/config.js new file mode 100644 index 000000000..ad5e9787e --- /dev/null +++ b/build/actions/config.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SET_CONFIG = 'SET_CONFIG'; +//# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/build/actions/config.js.map b/build/actions/config.js.map new file mode 100644 index 000000000..47f1e9ad0 --- /dev/null +++ b/build/actions/config.js.map @@ -0,0 +1 @@ +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/actions/config.ts"],"names":[],"mappings":";;AAKa,QAAA,UAAU,GAAG,YAAY,CAAC"} \ No newline at end of file diff --git a/build/actions/custom-wildcard-field.d.ts b/build/actions/custom-wildcard-field.d.ts new file mode 100644 index 000000000..a09724888 --- /dev/null +++ b/build/actions/custom-wildcard-field.d.ts @@ -0,0 +1,28 @@ +import { ExpandedType } from 'compassql/build/src/query/expandedtype'; +import { ReduxAction } from './redux-action'; +export declare type CustomWildcardAction = CustomWildcardAdd | CustomWildcardAddField | CustomWildcardRemove | CustomWildcardRemoveField | CustomWildcardModifyDescription; +export declare const CUSTOM_WILDCARD_ADD = "CUSTOM_WILDCARD_ADD"; +export declare type CustomWildcardAdd = ReduxAction; +export declare const CUSTOM_WILDCARD_REMOVE = "CUSTOM_WILDCARD_REMOVE"; +export declare type CustomWildcardRemove = ReduxAction; +export declare const CUSTOM_WILDCARD_ADD_FIELD = "CUSTOM_WILDCARD_ADD_FIELD"; +export declare type CustomWildcardAddField = ReduxAction; +export declare const CUSTOM_WILDCARD_REMOVE_FIELD = "CUSTOM_WILDCARD_REMOVE_FIELD"; +export declare type CustomWildcardRemoveField = ReduxAction; +export declare const CUSTOM_WILDCARD_MODIFY_DESCRIPTION = "CUSTOM_WILDCARD_MODIFY_DESCRIPTION"; +export declare type CustomWildcardModifyDescription = ReduxAction; diff --git a/build/actions/custom-wildcard-field.js b/build/actions/custom-wildcard-field.js new file mode 100644 index 000000000..f449aca9f --- /dev/null +++ b/build/actions/custom-wildcard-field.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CUSTOM_WILDCARD_ADD = 'CUSTOM_WILDCARD_ADD'; +exports.CUSTOM_WILDCARD_REMOVE = 'CUSTOM_WILDCARD_REMOVE'; +exports.CUSTOM_WILDCARD_ADD_FIELD = 'CUSTOM_WILDCARD_ADD_FIELD'; +exports.CUSTOM_WILDCARD_REMOVE_FIELD = 'CUSTOM_WILDCARD_REMOVE_FIELD'; +exports.CUSTOM_WILDCARD_MODIFY_DESCRIPTION = 'CUSTOM_WILDCARD_MODIFY_DESCRIPTION'; +//# sourceMappingURL=custom-wildcard-field.js.map \ No newline at end of file diff --git a/build/actions/custom-wildcard-field.js.map b/build/actions/custom-wildcard-field.js.map new file mode 100644 index 000000000..e2f34d35b --- /dev/null +++ b/build/actions/custom-wildcard-field.js.map @@ -0,0 +1 @@ +{"version":3,"file":"custom-wildcard-field.js","sourceRoot":"","sources":["../../src/actions/custom-wildcard-field.ts"],"names":[],"mappings":";;AAOa,QAAA,mBAAmB,GAAG,qBAAqB,CAAC;AAO5C,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAKlD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AAMxD,QAAA,4BAA4B,GAAG,8BAA8B,CAAC;AAM9D,QAAA,kCAAkC,GAAG,oCAAoC,CAAC"} \ No newline at end of file diff --git a/build/actions/dataset.d.ts b/build/actions/dataset.d.ts new file mode 100644 index 000000000..1f42f93e1 --- /dev/null +++ b/build/actions/dataset.d.ts @@ -0,0 +1,30 @@ +import { ExpandedType } from 'compassql/build/src/query/expandedtype'; +import { Schema } from 'compassql/build/src/schema'; +import { ThunkAction } from 'redux-thunk'; +import { Data, InlineData } from 'vega-lite/build/src/data'; +import { State } from '../models/index'; +import { ReduxAction } from './redux-action'; +export declare const DATASET_SCHEMA_CHANGE_FIELD_TYPE = "DATASET_SCHEMA_CHANGE_FIELD_TYPE"; +export declare type DatasetSchemaChangeFieldType = ReduxAction; +export declare const DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN = "DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN"; +export declare type DatasetSchemaChangeOrdinalDomain = ReduxAction; +export declare type DatasetAction = DatasetSchemaChangeFieldType | DatasetSchemaChangeOrdinalDomain | DatasetRequest | DatasetReceive; +export declare type DatasetAsyncAction = DatasetLoad; +export declare const DATASET_REQUEST = "DATASET_REQUEST"; +export declare type DatasetRequest = ReduxAction; +export declare const DATASET_RECEIVE = "DATASET_RECEIVE"; +export declare type DatasetReceive = ReduxAction; +export declare type DatasetLoad = ThunkAction; +export declare function datasetLoad(name: string, data: Data): DatasetLoad; diff --git a/build/actions/dataset.js b/build/actions/dataset.js new file mode 100644 index 000000000..2c7d2f177 --- /dev/null +++ b/build/actions/dataset.js @@ -0,0 +1,54 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var fetch = require("isomorphic-fetch"); +var redux_undo_1 = require("redux-undo"); +var data_1 = require("vega-lite/build/src/data"); +var api_1 = require("../api/api"); +var selectors_1 = require("../selectors"); +var reset_1 = require("./reset"); +exports.DATASET_SCHEMA_CHANGE_FIELD_TYPE = 'DATASET_SCHEMA_CHANGE_FIELD_TYPE'; +exports.DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN = 'DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN'; +exports.DATASET_REQUEST = 'DATASET_REQUEST'; +exports.DATASET_RECEIVE = 'DATASET_RECEIVE'; +function datasetLoad(name, data) { + return function (dispatch, getState) { + var config = selectors_1.selectConfig(getState()); + dispatch({ type: reset_1.RESET }); + dispatch({ + type: exports.DATASET_REQUEST, + payload: { name: name } + }); + // Get the new dataset + if (data_1.isUrlData(data)) { + return fetch(data.url) + .then(function (response) { return response.json(); }) + .catch(errorCatch) + .then(function (values) { + return buildSchemaAndDispatchDataReceive({ values: values }, config, dispatch, name); + }); + } + else if (data_1.isInlineData(data)) { + return buildSchemaAndDispatchDataReceive(data, config, dispatch, name); + } + else { + throw new Error('dataset load error: dataset type not detected'); + } + }; +} +exports.datasetLoad = datasetLoad; +; +function buildSchemaAndDispatchDataReceive(data, config, dispatch, name) { + return api_1.fetchCompassQLBuildSchema(data.values, config) + .catch(errorCatch) + .then(function (schema) { + dispatch({ + type: exports.DATASET_RECEIVE, + payload: { name: name, schema: schema, data: data } + }); + dispatch(redux_undo_1.ActionCreators.clearHistory()); + }); +} +function errorCatch(err) { + window.alert(err.message); +} +//# sourceMappingURL=dataset.js.map \ No newline at end of file diff --git a/build/actions/dataset.js.map b/build/actions/dataset.js.map new file mode 100644 index 000000000..09f037878 --- /dev/null +++ b/build/actions/dataset.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../src/actions/dataset.ts"],"names":[],"mappings":";;AAEA,wCAA0C;AAG1C,yCAA0C;AAC1C,iDAAmF;AACnF,kCAAqD;AAGrD,0CAA0C;AAG1C,iCAA8B;AAEjB,QAAA,gCAAgC,GAAG,kCAAkC,CAAC;AAMtE,QAAA,oCAAoC,GAAG,sCAAsC,CAAC;AAU9E,QAAA,eAAe,GAAG,iBAAiB,CAAC;AAKpC,QAAA,eAAe,GAAG,iBAAiB,CAAC;AASjD,qBAA4B,IAAY,EAAE,IAAU;IAClD,MAAM,CAAC,UAAC,QAA0B,EAAE,QAAQ;QAE1C,IAAM,MAAM,GAAG,wBAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAExC,QAAQ,CAAC,EAAC,IAAI,EAAE,aAAK,EAAC,CAAC,CAAC;QACxB,QAAQ,CAAC;YACP,IAAI,EAAE,uBAAe;YACrB,OAAO,EAAE,EAAC,IAAI,MAAA,EAAC;SAChB,CAAC,CAAC;QAEH,sBAAsB;QACtB,EAAE,CAAC,CAAC,gBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;iBACnB,IAAI,CAAC,UAAA,QAAQ,IAAI,OAAA,QAAQ,CAAC,IAAI,EAAE,EAAf,CAAe,CAAC;iBACjC,KAAK,CAAC,UAAU,CAAC;iBACjB,IAAI,CAAC,UAAC,MAAW;gBAChB,MAAM,CAAC,iCAAiC,CAAC,EAAC,MAAM,QAAA,EAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7E,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAC,mBAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,iCAAiC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzE,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAzBD,kCAyBC;AAAA,CAAC;AAEF,2CACE,IAAgB,EAAE,MAAqB,EAAE,QAA0B,EAAE,IAAY;IAEjF,MAAM,CAAC,+BAAyB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;SACpD,KAAK,CAAC,UAAU,CAAC;SACjB,IAAI,CAAC,UAAA,MAAM;QACV,QAAQ,CAAC;YACP,IAAI,EAAE,uBAAe;YACrB,OAAO,EAAE,EAAC,IAAI,MAAA,EAAE,MAAM,QAAA,EAAE,IAAI,MAAA,EAAC;SAC9B,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oBAAoB,GAAU;IAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC"} \ No newline at end of file diff --git a/build/actions/index.d.ts b/build/actions/index.d.ts new file mode 100644 index 000000000..9b7776da9 --- /dev/null +++ b/build/actions/index.d.ts @@ -0,0 +1,40 @@ +import { BookmarkAction } from './bookmark'; +import { ConfigAction } from './config'; +import { CustomWildcardAction } from './custom-wildcard-field'; +import { DatasetAction } from './dataset'; +import { LogAction } from './log'; +import { RelatedViewsAction } from './related-views'; +import { ResetAction } from './reset'; +import { ResultAction } from './result'; +import { ShelfAction } from './shelf'; +import { ShelfPreviewAction } from './shelf-preview'; +import { ApplicationStateAction } from './state'; +import { TabAction } from './tab'; +import { UndoableAction } from './undo-redo'; +export * from './bookmark'; +export * from './custom-wildcard-field'; +export * from './config'; +export * from './dataset'; +export * from './log'; +export * from './redux-action'; +export * from './related-views'; +export * from './reset'; +export * from './result'; +export * from './shelf'; +export * from './state'; +export * from './tab'; +export * from './undo-redo'; +export * from './shelf-preview'; +/** + * Union type of all actions in our application. + */ +export declare type Action = (ApplicationStateAction | BookmarkAction | ConfigAction | CustomWildcardAction | DatasetAction | LogAction | RelatedViewsAction | ResetAction | ResultAction | ShelfAction | ShelfPreviewAction | TabAction | UndoableAction); +export declare type ActionType = Action['type']; +export declare const ACTION_TYPE_INDEX: { + [k in ActionType]: 1; +}; +/** An array of all possible action types. */ +export declare const ACTION_TYPES: ("BOOKMARK_ADD_PLOT" | "BOOKMARK_CLEAR_ALL" | "BOOKMARK_REMOVE_PLOT" | "BOOKMARK_MODIFY_NOTE" | "SET_CONFIG" | "CUSTOM_WILDCARD_ADD" | "CUSTOM_WILDCARD_ADD_FIELD" | "CUSTOM_WILDCARD_REMOVE" | "CUSTOM_WILDCARD_REMOVE_FIELD" | "CUSTOM_WILDCARD_MODIFY_DESCRIPTION" | "RESET" | "DATASET_SCHEMA_CHANGE_FIELD_TYPE" | "DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN" | "DATASET_REQUEST" | "DATASET_RECEIVE" | "SET_APPLICATION_STATE" | "LOG_ERRORS_ADD" | "LOG_WARNINGS_ADD" | "LOG_WARNINGS_CLEAR" | "LOG_ERRORS_CLEAR" | "RELATED_VIEWS_HIDE_TOGGLE" | "RESULT_REQUEST" | "RESULT_RECEIVE" | "RESULT_LIMIT_INCREASE" | "RESULT_MODIFY_FIELD_PROP" | "RESULT_MODIFY_NESTED_FIELD_PROP" | "FILTER_ADD" | "FILTER_CLEAR" | "FILTER_REMOVE" | "FILTER_TOGGLE" | "FILTER_MODIFY_EXTENT" | "FILTER_MODIFY_MIN_BOUND" | "FILTER_MODIFY_MAX_BOUND" | "FILTER_MODIFY_ONE_OF" | "FILTER_MODIFY_TIME_UNIT" | "SPEC_CLEAR" | "SPEC_MARK_CHANGE_TYPE" | "SPEC_FIELD_ADD" | "SPEC_FIELD_AUTO_ADD" | "SPEC_FIELD_REMOVE" | "SPEC_FIELD_MOVE" | "SPEC_FIELD_PROP_CHANGE" | "SPEC_FIELD_NESTED_PROP_CHANGE" | "SPEC_FUNCTION_CHANGE" | "SPEC_FUNCTION_ADD_WILDCARD" | "SPEC_FUNCTION_REMOVE_WILDCARD" | "SPEC_FUNCTION_DISABLE_WILDCARD" | "SPEC_FUNCTION_ENABLE_WILDCARD" | "SPEC_LOAD" | "SHELF_LOAD_QUERY" | "SHELF_AUTO_ADD_COUNT_CHANGE" | "SHELF_GROUP_BY_CHANGE" | "SHELF_PREVIEW_SPEC" | "SHELF_PREVIEW_QUERY" | "SHELF_PREVIEW_DISABLE" | "TAB_ADD" | "TAB_REMOVE" | "TAB_SWITCH" | "TAB_TITLE_UPDATE" | "UNDO" | "REDO")[]; +export declare function isVoyagerAction(action: { + type: any; +}): action is Action; diff --git a/build/actions/index.js b/build/actions/index.js new file mode 100644 index 000000000..2c1afde73 --- /dev/null +++ b/build/actions/index.js @@ -0,0 +1,38 @@ +"use strict"; +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +var spec_1 = require("./shelf/spec"); +var tab_1 = require("./tab"); +__export(require("./bookmark")); +__export(require("./custom-wildcard-field")); +__export(require("./config")); +__export(require("./dataset")); +__export(require("./log")); +__export(require("./redux-action")); +__export(require("./related-views")); +__export(require("./reset")); +__export(require("./result")); +__export(require("./shelf")); +__export(require("./state")); +__export(require("./tab")); +__export(require("./undo-redo")); +__export(require("./shelf-preview")); +// Use type to enforce that ACTION_TYPE_INDEX contains all action types. +exports.ACTION_TYPE_INDEX = __assign({ BOOKMARK_ADD_PLOT: 1, BOOKMARK_CLEAR_ALL: 1, BOOKMARK_MODIFY_NOTE: 1, BOOKMARK_REMOVE_PLOT: 1, CUSTOM_WILDCARD_ADD: 1, CUSTOM_WILDCARD_ADD_FIELD: 1, CUSTOM_WILDCARD_MODIFY_DESCRIPTION: 1, CUSTOM_WILDCARD_REMOVE: 1, CUSTOM_WILDCARD_REMOVE_FIELD: 1, DATASET_SCHEMA_CHANGE_FIELD_TYPE: 1, DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN: 1, DATASET_REQUEST: 1, DATASET_RECEIVE: 1, FILTER_ADD: 1, FILTER_CLEAR: 1, FILTER_MODIFY_EXTENT: 1, FILTER_MODIFY_MAX_BOUND: 1, FILTER_MODIFY_MIN_BOUND: 1, FILTER_MODIFY_TIME_UNIT: 1, FILTER_MODIFY_ONE_OF: 1, FILTER_REMOVE: 1, FILTER_TOGGLE: 1, LOG_ERRORS_ADD: 1, LOG_ERRORS_CLEAR: 1, LOG_WARNINGS_ADD: 1, LOG_WARNINGS_CLEAR: 1, RELATED_VIEWS_HIDE_TOGGLE: 1, RESULT_RECEIVE: 1, RESULT_REQUEST: 1, RESULT_LIMIT_INCREASE: 1, RESULT_MODIFY_FIELD_PROP: 1, RESULT_MODIFY_NESTED_FIELD_PROP: 1, RESET: 1, SET_CONFIG: 1, SHELF_AUTO_ADD_COUNT_CHANGE: 1, SHELF_LOAD_QUERY: 1, SHELF_GROUP_BY_CHANGE: 1, SHELF_PREVIEW_SPEC: 1, SHELF_PREVIEW_QUERY: 1, SHELF_PREVIEW_DISABLE: 1 }, spec_1.SPEC_ACTION_TYPE_INDEX, tab_1.TAB_ACTION_TYPE_INDEX, { UNDO: 1, REDO: 1, SET_APPLICATION_STATE: 1 }); +/** An array of all possible action types. */ +exports.ACTION_TYPES = Object.keys(exports.ACTION_TYPE_INDEX); +function isVoyagerAction(action) { + return exports.ACTION_TYPE_INDEX[action.type]; +} +exports.isVoyagerAction = isVoyagerAction; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/actions/index.js.map b/build/actions/index.js.map new file mode 100644 index 000000000..02eb9af27 --- /dev/null +++ b/build/actions/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAUA,qCAAoD;AAEpD,6BAAuD;AAGvD,gCAA2B;AAC3B,6CAAwC;AACxC,8BAAyB;AACzB,+BAA0B;AAC1B,2BAAsB;AACtB,oCAA+B;AAC/B,qCAAgC;AAChC,6BAAwB;AACxB,8BAAyB;AACzB,6BAAwB;AACxB,6BAAwB;AACxB,2BAAsB;AACtB,iCAA4B;AAC5B,qCAAgC;AAuBhC,wEAAwE;AAC3D,QAAA,iBAAiB,cAC5B,iBAAiB,EAAE,CAAC,EACpB,kBAAkB,EAAE,CAAC,EACrB,oBAAoB,EAAE,CAAC,EACvB,oBAAoB,EAAE,CAAC,EAEvB,mBAAmB,EAAE,CAAC,EACtB,yBAAyB,EAAE,CAAC,EAC5B,kCAAkC,EAAE,CAAC,EACrC,sBAAsB,EAAE,CAAC,EACzB,4BAA4B,EAAE,CAAC,EAE/B,gCAAgC,EAAE,CAAC,EACnC,oCAAoC,EAAE,CAAC,EAEvC,eAAe,EAAE,CAAC,EAClB,eAAe,EAAE,CAAC,EAElB,UAAU,EAAE,CAAC,EACb,YAAY,EAAE,CAAC,EACf,oBAAoB,EAAE,CAAC,EACvB,uBAAuB,EAAE,CAAC,EAC1B,uBAAuB,EAAE,CAAC,EAC1B,uBAAuB,EAAE,CAAC,EAC1B,oBAAoB,EAAE,CAAC,EACvB,aAAa,EAAE,CAAC,EAChB,aAAa,EAAE,CAAC,EAEhB,cAAc,EAAE,CAAC,EACjB,gBAAgB,EAAE,CAAC,EACnB,gBAAgB,EAAE,CAAC,EACnB,kBAAkB,EAAE,CAAC,EAErB,yBAAyB,EAAE,CAAC,EAE5B,cAAc,EAAE,CAAC,EACjB,cAAc,EAAE,CAAC,EACjB,qBAAqB,EAAE,CAAC,EACxB,wBAAwB,EAAE,CAAC,EAC3B,+BAA+B,EAAE,CAAC,EAElC,KAAK,EAAE,CAAC,EAER,UAAU,EAAE,CAAC,EAEb,2BAA2B,EAAE,CAAC,EAC9B,gBAAgB,EAAE,CAAC,EACnB,qBAAqB,EAAE,CAAC,EAExB,kBAAkB,EAAE,CAAC,EACrB,mBAAmB,EAAE,CAAC,EACtB,qBAAqB,EAAE,CAAC,IAErB,6BAAsB,EAEtB,2BAAqB,IAExB,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,CAAC,EAEP,qBAAqB,EAAE,CAAC,IACxB;AAEF,6CAA6C;AAChC,QAAA,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,yBAAiB,CAAiB,CAAC;AAE3E,yBAAgC,MAAmB;IACjD,MAAM,CAAC,yBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAFD,0CAEC"} \ No newline at end of file diff --git a/build/actions/index.test.d.ts b/build/actions/index.test.d.ts new file mode 100644 index 000000000..e69de29bb diff --git a/build/actions/index.test.js b/build/actions/index.test.js new file mode 100644 index 000000000..dbf66d0da --- /dev/null +++ b/build/actions/index.test.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var index_1 = require("./index"); +describe('actions/index', function () { + describe('isVoyagerAction', function () { + it('should return true for all Voyager actions', function () { + index_1.ACTION_TYPES.forEach(function (actionType) { + var action = { type: actionType }; + expect(index_1.isVoyagerAction(action)).toEqual(1); + }); + }); + it('should return undefined for non-Voyager actions', function () { + var action = { type: 'SOME_RANDOM_ACTION' }; + expect(index_1.isVoyagerAction(action)).toBeFalsy; + }); + }); +}); +//# sourceMappingURL=index.test.js.map \ No newline at end of file diff --git a/build/actions/index.test.js.map b/build/actions/index.test.js.map new file mode 100644 index 000000000..68d5af490 --- /dev/null +++ b/build/actions/index.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/actions/index.test.ts"],"names":[],"mappings":";;AAAA,iCAAwD;AAExD,QAAQ,CAAC,eAAe,EAAE;IACxB,QAAQ,CAAC,iBAAiB,EAAE;QAC1B,EAAE,CAAC,4CAA4C,EAAE;YAC/C,oBAAY,CAAC,OAAO,CAAC,UAAA,UAAU;gBAC7B,IAAM,MAAM,GAAG,EAAC,IAAI,EAAE,UAAU,EAAC,CAAC;gBAClC,MAAM,CAAC,uBAAe,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE;YACpD,IAAM,MAAM,GAAG,EAAC,IAAI,EAAE,oBAAoB,EAAC,CAAC;YAC5C,MAAM,CAAC,uBAAe,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/build/actions/log.d.ts b/build/actions/log.d.ts new file mode 100644 index 000000000..910621027 --- /dev/null +++ b/build/actions/log.d.ts @@ -0,0 +1,16 @@ +import { WarningLevel } from '../models/log'; +import { PlainReduxAction, ReduxAction } from './redux-action'; +export declare type LogAction = LogErrorsAdd | LogWarningsAdd | LogWarningsClear | LogErrorsRemove; +export declare const LOG_ERRORS_ADD = "LOG_ERRORS_ADD"; +export declare type LogErrorsAdd = ReduxAction; +export declare const LOG_WARNINGS_ADD = "LOG_WARNINGS_ADD"; +export declare type LogWarningsAdd = ReduxAction; +export declare const LOG_WARNINGS_CLEAR = "LOG_WARNINGS_CLEAR"; +export declare type LogWarningsClear = PlainReduxAction; +export declare const LOG_ERRORS_CLEAR = "LOG_ERRORS_CLEAR"; +export declare type LogErrorsRemove = PlainReduxAction; diff --git a/build/actions/log.js b/build/actions/log.js new file mode 100644 index 000000000..1999771c4 --- /dev/null +++ b/build/actions/log.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LOG_ERRORS_ADD = 'LOG_ERRORS_ADD'; +exports.LOG_WARNINGS_ADD = 'LOG_WARNINGS_ADD'; +exports.LOG_WARNINGS_CLEAR = 'LOG_WARNINGS_CLEAR'; +exports.LOG_ERRORS_CLEAR = 'LOG_ERRORS_CLEAR'; +//# sourceMappingURL=log.js.map \ No newline at end of file diff --git a/build/actions/log.js.map b/build/actions/log.js.map new file mode 100644 index 000000000..69dba0060 --- /dev/null +++ b/build/actions/log.js.map @@ -0,0 +1 @@ +{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/actions/log.ts"],"names":[],"mappings":";;AAKa,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAKlC,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AAMtC,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAG1C,QAAA,gBAAgB,GAAG,kBAAkB,CAAC"} \ No newline at end of file diff --git a/build/actions/redux-action.d.ts b/build/actions/redux-action.d.ts new file mode 100644 index 000000000..49dfaaac3 --- /dev/null +++ b/build/actions/redux-action.d.ts @@ -0,0 +1,28 @@ +/** + * Helpers for implementing actions with Typescript. + */ +import { Action as BaseReduxAction, Dispatch } from 'redux'; +import { ThunkAction } from 'redux-thunk'; +/** + * Basic Redux Action of type A. + * (A should be a type of a string literal.) + */ +export interface PlainReduxAction extends BaseReduxAction { + type: A; +} +/** + * + */ +export interface ReduxAction extends PlainReduxAction { + payload: P; +} +/** + * Handler mixins interface for dealing with actions from presentation components. + */ +export interface ActionHandler { + handleAction: (action: A) => void; +} +/** + * Create a handleAction object + */ +export declare function createDispatchHandler)>(): (dispatch: Dispatch) => ActionHandler; diff --git a/build/actions/redux-action.js b/build/actions/redux-action.js new file mode 100644 index 000000000..ca48d0d19 --- /dev/null +++ b/build/actions/redux-action.js @@ -0,0 +1,20 @@ +"use strict"; +/** + * Helpers for implementing actions with Typescript. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +; +; +/** + * Create a handleAction object + */ +function createDispatchHandler() { + return function (dispatch) { return ({ + handleAction: function (action) { + // HACK: typing here is somewhat wrong -- we should remove any + dispatch(action); + } + }); }; +} +exports.createDispatchHandler = createDispatchHandler; +//# sourceMappingURL=redux-action.js.map \ No newline at end of file diff --git a/build/actions/redux-action.js.map b/build/actions/redux-action.js.map new file mode 100644 index 000000000..1a75ef117 --- /dev/null +++ b/build/actions/redux-action.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redux-action.js","sourceRoot":"","sources":["../../src/actions/redux-action.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAWF,CAAC;AAOD,CAAC;AASF;;GAEG;AACH;IACE,MAAM,CAAC,UAAC,QAAqB,IAAuB,OAAA,CAAC;QACnD,YAAY,YAAC,MAAS;YACpB,8DAA8D;YAC9D,QAAQ,CAAC,MAAa,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC,EALkD,CAKlD,CAAC;AACL,CAAC;AAPD,sDAOC"} \ No newline at end of file diff --git a/build/actions/related-views.d.ts b/build/actions/related-views.d.ts new file mode 100644 index 000000000..aa26703f5 --- /dev/null +++ b/build/actions/related-views.d.ts @@ -0,0 +1,6 @@ +import { ReduxAction } from './redux-action'; +export declare type RelatedViewsAction = RelatedViewsHideToggle; +export declare const RELATED_VIEWS_HIDE_TOGGLE = "RELATED_VIEWS_HIDE_TOGGLE"; +export declare type RelatedViewsHideToggle = ReduxAction; diff --git a/build/actions/related-views.js b/build/actions/related-views.js new file mode 100644 index 000000000..ca6cab02b --- /dev/null +++ b/build/actions/related-views.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RELATED_VIEWS_HIDE_TOGGLE = 'RELATED_VIEWS_HIDE_TOGGLE'; +//# sourceMappingURL=related-views.js.map \ No newline at end of file diff --git a/build/actions/related-views.js.map b/build/actions/related-views.js.map new file mode 100644 index 000000000..cb974a275 --- /dev/null +++ b/build/actions/related-views.js.map @@ -0,0 +1 @@ +{"version":3,"file":"related-views.js","sourceRoot":"","sources":["../../src/actions/related-views.ts"],"names":[],"mappings":";;AAIa,QAAA,yBAAyB,GAAG,2BAA2B,CAAC"} \ No newline at end of file diff --git a/build/actions/reset.d.ts b/build/actions/reset.d.ts new file mode 100644 index 000000000..f3234af4e --- /dev/null +++ b/build/actions/reset.d.ts @@ -0,0 +1,3 @@ +import { PlainReduxAction } from './redux-action'; +export declare const RESET = "RESET"; +export declare type ResetAction = PlainReduxAction; diff --git a/build/actions/reset.js b/build/actions/reset.js new file mode 100644 index 000000000..687c88adc --- /dev/null +++ b/build/actions/reset.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RESET = 'RESET'; +//# sourceMappingURL=reset.js.map \ No newline at end of file diff --git a/build/actions/reset.js.map b/build/actions/reset.js.map new file mode 100644 index 000000000..5b1a35030 --- /dev/null +++ b/build/actions/reset.js.map @@ -0,0 +1 @@ +{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/actions/reset.ts"],"names":[],"mappings":";;AAEa,QAAA,KAAK,GAAG,OAAO,CAAC"} \ No newline at end of file diff --git a/build/actions/result.d.ts b/build/actions/result.d.ts new file mode 100644 index 000000000..d40ca8cd8 --- /dev/null +++ b/build/actions/result.d.ts @@ -0,0 +1,47 @@ +import { Query } from 'compassql/build/src/query/query'; +import { ThunkAction } from 'redux-thunk'; +import { Channel } from 'vega-lite/build/src/channel'; +import { State } from '../models/index'; +import { ResultPlot } from '../models/result'; +import { ResultType } from '../models/result'; +import { ShelfFieldDef } from '../models/shelf/spec/encoding'; +import { Action } from './index'; +import { ReduxAction } from './redux-action'; +export declare type ResultAction = ResultRequest | ResultReceive | ResultLimitIncrease | ResultModifyAction; +export declare type ResultModifyAction = ResultModifyFieldProp | ResultModifyNestedFieldProp; +export declare function isResultAction(action: Action): action is ResultAction; +export declare type ResultAsyncAction = AsyncResultRequest; +export declare const RESULT_REQUEST = "RESULT_REQUEST"; +export declare type ResultRequest = ReduxAction; +export declare const RESULT_LIMIT_INCREASE = "RESULT_LIMIT_INCREASE"; +export declare type ResultLimitIncrease = ReduxAction; +export declare const RESULT_RECEIVE = "RESULT_RECEIVE"; +export declare type ResultReceive = ReduxAction; +export declare const RESULT_MODIFY_FIELD_PROP = "RESULT_MODIFY_FIELD_PROP"; +export declare type ResultModifyFieldProp

= ReduxAction; +export declare const RESULT_MODIFY_NESTED_FIELD_PROP = "RESULT_MODIFY_NESTED_FIELD_PROP"; +export declare type ResultModifyNestedFieldProp

= ReduxAction; +export declare type AsyncResultRequest = ThunkAction; +export declare function resultRequest(resultType: ResultType, query: Query, filterKey?: string): AsyncResultRequest; diff --git a/build/actions/result.js b/build/actions/result.js new file mode 100644 index 000000000..86713b4c0 --- /dev/null +++ b/build/actions/result.js @@ -0,0 +1,44 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var api_1 = require("../api/api"); +var selectors_1 = require("../selectors"); +var RESULT_ACTION_TYPE_INDEX = { + RESULT_REQUEST: 1, + RESULT_RECEIVE: 1, + RESULT_LIMIT_INCREASE: 1, + // Result modify actions + RESULT_MODIFY_FIELD_PROP: 1, + RESULT_MODIFY_NESTED_FIELD_PROP: 1 +}; +function isResultAction(action) { + return RESULT_ACTION_TYPE_INDEX[action.type]; +} +exports.isResultAction = isResultAction; +exports.RESULT_REQUEST = 'RESULT_REQUEST'; +exports.RESULT_LIMIT_INCREASE = 'RESULT_LIMIT_INCREASE'; +exports.RESULT_RECEIVE = 'RESULT_RECEIVE'; +exports.RESULT_MODIFY_FIELD_PROP = 'RESULT_MODIFY_FIELD_PROP'; +exports.RESULT_MODIFY_NESTED_FIELD_PROP = 'RESULT_MODIFY_NESTED_FIELD_PROP'; +function resultRequest(resultType, query, filterKey) { + return function (dispatch, getState) { + var schema = selectors_1.selectSchema(getState()); + var data = selectors_1.selectData(getState()); + var config = selectors_1.selectConfig(getState()); + dispatch({ + type: exports.RESULT_REQUEST, + payload: { resultType: resultType } + }); + // TODO: pass in config + return api_1.fetchCompassQLRecommend(query, schema, data, config).then(function (preFilteredPlots) { + var plots = (filterKey ? + preFilteredPlots.filter(function (p) { return p.groupByKey !== filterKey; }) : + preFilteredPlots).map(function (p) { return p.plot; }); + dispatch({ + type: exports.RESULT_RECEIVE, + payload: { query: query, plots: plots, resultType: resultType } + }); + }); + }; +} +exports.resultRequest = resultRequest; +//# sourceMappingURL=result.js.map \ No newline at end of file diff --git a/build/actions/result.js.map b/build/actions/result.js.map new file mode 100644 index 000000000..917a222dd --- /dev/null +++ b/build/actions/result.js.map @@ -0,0 +1 @@ +{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/actions/result.ts"],"names":[],"mappings":";;AAKA,kCAAmD;AAKnD,0CAAoE;AAUpE,IAAM,wBAAwB,GAAiC;IAC7D,cAAc,EAAE,CAAC;IACjB,cAAc,EAAE,CAAC;IACjB,qBAAqB,EAAE,CAAC;IACxB,wBAAwB;IACxB,wBAAwB,EAAE,CAAC;IAC3B,+BAA+B,EAAE,CAAC;CACnC,CAAC;AAEF,wBAA+B,MAAc;IAC3C,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAFD,wCAEC;AAIY,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAKlC,QAAA,qBAAqB,GAAG,uBAAuB,CAAC;AAMhD,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAOlC,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AAWtD,QAAA,+BAA+B,GAAG,iCAAiC,CAAC;AAcjF,uBAA8B,UAAsB,EAAE,KAAY,EAAE,SAAkB;IACpF,MAAM,CAAC,UAAC,QAA0B,EAAE,QAAQ;QAC1C,IAAM,MAAM,GAAG,wBAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxC,IAAM,IAAI,GAAG,sBAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpC,IAAM,MAAM,GAAG,wBAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAExC,QAAQ,CAAC;YACP,IAAI,EAAE,sBAAc;YACpB,OAAO,EAAE,EAAC,UAAU,YAAA,EAAC;SACtB,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,CAAC,6BAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAC9D,UAAC,gBAAqC;YACpC,IAAM,KAAK,GAAiB,CAC1B,SAAS;gBACT,gBAAgB,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,UAAU,KAAK,SAAS,EAA1B,CAA0B,CAAC;gBACxD,gBAAgB,CACjB,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAN,CAAM,CAAC,CAAC;YAEnB,QAAQ,CAAC;gBACP,IAAI,EAAE,sBAAc;gBACpB,OAAO,EAAE,EAAC,KAAK,OAAA,EAAE,KAAK,OAAA,EAAE,UAAU,YAAA,EAAC;aACpC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AA3BD,sCA2BC"} \ No newline at end of file diff --git a/build/actions/shelf-preview.d.ts b/build/actions/shelf-preview.d.ts new file mode 100644 index 000000000..c4541cdef --- /dev/null +++ b/build/actions/shelf-preview.d.ts @@ -0,0 +1,14 @@ +import { Query } from 'compassql/build/src/query/query'; +import { FacetedCompositeUnitSpec } from 'vega-lite/build/src/spec'; +import { PlainReduxAction, ReduxAction } from './redux-action'; +export declare type ShelfPreviewAction = ShelfPreviewSpec | ShelfPreviewQuery | ShelfPreviewDisable; +export declare const SHELF_PREVIEW_SPEC = "SHELF_PREVIEW_SPEC"; +export declare type ShelfPreviewSpec = ReduxAction; +export declare const SHELF_PREVIEW_QUERY = "SHELF_PREVIEW_QUERY"; +export declare type ShelfPreviewQuery = ReduxAction; +export declare const SHELF_PREVIEW_DISABLE = "SHELF_PREVIEW_DISABLE"; +export declare type ShelfPreviewDisable = PlainReduxAction; diff --git a/build/actions/shelf-preview.js b/build/actions/shelf-preview.js new file mode 100644 index 000000000..d739e88ad --- /dev/null +++ b/build/actions/shelf-preview.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SHELF_PREVIEW_SPEC = 'SHELF_PREVIEW_SPEC'; +exports.SHELF_PREVIEW_QUERY = 'SHELF_PREVIEW_QUERY'; +exports.SHELF_PREVIEW_DISABLE = 'SHELF_PREVIEW_DISABLE'; +//# sourceMappingURL=shelf-preview.js.map \ No newline at end of file diff --git a/build/actions/shelf-preview.js.map b/build/actions/shelf-preview.js.map new file mode 100644 index 000000000..1581219ef --- /dev/null +++ b/build/actions/shelf-preview.js.map @@ -0,0 +1 @@ +{"version":3,"file":"shelf-preview.js","sourceRoot":"","sources":["../../src/actions/shelf-preview.ts"],"names":[],"mappings":";;AAMa,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAK1C,QAAA,mBAAmB,GAAG,qBAAqB,CAAC;AAK5C,QAAA,qBAAqB,GAAG,uBAAuB,CAAC"} \ No newline at end of file diff --git a/build/actions/shelf/filter.d.ts b/build/actions/shelf/filter.d.ts new file mode 100644 index 000000000..b9c9a0e7b --- /dev/null +++ b/build/actions/shelf/filter.d.ts @@ -0,0 +1,46 @@ +import { DateTime } from 'vega-lite/build/src/datetime'; +import { OneOfFilter, RangeFilter } from 'vega-lite/build/src/filter'; +import { TimeUnit } from 'vega-lite/build/src/timeunit'; +import { PlainReduxAction, ReduxAction } from '../redux-action'; +export declare type FilterAction = FilterAdd | FilterClear | FilterRemove | FilterToggle | FilterModifyExtent | FilterModifyMinBound | FilterModifyMaxBound | FilterModifyOneOf | FilterModifyTimeUnit; +export declare const FILTER_ADD = "FILTER_ADD"; +export declare type FilterAdd = ReduxAction; +export declare const FILTER_TOGGLE = "FILTER_TOGGLE"; +export declare type FilterToggle = ReduxAction; +export declare const FILTER_REMOVE = "FILTER_REMOVE"; +export declare type FilterRemove = ReduxAction; +export declare const FILTER_CLEAR = "FILTER_CLEAR"; +export declare type FilterClear = PlainReduxAction; +export declare const FILTER_MODIFY_EXTENT = "FILTER_MODIFY_EXTENT"; +export declare type FilterModifyExtent = ReduxAction; +export declare const FILTER_MODIFY_MIN_BOUND = "FILTER_MODIFY_MIN_BOUND"; +export declare type FilterModifyMinBound = ReduxAction; +export declare const FILTER_MODIFY_MAX_BOUND = "FILTER_MODIFY_MAX_BOUND"; +export declare type FilterModifyMaxBound = ReduxAction; +export declare const FILTER_MODIFY_ONE_OF = "FILTER_MODIFY_ONE_OF"; +export declare type FilterModifyOneOf = ReduxAction; +export declare const FILTER_MODIFY_TIME_UNIT = "FILTER_MODIFY_TIME_UNIT"; +export declare type FilterModifyTimeUnit = ReduxAction; diff --git a/build/actions/shelf/filter.js b/build/actions/shelf/filter.js new file mode 100644 index 000000000..c60144df6 --- /dev/null +++ b/build/actions/shelf/filter.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FILTER_ADD = 'FILTER_ADD'; +exports.FILTER_TOGGLE = 'FILTER_TOGGLE'; +exports.FILTER_REMOVE = 'FILTER_REMOVE'; +exports.FILTER_CLEAR = 'FILTER_CLEAR'; +exports.FILTER_MODIFY_EXTENT = 'FILTER_MODIFY_EXTENT'; +exports.FILTER_MODIFY_MIN_BOUND = 'FILTER_MODIFY_MIN_BOUND'; +exports.FILTER_MODIFY_MAX_BOUND = 'FILTER_MODIFY_MAX_BOUND'; +exports.FILTER_MODIFY_ONE_OF = 'FILTER_MODIFY_ONE_OF'; +exports.FILTER_MODIFY_TIME_UNIT = 'FILTER_MODIFY_TIME_UNIT'; +//# sourceMappingURL=filter.js.map \ No newline at end of file diff --git a/build/actions/shelf/filter.js.map b/build/actions/shelf/filter.js.map new file mode 100644 index 000000000..76294941d --- /dev/null +++ b/build/actions/shelf/filter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../src/actions/shelf/filter.ts"],"names":[],"mappings":";;AAQa,QAAA,UAAU,GAAG,YAAY,CAAC;AAM1B,QAAA,aAAa,GAAG,eAAe,CAAC;AAKhC,QAAA,aAAa,GAAG,eAAe,CAAC;AAKhC,QAAA,YAAY,GAAG,cAAc,CAAC;AAG9B,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAM9C,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AAMpD,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AAMpD,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAM9C,QAAA,uBAAuB,GAAG,yBAAyB,CAAC"} \ No newline at end of file diff --git a/build/actions/shelf/index.d.ts b/build/actions/shelf/index.d.ts new file mode 100644 index 000000000..3aa86d7a5 --- /dev/null +++ b/build/actions/shelf/index.d.ts @@ -0,0 +1,20 @@ +import { Query } from 'compassql/build/src/query/query'; +import { ShelfGroupBy } from '../../models'; +import { ReduxAction } from '../redux-action'; +import { FilterAction } from './filter'; +import { SpecAction } from './spec'; +export * from './filter'; +export * from './spec'; +export declare type ShelfAction = FilterAction | SpecAction | ShelfLoadQuery | ShelfAutoAddCountChange | ShelfGroupByChange; +export declare const SHELF_LOAD_QUERY = "SHELF_LOAD_QUERY"; +export declare type ShelfLoadQuery = ReduxAction; +export declare const SHELF_AUTO_ADD_COUNT_CHANGE = "SHELF_AUTO_ADD_COUNT_CHANGE"; +export declare type ShelfAutoAddCountChange = ReduxAction; +export declare const SHELF_GROUP_BY_CHANGE = "SHELF_GROUP_BY_CHANGE"; +export declare type ShelfGroupByChange = ReduxAction; diff --git a/build/actions/shelf/index.js b/build/actions/shelf/index.js new file mode 100644 index 000000000..d7e56b90a --- /dev/null +++ b/build/actions/shelf/index.js @@ -0,0 +1,11 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./filter")); +__export(require("./spec")); +exports.SHELF_LOAD_QUERY = 'SHELF_LOAD_QUERY'; +exports.SHELF_AUTO_ADD_COUNT_CHANGE = 'SHELF_AUTO_ADD_COUNT_CHANGE'; +exports.SHELF_GROUP_BY_CHANGE = 'SHELF_GROUP_BY_CHANGE'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/actions/shelf/index.js.map b/build/actions/shelf/index.js.map new file mode 100644 index 000000000..638b0c356 --- /dev/null +++ b/build/actions/shelf/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/shelf/index.ts"],"names":[],"mappings":";;;;;AAMA,8BAAyB;AACzB,4BAAuB;AAIV,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AAKtC,QAAA,2BAA2B,GAAG,6BAA6B,CAAC;AAK5D,QAAA,qBAAqB,GAAG,uBAAuB,CAAC"} \ No newline at end of file diff --git a/build/actions/shelf/spec.d.ts b/build/actions/shelf/spec.d.ts new file mode 100644 index 000000000..8ea9a56ad --- /dev/null +++ b/build/actions/shelf/spec.d.ts @@ -0,0 +1,81 @@ +import { FacetedCompositeUnitSpec } from 'vega-lite/build/src/spec'; +import { ShelfFieldDef, ShelfFunction, ShelfId, ShelfMark } from '../../models'; +import { Action } from '../index'; +import { PlainReduxAction, ReduxAction } from '../redux-action'; +export declare type SpecAction = SpecClear | SpecMarkChangeType | SpecEncodingAction; +export declare type SpecEncodingAction = SpecFieldAdd | SpecFieldAutoAdd | SpecFieldRemove | SpecFieldMove | SpecFieldPropChange | SpecFieldNestedPropChange | SpecFunctionChange | SpecFunctionAddWildcard | SpecFunctionRemoveWildcard | SpecFunctionDisableWildcard | SpecFunctionEnableWildcard | SpecLoad; +export declare const SPEC_CLEAR = "SPEC_CLEAR"; +export declare type SpecClear = PlainReduxAction; +export declare const SPEC_MARK_CHANGE_TYPE = "SPEC_MARK_CHANGE_TYPE"; +export declare type SpecMarkChangeType = ReduxAction; +export declare const SPEC_FIELD_ADD = "SPEC_FIELD_ADD"; +export declare type SpecFieldAdd = ReduxAction; +export declare const SPEC_FIELD_AUTO_ADD = "SPEC_FIELD_AUTO_ADD"; +export declare type SpecFieldAutoAdd = ReduxAction; +export declare const SPEC_FIELD_REMOVE = "SPEC_FIELD_REMOVE"; +export declare type SpecFieldRemove = ReduxAction; +export declare const SPEC_FIELD_MOVE = "SPEC_FIELD_MOVE"; +export declare type SpecFieldMove = ReduxAction; +/** + * Change a property of a FieldDef to a specific value. + */ +export declare const SPEC_FIELD_PROP_CHANGE = "SPEC_FIELD_PROP_CHANGE"; +export declare type SpecFieldPropChange

= ReduxAction; +/** + * Change nested property of a FieldDef to a specific value. + */ +export declare const SPEC_FIELD_NESTED_PROP_CHANGE = "SPEC_FIELD_NESTED_PROP_CHANGE"; +export declare type SpecFieldNestedPropChange

= ReduxAction; +/** + * Change Function of a FieldDef to a specific value. + */ +export declare const SPEC_FUNCTION_CHANGE = "SPEC_FUNCTION_CHANGE"; +export declare type SpecFunctionChange = ReduxAction; +export declare const SPEC_FUNCTION_ADD_WILDCARD = "SPEC_FUNCTION_ADD_WILDCARD"; +export declare type SpecFunctionAddWildcard = ReduxAction; +export declare const SPEC_FUNCTION_DISABLE_WILDCARD = "SPEC_FUNCTION_DISABLE_WILDCARD"; +export declare type SpecFunctionDisableWildcard = ReduxAction; +export declare const SPEC_FUNCTION_ENABLE_WILDCARD = "SPEC_FUNCTION_ENABLE_WILDCARD"; +export declare type SpecFunctionEnableWildcard = ReduxAction; +export declare const SPEC_FUNCTION_REMOVE_WILDCARD = "SPEC_FUNCTION_REMOVE_WILDCARD"; +export declare type SpecFunctionRemoveWildcard = ReduxAction; +export declare const SPEC_LOAD = "SPEC_LOAD"; +export declare type SpecLoad = ReduxAction; +export declare const SPEC_ACTION_TYPE_INDEX: { + [k in SpecAction['type']]: 1; +}; +export declare function isSpecAction(a: Action): a is SpecAction; diff --git a/build/actions/shelf/spec.js b/build/actions/shelf/spec.js new file mode 100644 index 000000000..40121e38e --- /dev/null +++ b/build/actions/shelf/spec.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SPEC_CLEAR = 'SPEC_CLEAR'; +exports.SPEC_MARK_CHANGE_TYPE = 'SPEC_MARK_CHANGE_TYPE'; +// Field +exports.SPEC_FIELD_ADD = 'SPEC_FIELD_ADD'; +exports.SPEC_FIELD_AUTO_ADD = 'SPEC_FIELD_AUTO_ADD'; +exports.SPEC_FIELD_REMOVE = 'SPEC_FIELD_REMOVE'; +exports.SPEC_FIELD_MOVE = 'SPEC_FIELD_MOVE'; +/** + * Change a property of a FieldDef to a specific value. + */ +exports.SPEC_FIELD_PROP_CHANGE = 'SPEC_FIELD_PROP_CHANGE'; +/** + * Change nested property of a FieldDef to a specific value. + */ +exports.SPEC_FIELD_NESTED_PROP_CHANGE = 'SPEC_FIELD_NESTED_PROP_CHANGE'; +/** + * Change Function of a FieldDef to a specific value. + */ +exports.SPEC_FUNCTION_CHANGE = 'SPEC_FUNCTION_CHANGE'; +exports.SPEC_FUNCTION_ADD_WILDCARD = 'SPEC_FUNCTION_ADD_WILDCARD'; +exports.SPEC_FUNCTION_DISABLE_WILDCARD = 'SPEC_FUNCTION_DISABLE_WILDCARD'; +exports.SPEC_FUNCTION_ENABLE_WILDCARD = 'SPEC_FUNCTION_ENABLE_WILDCARD'; +exports.SPEC_FUNCTION_REMOVE_WILDCARD = 'SPEC_FUNCTION_REMOVE_WILDCARD'; +exports.SPEC_LOAD = 'SPEC_LOAD'; +exports.SPEC_ACTION_TYPE_INDEX = { + SPEC_CLEAR: 1, + SPEC_LOAD: 1, + SPEC_MARK_CHANGE_TYPE: 1, + SPEC_FIELD_ADD: 1, + SPEC_FIELD_AUTO_ADD: 1, + SPEC_FIELD_MOVE: 1, + SPEC_FIELD_PROP_CHANGE: 1, + SPEC_FIELD_NESTED_PROP_CHANGE: 1, + SPEC_FIELD_REMOVE: 1, + SPEC_FUNCTION_CHANGE: 1, + SPEC_FUNCTION_ADD_WILDCARD: 1, + SPEC_FUNCTION_DISABLE_WILDCARD: 1, + SPEC_FUNCTION_ENABLE_WILDCARD: 1, + SPEC_FUNCTION_REMOVE_WILDCARD: 1 +}; +function isSpecAction(a) { + return exports.SPEC_ACTION_TYPE_INDEX[a.type]; +} +exports.isSpecAction = isSpecAction; +//# sourceMappingURL=spec.js.map \ No newline at end of file diff --git a/build/actions/shelf/spec.js.map b/build/actions/shelf/spec.js.map new file mode 100644 index 000000000..ddc966342 --- /dev/null +++ b/build/actions/shelf/spec.js.map @@ -0,0 +1 @@ +{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/actions/shelf/spec.ts"],"names":[],"mappings":";;AAmBa,QAAA,UAAU,GAAG,YAAY,CAAC;AAG1B,QAAA,qBAAqB,GAAG,uBAAuB,CAAC;AAG7D,QAAQ;AAEK,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAOlC,QAAA,mBAAmB,GAAG,qBAAqB,CAAC;AAK5C,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAIxC,QAAA,eAAe,GAAG,iBAAiB,CAAC;AAMjD;;GAEG;AACU,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAS/D;;GAEG;AACU,QAAA,6BAA6B,GAAG,+BAA+B,CAAC;AAW7E;;GAEG;AACU,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAM9C,QAAA,0BAA0B,GAAG,4BAA4B,CAAC;AAM1D,QAAA,8BAA8B,GAAG,gCAAgC,CAAC;AAKlE,QAAA,6BAA6B,GAAG,+BAA+B,CAAC;AAKhE,QAAA,6BAA6B,GAAG,+BAA+B,CAAC;AAMhE,QAAA,SAAS,GAAG,WAAW,CAAC;AAMxB,QAAA,sBAAsB,GAAmC;IACpE,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,qBAAqB,EAAE,CAAC;IAExB,cAAc,EAAE,CAAC;IACjB,mBAAmB,EAAE,CAAC;IACtB,eAAe,EAAE,CAAC;IAClB,sBAAsB,EAAE,CAAC;IACzB,6BAA6B,EAAE,CAAC;IAChC,iBAAiB,EAAE,CAAC;IAEpB,oBAAoB,EAAE,CAAC;IACvB,0BAA0B,EAAE,CAAC;IAC7B,8BAA8B,EAAE,CAAC;IACjC,6BAA6B,EAAE,CAAC;IAChC,6BAA6B,EAAE,CAAC;CACjC,CAAC;AAEF,sBAA6B,CAAS;IACpC,MAAM,CAAC,8BAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAFD,oCAEC"} \ No newline at end of file diff --git a/build/actions/state.d.ts b/build/actions/state.d.ts new file mode 100644 index 000000000..f012c4691 --- /dev/null +++ b/build/actions/state.d.ts @@ -0,0 +1,7 @@ +import { State } from '../models'; +import { ReduxAction } from './redux-action'; +export declare type ApplicationStateAction = SetApplicationState; +export declare const SET_APPLICATION_STATE = "SET_APPLICATION_STATE"; +export declare type SetApplicationState = ReduxAction; +}>; diff --git a/build/actions/state.js b/build/actions/state.js new file mode 100644 index 000000000..2206ffb24 --- /dev/null +++ b/build/actions/state.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SET_APPLICATION_STATE = 'SET_APPLICATION_STATE'; +//# sourceMappingURL=state.js.map \ No newline at end of file diff --git a/build/actions/state.js.map b/build/actions/state.js.map new file mode 100644 index 000000000..8c0e6c00c --- /dev/null +++ b/build/actions/state.js.map @@ -0,0 +1 @@ +{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/actions/state.ts"],"names":[],"mappings":";;AAKa,QAAA,qBAAqB,GAAG,uBAAuB,CAAC"} \ No newline at end of file diff --git a/build/actions/tab.d.ts b/build/actions/tab.d.ts new file mode 100644 index 000000000..916f758f7 --- /dev/null +++ b/build/actions/tab.d.ts @@ -0,0 +1,20 @@ +import { Action } from './index'; +import { PlainReduxAction, ReduxAction } from './redux-action'; +export declare type TabAction = (TabAdd | TabRemove | TabSwitch | TabTitleUpdate); +export declare type TabActionType = TabAction['type']; +export declare const TAB_ACTION_TYPE_INDEX: { + [k in TabActionType]: 1; +}; +export declare function isTabAction(action: Action): action is TabAction; +export declare const TAB_ADD = "TAB_ADD"; +export declare type TabAdd = PlainReduxAction; +export declare const TAB_REMOVE = "TAB_REMOVE"; +export declare type TabRemove = PlainReduxAction; +export declare const TAB_SWITCH = "TAB_SWITCH"; +export declare type TabSwitch = ReduxAction; +export declare const TAB_TITLE_UPDATE = "TAB_TITLE_UPDATE"; +export declare type TabTitleUpdate = ReduxAction; diff --git a/build/actions/tab.js b/build/actions/tab.js new file mode 100644 index 000000000..57e4b6194 --- /dev/null +++ b/build/actions/tab.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TAB_ACTION_TYPE_INDEX = { + TAB_ADD: 1, + TAB_REMOVE: 1, + TAB_SWITCH: 1, + TAB_TITLE_UPDATE: 1 +}; +function isTabAction(action) { + return exports.TAB_ACTION_TYPE_INDEX[action.type]; +} +exports.isTabAction = isTabAction; +exports.TAB_ADD = 'TAB_ADD'; +exports.TAB_REMOVE = 'TAB_REMOVE'; +exports.TAB_SWITCH = 'TAB_SWITCH'; +exports.TAB_TITLE_UPDATE = 'TAB_TITLE_UPDATE'; +//# sourceMappingURL=tab.js.map \ No newline at end of file diff --git a/build/actions/tab.js.map b/build/actions/tab.js.map new file mode 100644 index 000000000..da8dbd8d5 --- /dev/null +++ b/build/actions/tab.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tab.js","sourceRoot":"","sources":["../../src/actions/tab.ts"],"names":[],"mappings":";;AAYa,QAAA,qBAAqB,GAA8B;IAC9D,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,CAAC;CACpB,CAAC;AAEF,qBAA4B,MAAc;IACxC,MAAM,CAAC,6BAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAFD,kCAEC;AAEY,QAAA,OAAO,GAAG,SAAS,CAAC;AAGpB,QAAA,UAAU,GAAG,YAAY,CAAC;AAG1B,QAAA,UAAU,GAAG,YAAY,CAAC;AAK1B,QAAA,gBAAgB,GAAG,kBAAkB,CAAC"} \ No newline at end of file diff --git a/build/actions/undo-redo.d.ts b/build/actions/undo-redo.d.ts new file mode 100644 index 000000000..e6860c67f --- /dev/null +++ b/build/actions/undo-redo.d.ts @@ -0,0 +1,6 @@ +import { PlainReduxAction } from './redux-action'; +export declare type UndoableAction = Undo | Redo; +export declare const UNDO = "UNDO"; +export declare type Undo = PlainReduxAction; +export declare const REDO = "REDO"; +export declare type Redo = PlainReduxAction; diff --git a/build/actions/undo-redo.js b/build/actions/undo-redo.js new file mode 100644 index 000000000..192167e18 --- /dev/null +++ b/build/actions/undo-redo.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UNDO = 'UNDO'; +exports.REDO = 'REDO'; +//# sourceMappingURL=undo-redo.js.map \ No newline at end of file diff --git a/build/actions/undo-redo.js.map b/build/actions/undo-redo.js.map new file mode 100644 index 000000000..aed99fdb6 --- /dev/null +++ b/build/actions/undo-redo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"undo-redo.js","sourceRoot":"","sources":["../../src/actions/undo-redo.ts"],"names":[],"mappings":";;AAIa,QAAA,IAAI,GAAG,MAAM,CAAC;AAGd,QAAA,IAAI,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/build/api/api.d.ts b/build/api/api.d.ts new file mode 100644 index 000000000..1b297d230 --- /dev/null +++ b/build/api/api.d.ts @@ -0,0 +1,18 @@ +/** + * This file stores API for making request to CompassQL (either within the browser or via the server). + */ +import { Query } from 'compassql/build/src/query/query'; +import { Schema } from 'compassql/build/src/schema'; +import 'isomorphic-fetch'; +import { Data, InlineData } from 'vega-lite/build/src/data'; +import { VoyagerConfig } from '../models/config'; +import { ResultPlotWithKey } from '../models/result'; +export { Query, Schema, Data }; +/** + * Submit recommendation query request from CompassQL + */ +export declare function fetchCompassQLRecommend(query: Query, schema: Schema, data: InlineData, config?: VoyagerConfig): Promise; +/** + * Submit schema building request from CompassQL + */ +export declare function fetchCompassQLBuildSchema(data: Array, config?: VoyagerConfig): Promise; diff --git a/build/api/api.js b/build/api/api.js new file mode 100644 index 000000000..80832ca49 --- /dev/null +++ b/build/api/api.js @@ -0,0 +1,72 @@ +"use strict"; +/** + * This file stores API for making request to CompassQL (either within the browser or via the server). + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var recommend_1 = require("compassql/build/src/recommend"); +var schema_1 = require("compassql/build/src/schema"); +exports.Schema = schema_1.Schema; +require("isomorphic-fetch"); +var result_1 = require("../models/result"); +/** + * Submit recommendation query request from CompassQL + */ +function fetchCompassQLRecommend(query, schema, data, config) { + if (config && config.serverUrl) { + var endpoint = "recommend"; + return fetch(config.serverUrl + "/" + endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + credentials: "same-origin", + body: JSON.stringify({ + query: query, + // fieldSchemas are just JSON + schema: schema.fieldSchemas, + data: data + }) + }).then(function (response) { + return response.json(); + }); + } + else { + return new Promise(function (resolve) { + var modelGroup = recommend_1.recommend(query, schema).result; + // TODO: + // - replace this with different cached data source's unique names + // once we have multiple cached data source from Leilani's optimizer engine + resolve(result_1.fromSpecQueryModelGroup(modelGroup, { name: 'source' })); + }); + } +} +exports.fetchCompassQLRecommend = fetchCompassQLRecommend; +/** + * Submit schema building request from CompassQL + */ +function fetchCompassQLBuildSchema(data, config) { + if (config && config.serverUrl) { + var endpoint = "build"; + return fetch(config.serverUrl + "/" + endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + credentials: "same-origin", + body: JSON.stringify({ + data: data + }) + }).then(function (response) { + return response.json(); + }).then(function (fields) { + return new schema_1.Schema({ fields: fields.fields }); + }); + } + else { + return new Promise(function (resolve) { + resolve(schema_1.build(data)); + }); + } +} +exports.fetchCompassQLBuildSchema = fetchCompassQLBuildSchema; +//# sourceMappingURL=api.js.map \ No newline at end of file diff --git a/build/api/api.js.map b/build/api/api.js.map new file mode 100644 index 000000000..933b6b025 --- /dev/null +++ b/build/api/api.js.map @@ -0,0 +1 @@ +{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api/api.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAGH,2DAAwD;AACxD,qDAAwE;AAMzD,iBANe,eAAM,CAMf;AALrB,4BAA0B;AAG1B,2CAA4E;AAI5E;;GAEG;AACH,iCAAwC,KAAY,EAAE,MAAc,EAAE,IAAgB,EAAE,MAAsB;IAG5G,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/B,IAAM,QAAQ,GAAG,WAAW,CAAC;QAE7B,MAAM,CAAC,KAAK,CAAI,MAAM,CAAC,SAAS,SAAI,QAAU,EAAG;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,OAAA;gBACL,6BAA6B;gBAC7B,MAAM,EAAE,MAAM,CAAC,YAAY;gBAC3B,IAAI,MAAA;aACL,CAAC;SACH,CAAC,CAAC,IAAI,CACL,UAAA,QAAQ;YACN,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,CACF,CAAC;IACJ,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,MAAM,CAAC,IAAI,OAAO,CAAC,UAAA,OAAO;YACxB,IAAM,UAAU,GAAG,qBAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC;YAEnD,QAAQ;YACR,kEAAkE;YAClE,2EAA2E;YAC3E,OAAO,CAAC,gCAAuB,CAAC,UAAU,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAjCD,0DAiCC;AAED;;GAEG;AACH,mCAA0C,IAAmB,EAAE,MAAsB;IAGnF,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/B,IAAM,QAAQ,GAAG,OAAO,CAAC;QAEzB,MAAM,CAAC,KAAK,CAAI,MAAM,CAAC,SAAS,SAAI,QAAU,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,IAAI,MAAA;aACL,CAAC;SACH,CAAC,CAAC,IAAI,CACL,UAAA,QAAQ;YACN,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,CACF,CAAC,IAAI,CACJ,UAAA,MAAM;YACJ,MAAM,CAAC,IAAI,eAAM,CAAC,EAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAC,CAAC,CAAC;QAC7C,CAAC,CACF,CAAC;IAEJ,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,MAAM,CAAC,IAAI,OAAO,CAAC,UAAA,OAAO;YACxB,OAAO,CAAC,cAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;AAEH,CAAC;AA/BD,8DA+BC"} \ No newline at end of file diff --git a/build/api/api.test.d.ts b/build/api/api.test.d.ts new file mode 100644 index 000000000..e69de29bb diff --git a/build/api/api.test.js b/build/api/api.test.js new file mode 100644 index 000000000..3ece5dfa6 --- /dev/null +++ b/build/api/api.test.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// tslint:disable-next-line:no-var-requires +var fetchMock = require('fetch-mock'); +var api_1 = require("./api"); +var channel_1 = require("vega-lite/build/src/channel"); +var type_1 = require("vega-lite/build/src/type"); +var schema_1 = require("compassql/build/src/schema"); +describe('api/api', function () { + describe('fetchCompassQLRecommend', function () { + var schema = new schema_1.Schema({ fields: [] }); + var data = { values: [{ a: 1 }] }; + var q = { + spec: { + mark: '?', + encodings: [ + { channel: channel_1.Channel.X, field: '*', type: type_1.Type.QUANTITATIVE } + ] + }, + nest: [ + { groupBy: 'fieldTransform' } + ], + orderBy: 'effectiveness', + }; + it('should return results for local recommend', function () { + expect.assertions(1); + return api_1.fetchCompassQLRecommend(q, schema, data).then(function (result) { + return expect(result.length).toEqual(1); + }); + }); + it('should return results for remote recommend', function () { + fetchMock.postOnce('*', ['1']); + expect.assertions(1); + return api_1.fetchCompassQLRecommend(q, schema, data, { serverUrl: 'http://localhost' }).then(function (result) { + return expect(result.length).toEqual(1); + }); + }); + }); + describe('fetchCompassQLBuildSchema', function () { + var data = []; + it('should return results for local recommend', function () { + expect.assertions(1); + return api_1.fetchCompassQLBuildSchema(data).then(function (result) { + return expect(result.fieldNames().length).toEqual(0); + }); + }); + it('should return results for remote recommend', function () { + fetchMock.postOnce('*', { fields: [] }); + expect.assertions(1); + return api_1.fetchCompassQLBuildSchema(data, { serverUrl: 'http://localhost' }).then(function (result) { + return expect(result.fieldNames().length).toEqual(0); + }); + }); + }); +}); +//# sourceMappingURL=api.test.js.map \ No newline at end of file diff --git a/build/api/api.test.js.map b/build/api/api.test.js.map new file mode 100644 index 000000000..d0f3c42e2 --- /dev/null +++ b/build/api/api.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../src/api/api.test.ts"],"names":[],"mappings":";;AACA,2CAA2C;AAC3C,IAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACxC,6BAAyE;AAEzE,uDAAoD;AACpD,iDAA8C;AAG9C,qDAAkD;AAGlD,QAAQ,CAAC,SAAS,EAAE;IAClB,QAAQ,CAAC,yBAAyB,EAAE;QAClC,IAAM,MAAM,GAAG,IAAI,eAAM,CAAC,EAAC,MAAM,EAAE,EAAE,EAAC,CAAC,CAAC;QACxC,IAAM,IAAI,GAAG,EAAC,MAAM,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC;QAChC,IAAM,CAAC,GAAU;YACf,IAAI,EAAE;gBACJ,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE;oBACT,EAAC,OAAO,EAAE,iBAAO,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,WAAI,CAAC,YAAY,EAAC;iBAC1D;aACF;YACD,IAAI,EAAE;gBACJ,EAAC,OAAO,EAAE,gBAAgB,EAAC;aAC5B;YACD,OAAO,EAAE,eAAe;SACzB,CAAC;QACF,EAAE,CAAC,2CAA2C,EAAE;YAC9C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,6BAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAClD,UAAA,MAAM;gBACJ,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,4CAA4C,EAAE;YAC/C,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAErB,MAAM,CAAC,6BAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAC,SAAS,EAAE,kBAAkB,EAAC,CAAC,CAAC,IAAI,CACnF,UAAA,MAAM;gBACJ,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE;QACpC,IAAM,IAAI,GAAU,EAAE,CAAC;QACvB,EAAE,CAAC,2CAA2C,EAAE;YAC9C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,+BAAyB,CAAC,IAAI,CAAC,CAAC,IAAI,CACzC,UAAA,MAAM;gBACJ,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvD,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,4CAA4C,EAAE;YAC/C,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAC,MAAM,EAAE,EAAE,EAAC,CAAC,CAAC;YACtC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAErB,MAAM,CAAC,+BAAyB,CAAC,IAAI,EAAE,EAAC,SAAS,EAAE,kBAAkB,EAAC,CAAC,CAAC,IAAI,CAC1E,UAAA,MAAM;gBACJ,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvD,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/app-root/index.d.ts b/build/components/app-root/index.d.ts new file mode 100644 index 000000000..0778d3112 --- /dev/null +++ b/build/components/app-root/index.d.ts @@ -0,0 +1,10 @@ +/// +import * as React from 'react'; +import { VoyagerConfig } from '../../models/config'; +import { Dataset } from '../../models/dataset'; +import '../app.scss'; +export interface AppRootProps { + dataset: Dataset; + config: VoyagerConfig; +} +export declare const AppRoot: React.ComponentClass<{}>; diff --git a/build/components/app-root/index.js b/build/components/app-root/index.js new file mode 100644 index 000000000..c890fbab5 --- /dev/null +++ b/build/components/app-root/index.js @@ -0,0 +1,69 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var react_dnd_1 = require("react-dnd"); +var react_dnd_html5_backend_1 = require("react-dnd-html5-backend"); +var react_redux_1 = require("react-redux"); +var react_spinners_1 = require("react-spinners"); +var SplitPane = require("react-split-pane"); +var constants_1 = require("../../constants"); +var selectors_1 = require("../../selectors"); +var dataset_1 = require("../../selectors/dataset"); +require("../app.scss"); +var index_1 = require("../data-pane/index"); +var index_2 = require("../encoding-pane/index"); +var index_3 = require("../footer/index"); +var index_4 = require("../header/index"); +var index_5 = require("../load-data-pane/index"); +var index_6 = require("../log-pane/index"); +var index_7 = require("../view-pane/index"); +var AppRootBase = (function (_super) { + __extends(AppRootBase, _super); + function AppRootBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + AppRootBase.prototype.render = function () { + var _a = this.props, dataset = _a.dataset, config = _a.config; + var hideHeader = config.hideHeader, hideFooter = config.hideFooter; + var bottomPane, footer; + if (!dataset.isLoading) { + if (!dataset.data) { + bottomPane = React.createElement(index_5.LoadData, null); + } + else { + bottomPane = (React.createElement(SplitPane, { split: "vertical", defaultSize: 200, minSize: 175, maxSize: 350 }, + React.createElement(index_1.DataPane, null), + React.createElement(SplitPane, { split: "vertical", defaultSize: 235, minSize: 200, maxSize: 350 }, + React.createElement(index_2.EncodingPane, null), + React.createElement(index_7.ViewPane, null)))); + if (!hideFooter) { + footer = React.createElement(index_3.Footer, null); + } + } + } + return (React.createElement("div", { className: "voyager" }, + React.createElement(index_6.LogPane, null), + !hideHeader && React.createElement(index_4.Header, null), + React.createElement(react_spinners_1.ClipLoader, { color: constants_1.SPINNER_COLOR, loading: dataset.isLoading }), + bottomPane, + footer)); + }; + return AppRootBase; +}(React.PureComponent)); +exports.AppRoot = react_redux_1.connect(function (state) { + return { + dataset: dataset_1.selectDataset(state), + config: selectors_1.selectConfig(state) + }; +})(react_dnd_1.DragDropContext(react_dnd_html5_backend_1.default)(AppRootBase)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/app-root/index.js.map b/build/components/app-root/index.js.map new file mode 100644 index 000000000..7dd7f388c --- /dev/null +++ b/build/components/app-root/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/app-root/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,6BAA+B;AAC/B,uCAA0C;AAC1C,mEAAmD;AACnD,2CAAoC;AACpC,iDAA0C;AAC1C,4CAA8C;AAC9C,6CAA8C;AAI9C,6CAA6C;AAC7C,mDAAsD;AACtD,uBAAqB;AACrB,4CAA4C;AAC5C,gDAAoD;AACpD,yCAAuC;AACvC,yCAAuC;AACvC,iDAAiD;AACjD,2CAA0C;AAC1C,4CAA4C;AAO5C;IAA0B,+BAAqC;IAA/D;;IAiCA,CAAC;IAhCQ,4BAAM,GAAb;QACQ,IAAA,eAA8B,EAA7B,oBAAO,EAAE,kBAAM,CAAe;QAC9B,IAAA,8BAAU,EAAE,8BAAU,CAAW;QACxC,IAAI,UAAU,EAAE,MAAM,CAAC;QACvB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACvB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClB,UAAU,GAAG,oBAAC,gBAAQ,OAAE,CAAC;YAC3B,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,UAAU,GAAG,CACX,oBAAC,SAAS,IAAC,KAAK,EAAC,UAAU,EAAC,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG;oBACtE,oBAAC,gBAAQ,OAAE;oBACX,oBAAC,SAAS,IAAC,KAAK,EAAC,UAAU,EAAC,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG;wBACtE,oBAAC,oBAAY,OAAE;wBACf,oBAAC,gBAAQ,OAAE,CACD,CACF,CACb,CAAC;gBACF,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,GAAG,oBAAC,cAAM,OAAE,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,SAAS;YACtB,oBAAC,eAAO,OAAE;YACT,CAAC,UAAU,IAAI,oBAAC,cAAM,OAAE;YACzB,oBAAC,2BAAU,IAAC,KAAK,EAAE,yBAAa,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,GAAG;YAC9D,UAAU;YACV,MAAM,CACH,CACP,CAAC;IACJ,CAAC;IACH,kBAAC;AAAD,CAAC,AAjCD,CAA0B,KAAK,CAAC,aAAa,GAiC5C;AAEY,QAAA,OAAO,GAAG,qBAAO,CAC5B,UAAC,KAAY;IACX,MAAM,CAAC;QACL,OAAO,EAAE,uBAAa,CAAC,KAAK,CAAC;QAC7B,MAAM,EAAE,wBAAY,CAAC,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC,CACF,CAAC,2BAAe,CAAC,iCAAY,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/app.d.ts b/build/components/app.d.ts new file mode 100644 index 000000000..92d130dcb --- /dev/null +++ b/build/components/app.d.ts @@ -0,0 +1,27 @@ +/// +import * as React from 'react'; +import { Dispatch } from 'redux'; +import { Data } from 'vega-lite/build/src/data'; +import { FacetedCompositeUnitSpec, TopLevel } from 'vega-lite/build/src/spec'; +import { VoyagerConfig } from '../models/config'; +import { State } from '../models/index'; +export interface Props extends React.Props { + config?: VoyagerConfig; + data?: Data; + applicationState?: Readonly; + spec?: TopLevel; + filename?: string; + dispatch: Dispatch; +} +export declare class App extends React.PureComponent { + constructor(props: any); + componentWillUpdate(nextProps: Props): void; + componentWillMount(): void; + render(): JSX.Element; + private update(nextProps); + private setData(data, filename); + private setConfig(config); + private setSpec(spec, filename); + private shelfSpecLoad(spec); + private setApplicationState(state); +} diff --git a/build/components/app.js b/build/components/app.js new file mode 100644 index 000000000..fd62a129a --- /dev/null +++ b/build/components/app.js @@ -0,0 +1,98 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var redux_undo_1 = require("redux-undo"); +var actions_1 = require("../actions"); +var shelf_1 = require("../actions/shelf"); +var app_root_1 = require("./app-root"); +var App = (function (_super) { + __extends(App, _super); + function App(props) { + return _super.call(this, props) || this; + } + App.prototype.componentWillUpdate = function (nextProps) { + this.update(nextProps); + }; + App.prototype.componentWillMount = function () { + // Clear history as redux-undo seems to always put the first action after + // an init into the history. This ensures we start with a fresh history once + // the app is about to start. + this.props.dispatch(redux_undo_1.ActionCreators.clearHistory()); + this.update(this.props); + }; + App.prototype.render = function () { + return React.createElement(app_root_1.AppRoot, null); + }; + App.prototype.update = function (nextProps) { + var data = nextProps.data, config = nextProps.config, applicationState = nextProps.applicationState, dispatch = nextProps.dispatch, spec = nextProps.spec, filename = nextProps.filename; + if (data) { + this.setData(data, filename); + } + if (config) { + this.setConfig(config); + } + if (spec) { + // Note that this will overwrite other passed in props + this.setSpec(spec, filename); + } + if (applicationState) { + // Note that this will overwrite other passed in props + this.setApplicationState(applicationState); + } + }; + App.prototype.setData = function (data, filename) { + return this.props.dispatch(actions_1.datasetLoad(filename, data)); + }; + App.prototype.setConfig = function (config) { + this.props.dispatch({ + type: actions_1.SET_CONFIG, + payload: { + config: config, + } + }); + }; + App.prototype.setSpec = function (spec, filename) { + var _this = this; + if (spec.data) { + this.setData(spec.data, filename) + .then(function () { + _this.shelfSpecLoad(spec); + }, function (err) { + throw new Error('error setting data for spec:' + err.toString()); + }); + } + else { + this.shelfSpecLoad(spec); + } + }; + App.prototype.shelfSpecLoad = function (spec) { + this.props.dispatch({ + type: shelf_1.SPEC_LOAD, + payload: { + spec: spec, + keepWildcardMark: false + } + }); + }; + App.prototype.setApplicationState = function (state) { + this.props.dispatch({ + type: actions_1.SET_APPLICATION_STATE, + payload: { + state: state, + } + }); + }; + return App; +}(React.PureComponent)); +exports.App = App; +//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/build/components/app.js.map b/build/components/app.js.map new file mode 100644 index 000000000..47762da2b --- /dev/null +++ b/build/components/app.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/components/app.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/app.scss b/build/components/app.scss new file mode 100644 index 000000000..c7ceaba44 --- /dev/null +++ b/build/components/app.scss @@ -0,0 +1,218 @@ +@import 'normalize/import-now'; + +/* prevent element from being selected http://stackoverflow.com/questions/826782 */ +:global .noselect { + user-select: none; + cursor: default; +} + +:global .voyager { + font-size: 12px; + margin: 0; + padding: 0; + background-color: #E2E9F3; + height: inherit; + + display: flex; + flex-direction: column; + + // We need to override the position: absolute in the split pane component + // See https://github.com/tomkp/react-split-pane/issues/23 + .SplitPane { + position: relative !important; + } + + .right { + float: right; + } + + .hidden { + visibility: hidden; + } + + h1 { + @extend .noselect; + font-size: 24px; + line-height:36px; + font-weight: 700; + margin: 0; + } + + h2 { + @extend .noselect; + font-size: 16px; + line-height: 20px; + font-weight: 700; + margin: 0 0 10px; + color: #38425d; + } + + h3 { + @extend .noselect; + font-size: 14px; + font-weight: 700; + margin: 0 0 6px; + color: #38425d; + } + + h4 { + font-size: 12px; + margin: 0 0 6px; + } + + .modal-header { + background-color: #f1f4f9; + flex-shrink: 0; + margin: 3px 3px 0 0; + padding: 8px; + margin-top: 0; + margin-right: 0; + } + + .pane { + padding: 8px; + } + + .persist-scroll{ + /* + Prevent scroll bars from being hidden for OS X. + http://stackoverflow.com/questions/7855590/how-can-i-prevent-scroll-bars-from-being-hidden-for-os-x-trackpad-users-in-webkit + */ + &::-webkit-scrollbar { + -webkit-appearance: none; + } + + &::-webkit-scrollbar:vertical { + width: 11px; + } + + &::-webkit-scrollbar:horizontal { + height: 11px; + } + + &::-webkit-scrollbar-thumb { + border-radius: 8px; + border: 2px solid white; /* should match background, can't be transparent */ + background-color: rgba(0, 0, 0, .5); + } + + &::-webkit-scrollbar-track { + background-color: transparent; + border-radius: 8px; + } + } + + div, span { + user-select: none; + } + + // FontAwesome icon buttons + .fa { + &.fa-times, &.fa-search, &.fa-pencil, &.fa-caret-down, &.fa-times , &.fa-plus, &.fa-filter { + padding: 2px 3px 1px; + border-radius: 3px; + + &:hover { + color: #fff; + background-color: #999; + } + } + } + + .react-spinners--clip { + margin: auto; + } + + .chart > canvas, .chart > svg { + margin: auto; // center the plot + display: block; + } + + .chart { + margin: auto; + } + + // split-pane css + .Resizer { + opacity: .2; + z-index: 1; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -moz-background-clip: padding; + -webkit-background-clip: padding; + background-clip: padding-box; +} + + .Resizer:hover { + -webkit-transition: all 2s ease; + transition: all 2s ease; +} + + .Resizer.horizontal { + height: 11px; + margin: -5px 0; + border-top: 5px solid rgba(255, 255, 255, 0); + border-bottom: 5px solid rgba(255, 255, 255, 0); + cursor: row-resize; + width: 100%; +} + +.Resizer.horizontal:hover { + border-top: 5px solid rgba(0, 0, 0, 0); + border-bottom: 5px solid rgba(0, 0, 0, 0); +} + +.Resizer.vertical { + width: 11px; + margin: 0 -5px; + border-left: 5px solid rgba(255, 255, 255, 0); + border-right: 5px solid rgba(255, 255, 255, 0); + cursor: col-resize; +} + +.Resizer.vertical:hover { + overflow-y:hidden; + border-left: 5px solid rgba(0, 0, 0, 0); + border-right: 5px solid rgba(0, 0, 0, 0); +} +.Resizer.disabled { + cursor: not-allowed; +} + +.Resizer.disabled:hover { + border-color: transparent; +} + +:global .vg-tooltip { + visibility: hidden; + padding: 6px; + border-radius: 3px; + position: fixed; + z-index: 2000; + font-family: sans-serif; + font-size: 11px; + + /* The default look of the tooltip is the same as .light-theme + but it can be overwritten by .dark-theme */ + background-color: rgba(255, 255, 255, 0.9); + border: 1px solid #d9d9d9; + color: black; + } + + :global .key { + overflow: hidden; + text-overflow: ellipsis; + color: #808080; + max-width: 150px; + text-align: right; + padding-right: 1px; + } + + :global .value { + overflow: hidden; + text-overflow: ellipsis; + max-width: 200px; + text-align: left; + } +} \ No newline at end of file diff --git a/build/components/app.test.ui.d.ts b/build/components/app.test.ui.d.ts new file mode 100644 index 000000000..e69de29bb diff --git a/build/components/app.test.ui.js b/build/components/app.test.ui.js new file mode 100644 index 000000000..8ebe5d745 --- /dev/null +++ b/build/components/app.test.ui.js @@ -0,0 +1,123 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * @jest-environment jsdom + */ +var enzyme_1 = require("enzyme"); +var React = require("react"); +var react_redux_1 = require("react-redux"); +var store_1 = require("../store"); +var app_1 = require("./app"); +var DEFAULT_TIMEOUT_LENGTH = 300; +describe('Voyager', function () { + describe('instantiation via component', function () { + it('renders voyager', function (done) { + var config = {}; + var data = undefined; + var store = store_1.configureStore(); + setTimeout(function () { + try { + var wrapper = enzyme_1.mount(React.createElement(react_redux_1.Provider, { store: store }, + React.createElement(app_1.App, { config: config, data: data, dispatch: store.dispatch }))); + var dataPaneHeader = wrapper.find('.load-data-pane__load-data-pane'); + expect(dataPaneHeader.exists()); + expect(dataPaneHeader.text()).toContain('Please load a dataset'); + } + catch (err) { + done.fail(err); + } + done(); + }, DEFAULT_TIMEOUT_LENGTH); + }); + it('renders voyager with custom data', function (done) { + var config = {}; + var data = { + "values": [ + { "fieldA": "A", "fieldB": 28 }, { "fieldA": "B", "fieldB": 55 }, { "fieldA": "C", "fieldB": 43 }, + { "fieldA": "D", "fieldB": 91 }, { "fieldA": "E", "fieldB": 81 }, { "fieldA": "F", "fieldB": 53 }, + { "fieldA": "G", "fieldB": 19 }, { "fieldA": "H", "fieldB": 87 }, { "fieldA": "I", "fieldB": 52 } + ] + }; + var store = store_1.configureStore(); + setTimeout(function () { + try { + var wrapper_1 = enzyme_1.mount(React.createElement(react_redux_1.Provider, { store: store }, + React.createElement(app_1.App, { config: config, data: data, dispatch: store.dispatch }))); + setTimeout(function () { + try { + var fieldList = wrapper_1.find('.field-list__field-list-item'); + var fields = fieldList.children().map(function (d) { return d.text(); }); + expect(fields).toContain(' fieldA'); + expect(fields).toContain(' fieldB'); + done(); + } + catch (err) { + done.fail(err); + } + }, DEFAULT_TIMEOUT_LENGTH); + } + catch (err) { + done.fail(err); + } + }, DEFAULT_TIMEOUT_LENGTH); + }); + }); + describe('vega-lite spec', function () { + it('accepts valid spec', function (done) { + var config = {}; + var store = store_1.configureStore(); + var values = [ + { date: "24-Apr-07", close: "93.24" }, + { date: "25-Apr-07", close: "95.35" }, + { date: "26-Apr-07", close: "98.84" }, + { date: "27-Apr-07", close: "99.92" }, + ]; + var data = { values: values }; + var spec = { + "$schema": "https://vega.github.io/schema/vega-lite/v2.json", + "data": { + "values": [ + { "date": "24-Apr-07", "close": "93.24" }, + { "date": "25-Apr-07", "close": "95.35" }, + { "date": "26-Apr-07", "close": "98.84" }, + { "date": "27-Apr-07", "close": "99.92" } + ] + }, + "mark": "bar", + "encoding": { + "x": { + "bin": true, + "field": "close", + "type": "quantitative" + }, + "y": { + "aggregate": "count", + "field": "*", + "type": "quantitative" + } + } + }; + setTimeout(function () { + try { + var wrapper_2 = enzyme_1.mount(React.createElement(react_redux_1.Provider, { store: store }, + React.createElement(app_1.App, { config: config, data: data, dispatch: store.dispatch, spec: spec }))); + setTimeout(function () { + try { + var fieldList = wrapper_2.find('.encoding-shelf__encoding-shelf'); + var fields = fieldList.map(function (d) { return d.text(); }); + expect(fields).toContain('x binclose'); + done(); + } + catch (err) { + done.fail(err); + } + }, DEFAULT_TIMEOUT_LENGTH); + } + catch (err) { + done.fail(err); + } + }, DEFAULT_TIMEOUT_LENGTH); + }); + }); +}); +//# sourceMappingURL=app.test.ui.js.map \ No newline at end of file diff --git a/build/components/app.test.ui.js.map b/build/components/app.test.ui.js.map new file mode 100644 index 000000000..e42852222 --- /dev/null +++ b/build/components/app.test.ui.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.test.ui.js","sourceRoot":"","sources":["../../src/components/app.test.ui.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/bookmark/bookmark.scss b/build/components/bookmark/bookmark.scss new file mode 100644 index 000000000..f76389ef1 --- /dev/null +++ b/build/components/bookmark/bookmark.scss @@ -0,0 +1,35 @@ +.modal { + display: flex; + margin: 50px auto; + width: calc( 100% - 100px); + padding: 6px; + background-color: #E2E9F3; + border: 1px solid #aaa; + border-radius: 3px; + box-sizing: border-box; + display: flex; + box-orient: vertical; + box-direction: normal; + flex-direction: column; + box-align: stretch; + align-items: stretch; + max-width: 800px; + max-height: calc(100% - 100px); + overflow: scroll; +} + +.vis-list-empty, { + height: 60px; + line-height: 60px; + vertical-align: middle; + text-align: center; + font-size: 1.2em; +} + +a:hover { + cursor: pointer; +} + +.bookmark-list-util { + margin-right: 10px; +} diff --git a/build/components/bookmark/index.d.ts b/build/components/bookmark/index.d.ts new file mode 100644 index 000000000..3adf88531 --- /dev/null +++ b/build/components/bookmark/index.d.ts @@ -0,0 +1,20 @@ +/// +import * as React from 'react'; +import { InlineData } from 'vega-lite/build/src/data'; +import { BookmarkAction } from '../../actions/bookmark'; +import { ActionHandler } from '../../actions/redux-action'; +import { Bookmark } from '../../models/bookmark'; +export interface BookmarkProps extends ActionHandler { + bookmark: Bookmark; + data: InlineData; +} +export declare class BookmarkBase extends React.PureComponent { + constructor(props: BookmarkProps); + render(): JSX.Element; + private onExport(); + private onClearAll(); + private openModal(); + private closeModal(); + private renderBookmarks(bookmark); +} +export declare const BookmarkPane: React.ComponentClass<{}>; diff --git a/build/components/bookmark/index.js b/build/components/bookmark/index.js new file mode 100644 index 000000000..bcd49d245 --- /dev/null +++ b/build/components/bookmark/index.js @@ -0,0 +1,111 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_modal_1 = require("react-modal"); +var react_redux_1 = require("react-redux"); +var bookmark_1 = require("../../actions/bookmark"); +var redux_action_1 = require("../../actions/redux-action"); +var dataset_1 = require("../../selectors/dataset"); +var index_1 = require("../../selectors/index"); +var plot_1 = require("../plot"); +var styles = require("./bookmark.scss"); +var BookmarkBase = (function (_super) { + __extends(BookmarkBase, _super); + function BookmarkBase(props) { + var _this = _super.call(this, props) || this; + _this.state = { modalIsOpen: false }; + _this.openModal = _this.openModal.bind(_this); + _this.closeModal = _this.closeModal.bind(_this); + _this.onClearAll = _this.onClearAll.bind(_this); + _this.onExport = _this.onExport.bind(_this); + return _this; + } + BookmarkBase.prototype.render = function () { + return (React.createElement("div", null, + React.createElement("button", { onClick: this.openModal }, + React.createElement("i", { className: "fa fa-bookmark" }), + " Bookmarks (", + this.props.bookmark.count, + ")"), + React.createElement(react_modal_1.default, { isOpen: this.state.modalIsOpen, onRequestClose: this.closeModal, contentLabel: "Bookmark Selector", styleName: "modal", className: "voyager" }, + React.createElement("div", { className: "modal-header" }, + React.createElement("a", { className: "right", onClick: this.closeModal }, "Close"), + React.createElement("h3", null, + "Bookmarks (", + this.props.bookmark.count, + ")"), + React.createElement("a", { styleName: "bookmark-list-util", onClick: this.onClearAll }, + React.createElement("i", { className: "fa fa-trash-o" }), + ' ', + "Clear all"), + React.createElement("a", { styleName: "bookmark-list-util", onClick: this.onExport }, + React.createElement("i", { className: "fa fa-clipboard" }), + ' ', + "Export")), + this.renderBookmarks(this.props.bookmark)))); + }; + BookmarkBase.prototype.onExport = function () { + var bookmark = this.props.bookmark; + var specs = []; + for (var _i = 0, _a = bookmark.list; _i < _a.length; _i++) { + var specKey = _a[_i]; + var bookmarkItem = bookmark.dict[specKey]; + specs.push(__assign({}, bookmarkItem.plot.spec, { description: bookmarkItem.note })); + } + var exportWindow = window.open(); + exportWindow.document.write("
" +
+            JSON.stringify(specs, null, 2) +
+            "
"); + exportWindow.document.close(); + }; + BookmarkBase.prototype.onClearAll = function () { + this.props.handleAction({ type: bookmark_1.BOOKMARK_CLEAR_ALL }); + }; + BookmarkBase.prototype.openModal = function () { + this.setState({ modalIsOpen: true }); + }; + BookmarkBase.prototype.closeModal = function () { + this.setState({ modalIsOpen: false }); + }; + BookmarkBase.prototype.renderBookmarks = function (bookmark) { + var _this = this; + var data = this.props.data; + var plots = bookmark.list.map(function (key) { return bookmark.dict[key].plot; }); + var bookmarkPlotListItems = plots.map(function (plot, index) { + var spec = plot.spec, fieldInfos = plot.fieldInfos; + return (React.createElement(plot_1.Plot, { bookmark: _this.props.bookmark, closeModal: _this.closeModal.bind(_this), data: data, filters: [], key: index, fieldInfos: fieldInfos, handleAction: _this.props.handleAction, isPlotListItem: true, showBookmarkButton: true, showSpecifyButton: true, spec: spec })); + }); + return (React.createElement("div", null, (bookmarkPlotListItems.length > 0) ? + bookmarkPlotListItems : + React.createElement("div", { styleName: "vis-list-empty" }, "You have no bookmarks"))); + }; + return BookmarkBase; +}(React.PureComponent)); +exports.BookmarkBase = BookmarkBase; +var BookmarkRenderer = CSSModules(BookmarkBase, styles); +exports.BookmarkPane = react_redux_1.connect(function (state) { + return { + bookmark: index_1.selectBookmark(state), + data: dataset_1.selectData(state) + }; +}, redux_action_1.createDispatchHandler())(BookmarkRenderer); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/bookmark/index.js.map b/build/components/bookmark/index.js.map new file mode 100644 index 000000000..15c0faf88 --- /dev/null +++ b/build/components/bookmark/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/bookmark/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/data-pane/data-pane.scss b/build/components/data-pane/data-pane.scss new file mode 100644 index 000000000..b005c8bf8 --- /dev/null +++ b/build/components/data-pane/data-pane.scss @@ -0,0 +1,16 @@ +.data-pane { + background-color: #38425D; + height: 100%; + + .current-dataset { + color: white; + } + + .data-pane-section { + margin-top: 16px; + } + + h2.data-pane-title, .data-pane-section h3 { + color: white; + } +} diff --git a/build/components/data-pane/field-list.d.ts b/build/components/data-pane/field-list.d.ts new file mode 100644 index 000000000..26678fb78 --- /dev/null +++ b/build/components/data-pane/field-list.d.ts @@ -0,0 +1,16 @@ +/// +import { Schema } from 'compassql/build/src/schema'; +import * as React from 'react'; +import { OneOfFilter, RangeFilter } from 'vega-lite/build/src/filter'; +import { FilterAction } from '../../actions'; +import { DatasetSchemaChangeFieldType } from '../../actions/dataset'; +import { ActionHandler } from '../../actions/redux-action'; +import { SpecFieldAutoAdd } from '../../actions/shelf'; +import { ShelfFieldDef } from '../../models/shelf'; +export interface FieldListProps extends ActionHandler { + fieldDefs: ShelfFieldDef[]; + schema: Schema; + filters: Array; +} +export declare const FieldList: React.ComponentClass<{}>; +export declare const PresetWildcardFieldList: React.ComponentClass<{}>; diff --git a/build/components/data-pane/field-list.js b/build/components/data-pane/field-list.js new file mode 100644 index 000000000..1ad529328 --- /dev/null +++ b/build/components/data-pane/field-list.js @@ -0,0 +1,134 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var expandedtype_1 = require("compassql/build/src/query/expandedtype"); +var schema_1 = require("compassql/build/src/schema"); +var wildcard_1 = require("compassql/build/src/wildcard"); +var stringify = require("json-stable-stringify"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var redux_action_1 = require("../../actions/redux-action"); +var shelf_1 = require("../../actions/shelf"); +var filter_1 = require("../../actions/shelf/filter"); +var constants_1 = require("../../constants"); +var filter_2 = require("../../models/shelf/filter"); +var selectors_1 = require("../../selectors"); +var shelf_2 = require("../../selectors/shelf"); +var field_1 = require("../field"); +var styles = require("./field-list.scss"); +var type_changer_1 = require("./type-changer"); +var FieldListBase = (function (_super) { + __extends(FieldListBase, _super); + function FieldListBase(props) { + var _this = _super.call(this, props) || this; + // Bind - https://facebook.github.io/react/docs/handling-events.html + _this.onAdd = _this.onAdd.bind(_this); + _this.onFilterToggle = _this.onFilterToggle.bind(_this); + return _this; + } + FieldListBase.prototype.render = function () { + var _this = this; + var _a = this.props, fieldDefs = _a.fieldDefs, schema = _a.schema; + var fieldItems = fieldDefs.map(function (fieldDef) { + var primitiveType; + if (!wildcard_1.isWildcard(fieldDef.field)) { + primitiveType = schema.primitiveType(fieldDef.field); + } + var hideTypeChanger = _this.getValidTypes(primitiveType).length < 2; + var key = wildcard_1.isWildcard(fieldDef.field) ? stringify(fieldDef) : fieldDef.field; + return (React.createElement("div", { key: key, styleName: "field-list-item" }, _this.renderComponent(fieldDef, hideTypeChanger, primitiveType))); + }); + return (React.createElement("div", { styleName: 'field-list' }, fieldItems)); + }; + FieldListBase.prototype.onAdd = function (fieldDef) { + var handleAction = this.props.handleAction; + handleAction({ + type: shelf_1.SPEC_FIELD_AUTO_ADD, + payload: { fieldDef: fieldDef } + }); + }; + FieldListBase.prototype.onFilterToggle = function (fieldDef) { + var handleAction = this.props.handleAction; + handleAction({ + type: filter_1.FILTER_TOGGLE, + payload: { + filter: this.getFilter(fieldDef) + } + }); + }; + FieldListBase.prototype.getFilter = function (fieldDef) { + var schema = this.props.schema; + if (wildcard_1.isWildcard(fieldDef.field)) { + return; + } + var domain = schema.domain({ field: fieldDef.field }); + return filter_2.createDefaultFilter(fieldDef, domain); + }; + FieldListBase.prototype.renderComponent = function (fieldDef, hideTypeChanger, primitiveType) { + if (hideTypeChanger) { + return this.renderField(fieldDef); + } + else { + var popupComponent = this.renderTypeChanger(fieldDef, primitiveType); + return this.renderField(fieldDef, popupComponent); + } + }; + FieldListBase.prototype.renderTypeChanger = function (fieldDef, primitiveType) { + var handleAction = this.props.handleAction; + if (!wildcard_1.isWildcard(fieldDef.field)) { + return (React.createElement(type_changer_1.TypeChanger, { field: fieldDef.field, type: fieldDef.type, validTypes: this.getValidTypes(primitiveType), handleAction: handleAction })); + } + }; + FieldListBase.prototype.renderField = function (fieldDef, popupComponent) { + var _a = this.props, schema = _a.schema, filters = _a.filters; + var filter = { + active: !wildcard_1.isWildcard(fieldDef.field) && filter_2.filterHasField(filters, fieldDef.field), + onToggle: this.onFilterToggle + }; + return (React.createElement(field_1.Field, { fieldDef: fieldDef, isPill: true, draggable: true, filter: filter, parentId: { type: constants_1.FieldParentType.FIELD_LIST }, caretShow: true, popupComponent: popupComponent, onDoubleClick: this.onAdd, onAdd: this.onAdd, schema: schema })); + }; + FieldListBase.prototype.getValidTypes = function (primitiveType) { + switch (primitiveType) { + case schema_1.PrimitiveType.NUMBER: + return [expandedtype_1.ExpandedType.QUANTITATIVE, expandedtype_1.ExpandedType.NOMINAL]; + case schema_1.PrimitiveType.INTEGER: + return [expandedtype_1.ExpandedType.QUANTITATIVE, expandedtype_1.ExpandedType.NOMINAL]; + case schema_1.PrimitiveType.DATETIME: + return [expandedtype_1.ExpandedType.TEMPORAL]; + case schema_1.PrimitiveType.STRING: + return [expandedtype_1.ExpandedType.NOMINAL]; + case schema_1.PrimitiveType.BOOLEAN: + return [expandedtype_1.ExpandedType.NOMINAL]; + default: + return []; + } + }; + return FieldListBase; +}(React.PureComponent)); +var FieldListRenderer = CSSModules(FieldListBase, styles); +exports.FieldList = react_redux_1.connect(function (state) { + return { + fieldDefs: selectors_1.selectSchemaFieldDefs(state).concat([ + { fn: 'count', field: '*', type: 'quantitative' } + ]), + schema: selectors_1.selectSchema(state), + filters: shelf_2.selectFilters(state) + }; +}, redux_action_1.createDispatchHandler())(FieldListRenderer); +exports.PresetWildcardFieldList = react_redux_1.connect(function (state) { + return { + fieldDefs: selectors_1.selectPresetWildcardFields(state), + schema: selectors_1.selectSchema(state) + }; +}, redux_action_1.createDispatchHandler())(FieldListRenderer); +//# sourceMappingURL=field-list.js.map \ No newline at end of file diff --git a/build/components/data-pane/field-list.js.map b/build/components/data-pane/field-list.js.map new file mode 100644 index 000000000..9c8d5b43c --- /dev/null +++ b/build/components/data-pane/field-list.js.map @@ -0,0 +1 @@ +{"version":3,"file":"field-list.js","sourceRoot":"","sources":["../../../src/components/data-pane/field-list.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/data-pane/field-list.scss b/build/components/data-pane/field-list.scss new file mode 100644 index 000000000..1aee32433 --- /dev/null +++ b/build/components/data-pane/field-list.scss @@ -0,0 +1,8 @@ +.field-list { + max-height: calc(50vh); + overflow-y: auto; +} + +.field-list-item { + margin-bottom: 4px; +} diff --git a/build/components/data-pane/index.d.ts b/build/components/data-pane/index.d.ts new file mode 100644 index 000000000..b56a0180d --- /dev/null +++ b/build/components/data-pane/index.d.ts @@ -0,0 +1,12 @@ +/// +import * as React from 'react'; +import { Dataset } from '../../models'; +import { VoyagerConfig } from '../../models/config'; +export interface DataPanelProps { + data: Dataset; + config: VoyagerConfig; +} +export declare class DataPaneBase extends React.PureComponent { + render(): JSX.Element; +} +export declare const DataPane: React.ComponentClass<{}>; diff --git a/build/components/data-pane/index.js b/build/components/data-pane/index.js new file mode 100644 index 000000000..fc91cfa37 --- /dev/null +++ b/build/components/data-pane/index.js @@ -0,0 +1,55 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var _1 = require("../../selectors/"); +var data_selector_1 = require("../data-selector"); +var styles = require("./data-pane.scss"); +var field_list_1 = require("./field-list"); +var DataPaneBase = (function (_super) { + __extends(DataPaneBase, _super); + function DataPaneBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + DataPaneBase.prototype.render = function () { + var name = this.props.data.name; + var fieldCount = this.props.data.schema.fieldSchemas.length; + var _a = this.props.config, showDataSourceSelector = _a.showDataSourceSelector, wildcards = _a.wildcards; + var fields = fieldCount > 0 ? (React.createElement("div", { styleName: "data-pane-section" }, + React.createElement("h3", null, "Fields"), + React.createElement(field_list_1.FieldList, null))) : null; + var wildcardFields = wildcards !== 'disabled' && fieldCount > 0 && (React.createElement("div", { styleName: "data-pane-section" }, + React.createElement("h3", null, "Wildcard Fields"), + React.createElement(field_list_1.PresetWildcardFieldList, null))); + return (React.createElement("div", { className: "pane", styleName: "data-pane" }, + React.createElement("h2", { styleName: "data-pane-title" }, "Data"), + React.createElement("div", null, + React.createElement("span", { styleName: "current-dataset" }, + React.createElement("i", { className: "fa fa-database" }), + ' ', + name), + React.createElement("span", { className: "right" }, showDataSourceSelector ? React.createElement(data_selector_1.DataSelector, { title: "Change" }) : null)), + fields, + wildcardFields)); + }; + return DataPaneBase; +}(React.PureComponent)); +exports.DataPaneBase = DataPaneBase; +exports.DataPane = react_redux_1.connect(function (state) { + return { + data: _1.selectDataset(state), + config: _1.selectConfig(state) + }; +})(CSSModules(DataPaneBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/data-pane/index.js.map b/build/components/data-pane/index.js.map new file mode 100644 index 000000000..d9195fe3e --- /dev/null +++ b/build/components/data-pane/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/data-pane/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,8CAAgD;AAChD,2CAAoC;AAGpC,qCAA6D;AAC7D,kDAA8C;AAC9C,yCAA2C;AAC3C,2CAAgE;AAOhE;IAAkC,gCAAuC;IAAzE;;IAoCA,CAAC;IAnCQ,6BAAM,GAAb;QACS,IAAA,2BAAI,CAAoB;QAC/B,IAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;QACxD,IAAA,sBAAuD,EAAtD,kDAAsB,EAAE,wBAAS,CAAsB;QAE9D,IAAM,MAAM,GAAG,UAAU,GAAG,CAAC,GAAG,CAC9B,6BAAK,SAAS,EAAC,mBAAmB;YAChC,yCAAe;YACf,oBAAC,sBAAS,OAAE,CACR,CAAC,GAAG,IAAI,CAAC;QAEjB,IAAM,cAAc,GAAG,SAAS,KAAK,UAAU,IAAI,UAAU,GAAG,CAAC,IAAI,CACnE,6BAAK,SAAS,EAAC,mBAAmB;YAChC,kDAAwB;YACxB,oBAAC,oCAAuB,OAAE,CACtB,CACP,CAAC;QACF,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,MAAM,EAAC,SAAS,EAAC,WAAW;YACzC,4BAAI,SAAS,EAAC,iBAAiB,WAAU;YACzC;gBACE,8BAAM,SAAS,EAAC,iBAAiB;oBAC/B,2BAAG,SAAS,EAAC,gBAAgB,GAAE;oBAC9B,GAAG;oBACH,IAAI,CACA;gBACP,8BAAM,SAAS,EAAC,OAAO,IACpB,sBAAsB,GAAG,oBAAC,4BAAY,IAAC,KAAK,EAAC,QAAQ,GAAE,GAAG,IAAI,CAC1D,CACH;YACL,MAAM;YACN,cAAc,CACX,CACP,CAAC;IACJ,CAAC;IACH,mBAAC;AAAD,CAAC,AApCD,CAAkC,KAAK,CAAC,aAAa,GAoCpD;AApCY,oCAAY;AAsCZ,QAAA,QAAQ,GAAG,qBAAO,CAC7B,UAAC,KAAY;IACX,MAAM,CAAC;QACL,IAAI,EAAE,gBAAa,CAAC,KAAK,CAAC;QAC1B,MAAM,EAAE,eAAY,CAAC,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC,CACF,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/data-pane/type-changer.d.ts b/build/components/data-pane/type-changer.d.ts new file mode 100644 index 000000000..576edb469 --- /dev/null +++ b/build/components/data-pane/type-changer.d.ts @@ -0,0 +1,15 @@ +/// +import { ExpandedType } from 'compassql/build/src/query/expandedtype'; +import * as React from 'react'; +import { DatasetSchemaChangeFieldType } from '../../actions/dataset'; +import { ActionHandler } from '../../actions/redux-action'; +export interface TypeChangerProps extends ActionHandler { + field: string; + type: ExpandedType; + validTypes: ExpandedType[]; +} +export declare class TypeChangerBase extends React.PureComponent { + render(): JSX.Element; + protected onTypeChange(e: any): void; +} +export declare const TypeChanger: typeof TypeChangerBase; diff --git a/build/components/data-pane/type-changer.js b/build/components/data-pane/type-changer.js new file mode 100644 index 000000000..d5ad86abf --- /dev/null +++ b/build/components/data-pane/type-changer.js @@ -0,0 +1,51 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var dataset_1 = require("../../actions/dataset"); +var styles = require("./type-changer.scss"); +var TypeChangerBase = (function (_super) { + __extends(TypeChangerBase, _super); + function TypeChangerBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + TypeChangerBase.prototype.render = function () { + var _this = this; + var validTypes = this.props.validTypes; + return (React.createElement("div", { styleName: 'type-changer' }, + React.createElement("h4", null, "Type"), + validTypes.map(function (validType) { + return (React.createElement("label", { key: validType }, + React.createElement("input", { type: 'radio', value: validType, name: 'type', onChange: _this.onTypeChange.bind(_this), checked: _this.props.type === validType }), + React.createElement("span", { styleName: 'type' }, + " ", + validType, + " "))); + }))); + }; + TypeChangerBase.prototype.onTypeChange = function (e) { + var type = e.target.value; + var _a = this.props, handleAction = _a.handleAction, field = _a.field; + handleAction({ + type: dataset_1.DATASET_SCHEMA_CHANGE_FIELD_TYPE, + payload: { + field: field, + type: type + } + }); + }; + return TypeChangerBase; +}(React.PureComponent)); +exports.TypeChangerBase = TypeChangerBase; +exports.TypeChanger = CSSModules(TypeChangerBase, styles); +//# sourceMappingURL=type-changer.js.map \ No newline at end of file diff --git a/build/components/data-pane/type-changer.js.map b/build/components/data-pane/type-changer.js.map new file mode 100644 index 000000000..c50c2ec9c --- /dev/null +++ b/build/components/data-pane/type-changer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"type-changer.js","sourceRoot":"","sources":["../../../src/components/data-pane/type-changer.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,6BAA+B;AAC/B,8CAAgD;AAChD,iDAAqG;AAErG,4CAA8C;AAQ9C;IAAqC,mCAAyC;IAA9E;;IAgCA,CAAC;IA/BQ,gCAAM,GAAb;QAAA,iBAkBC;QAjBQ,IAAA,kCAAU,CAAe;QAChC,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,cAAc;YAC3B,uCAAa;YACZ,UAAU,CAAC,GAAG,CAAC,UAAA,SAAS;gBACvB,MAAM,CAAC,CACL,+BAAO,GAAG,EAAE,SAAS;oBACnB,+BAAO,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAC,MAAM,EAC/C,QAAQ,EAAE,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAI,CAAC,EACtC,OAAO,EAAE,KAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,GACtC;oBACF,8BAAM,SAAS,EAAC,MAAM;;wBAAG,SAAS;4BAAS,CACrC,CACT,CAAC;YACJ,CAAC,CAAC,CACE,CACP,CAAC;IACJ,CAAC;IAES,sCAAY,GAAtB,UAAuB,CAAM;QAC3B,IAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACtB,IAAA,eAAkC,EAAjC,8BAAY,EAAE,gBAAK,CAAe;QACzC,YAAY,CAAC;YACX,IAAI,EAAE,0CAAgC;YACtC,OAAO,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,IAAI;aACX;SACF,CAAC,CAAC;IACL,CAAC;IACH,sBAAC;AAAD,CAAC,AAhCD,CAAqC,KAAK,CAAC,aAAa,GAgCvD;AAhCY,0CAAe;AAkCf,QAAA,WAAW,GAAG,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/data-pane/type-changer.scss b/build/components/data-pane/type-changer.scss new file mode 100644 index 000000000..390729d22 --- /dev/null +++ b/build/components/data-pane/type-changer.scss @@ -0,0 +1,24 @@ +.type-changer { + background-color: #eee; + padding: 10px; + border: 1px solid #eee; + border-radius: 3px; + margin-left: 10px; + + h4 { + font-size: 12px; + margin: 0 0 6px; + } + + label { + font-size: 11px; + } +} + +.type { + margin: 3px; +} + +#type-changer-pop-up { + pointer-events: none +} \ No newline at end of file diff --git a/build/components/data-selector/data-selector.scss b/build/components/data-selector/data-selector.scss new file mode 100644 index 000000000..8835758e0 --- /dev/null +++ b/build/components/data-selector/data-selector.scss @@ -0,0 +1,187 @@ +.data-selector { + z-index: 1; +} + +.modal { + display: flex; + margin: 50px auto; + width: calc( 100% - 100px); + padding: 6px; + background-color: #E2E9F3; + border: 1px solid #aaa; + border-radius: 3px; + box-sizing: border-box; + display: flex; + box-orient: vertical; + box-direction: normal; + flex-direction: column; + box-align: stretch; + align-items: stretch; + max-width: 800px; +} + +.modal-close { + float: right; +} + +.tab-list { + border-bottom: 1px solid #aaa; + margin: 0 0 10px; + padding: 0; +} + +.tab-panel { + display: none; + padding: 10px; +} + +.tab { + display: inline-block; + border: 1px solid #ddd; + border-radius: 5px 5px 0 0; + border-bottom: none; + bottom: -1px; + position: relative; + list-style: none; + padding: 6px 12px; + cursor: pointer; + margin-right: 5px; +} + +.react-tabs { + z-index: 10; + background-color: white; + + :global &__tab--selected { + background: #fff; + border-color: #aaa; + color: black; + } + + &:focus { + box-shadow: 0 0 5px hsl(208, 99%, 50%); + border-color: hsl(208, 99%, 50%); + outline: none; + + &:after { + content: ""; + position: absolute; + height: 5px; + left: -4px; + right: -4px; + bottom: -5px; + background: #fff; + } + } + :global &__tab-panel--selected { + display: block; + } +} + +.dataset-list { + padding: 0; + list-style-type: none; + margin-bottom: 20px; +} + +.dataset-list-element { + cursor: pointer; + margin-bottom: 20px; + margin-bottom: 5px; + display: inline-block; + vertical-align: top; + box-sizing: border-box; + padding: 5px 20px 5px 10px; + width: 49%; +} + +.dataset-list-element.element-selected { + background-color: #eef0f7; + border: 1px solid #aeb8d4; + border-radius: 3px; +} + +.dataset-list-element:hover { + color: #72757B; +} + +.upload-panel { + width: 50%; + display: inline-block; + vertical-align: top; + margin-left: 20px; + + :global .form-group { + margin-top: 1em; + } + + label { + width: 50px; + display: block; + float: left; + font-weight: bold; + margin-right: 10px; + } +} + +.paste-panel { + width: 44%; + display: inline-block; + vertical-align: top; + margin-left: 20px; + + :global .form-group { + margin-top: 1em; + } + + label { + width: 50px; + display: block; + float: left; + font-weight: bold; + margin-right: 10px; + } + + textarea { + min-height: 200px; + width: 90%; + } +} + +.url-panel { + width: 50%; + display: inline-block; + vertical-align: top; + margin-left: 20px; + + :global .form-group { + margin-top: 1em; + clear: both; + } + + label { + width: 55px; + display: block; + float: left; + font-weight: bold; + margin-right: 10px; + } + + button { + margin-top: 0.5em; + } +} + +.dropzone-target { + width: 100%; + padding: 20px; + box-sizing: border-box; + border-radius: 4px; + border: 1px dashed #aaa; + + color: #888; + font-weight: bold; + text-align: center; + text-transform: uppercase; + padding: 50px 20px; +} diff --git a/build/components/data-selector/index.d.ts b/build/components/data-selector/index.d.ts new file mode 100644 index 000000000..ee601e253 --- /dev/null +++ b/build/components/data-selector/index.d.ts @@ -0,0 +1,37 @@ +/// +import * as React from 'react'; +import { ActionHandler, DatasetAsyncAction } from '../../actions'; +import { Dataset } from '../../models'; +export interface DataSelectorOwnProps { + title: 'Change' | 'Load'; +} +export interface DataSelectorConnectProps { + data: Dataset; +} +export declare type DataSelectorProps = DataSelectorConnectProps & DataSelectorOwnProps & ActionHandler; +export interface DataSelectorState { + modalIsOpen: boolean; + dataText: string; + dataName: string; + dataUrl: string; + fileType: string; +} +export declare class DataSelectorBase extends React.PureComponent { + constructor(props: DataSelectorProps); + render(): JSX.Element; + private renderDataset(dataset); + private renderDatasetPanel(); + private renderUploadPanel(); + private renderUrlPanel(); + private handleFileTypeChange(event); + private renderPastePanel(); + private onDatasetChange(dataset); + private onFileChange(event); + private onDataTextSubmit(); + private loadDataString(data); + private onDataUrlSubmit(); + private openModal(); + private closeModal(); + private handleTextChange(event); +} +export declare const DataSelector: React.ComponentClass; diff --git a/build/components/data-selector/index.js b/build/components/data-selector/index.js new file mode 100644 index 000000000..4579cbdb0 --- /dev/null +++ b/build/components/data-selector/index.js @@ -0,0 +1,178 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var react_modal_1 = require("react-modal"); +// import {default as modal} from 'react-modal'; +var react_tabs_1 = require("react-tabs"); +var vega = require("vega"); +var styles = require("./data-selector.scss"); +var actions_1 = require("../../actions"); +var constants_1 = require("../../constants"); +var selectors_1 = require("../../selectors"); +var DataSelectorBase = (function (_super) { + __extends(DataSelectorBase, _super); + function DataSelectorBase(props) { + var _this = _super.call(this, props) || this; + _this.state = { modalIsOpen: false, dataText: '', dataName: '', dataUrl: '', fileType: undefined }; + _this.onDatasetChange = _this.onDatasetChange.bind(_this); + _this.openModal = _this.openModal.bind(_this); + _this.closeModal = _this.closeModal.bind(_this); + _this.renderDataset = _this.renderDataset.bind(_this); + _this.onFileChange = _this.onFileChange.bind(_this); + _this.onDataTextSubmit = _this.onDataTextSubmit.bind(_this); + _this.handleTextChange = _this.handleTextChange.bind(_this); + _this.handleFileTypeChange = _this.handleFileTypeChange.bind(_this); + _this.onDataUrlSubmit = _this.onDataUrlSubmit.bind(_this); + return _this; + } + DataSelectorBase.prototype.render = function () { + var title = this.props.title; + return (React.createElement("span", { styleName: 'data-selector' }, + React.createElement("button", { onClick: this.openModal }, title), + React.createElement(react_modal_1.default, { isOpen: this.state.modalIsOpen, onRequestClose: this.closeModal, contentLabel: "Data Selector", styleName: "modal", className: "voyager" }, + React.createElement("div", { className: 'modal-header' }, + React.createElement("a", { styleName: 'modal-close', onClick: this.closeModal }, "close"), + React.createElement("h3", null, "Add Dataset")), + React.createElement(react_tabs_1.Tabs, { className: styles['react-tabs'] }, + React.createElement(react_tabs_1.TabList, { className: styles['tab-list'] }, + React.createElement(react_tabs_1.Tab, { className: styles.tab }, "Change Dataset"), + React.createElement(react_tabs_1.Tab, { className: styles.tab }, "Paste or Upload Data"), + React.createElement(react_tabs_1.Tab, { className: styles.tab }, "From URL")), + React.createElement(react_tabs_1.TabPanel, { className: styles['tab-panel'] }, this.renderDatasetPanel()), + React.createElement(react_tabs_1.TabPanel, { className: styles['tab-panel'] }, + React.createElement("div", null, + this.renderUploadPanel(), + this.renderPastePanel())), + React.createElement(react_tabs_1.TabPanel, { className: styles['tab-panel'] }, this.renderUrlPanel()))))); + }; + DataSelectorBase.prototype.renderDataset = function (dataset) { + var selected = (dataset.name === this.props.data.name) ? styles['element-selected'] : null; + return (React.createElement("li", { key: dataset.name, className: styles['dataset-list-element'] + " " + selected }, + React.createElement("a", { onClick: this.onDatasetChange.bind(this, dataset) }, + React.createElement("i", { className: "fa fa-database" }), + " ", + dataset.name))); + }; + DataSelectorBase.prototype.renderDatasetPanel = function () { + return (React.createElement("div", null, + React.createElement("ul", { styleName: 'dataset-list' }, constants_1.DEFAULT_DATASETS.map(this.renderDataset)))); + }; + DataSelectorBase.prototype.renderUploadPanel = function () { + return (React.createElement("div", { styleName: 'upload-panel' }, + React.createElement("div", { className: 'form-group' }, + React.createElement("label", { htmlFor: 'data-file' }, "File"), + React.createElement("input", { id: 'data-file', type: 'file', onChange: this.onFileChange })), + React.createElement("p", null, "Upload a data file, or paste data in CSV format into the input."), + React.createElement("div", { styleName: 'dropzone-target' }))); + }; + DataSelectorBase.prototype.renderUrlPanel = function () { + return (React.createElement("div", { styleName: 'url-panel' }, + React.createElement("p", null, + "Add the name of the dataset and the URL to a ", + React.createElement("b", null, " JSON "), + ", ", + React.createElement("b", null, " CSV "), + " (with header), or", + React.createElement("b", null, " TSV "), + " file. Make sure that the formatting is correct and clean the data before adding it. The added dataset is only visible to you."), + React.createElement("div", { className: 'form-group' }, + React.createElement("label", { htmlFor: 'filetype-selector' }, "File Type"), + React.createElement("select", { value: this.state.fileType, onChange: this.handleFileTypeChange, id: 'filetype-selector' }, + React.createElement("option", { value: "json" }, "JSON"), + React.createElement("option", { value: "csv" }, "CSV"), + React.createElement("option", { value: "tsv" }, "TSV"))), + React.createElement("div", { className: 'form-group' }, + React.createElement("label", { htmlFor: 'data-name' }, "Name"), + React.createElement("input", { name: 'dataName', value: this.state.dataName, onChange: this.handleTextChange, id: 'data-name', type: 'name' })), + React.createElement("div", { className: 'form-group' }, + React.createElement("label", { htmlFor: 'data-url' }, "URL"), + React.createElement("input", { name: 'dataUrl', value: this.state.dataUrl, onChange: this.handleTextChange, id: 'data-url', type: 'name' })), + React.createElement("button", { onClick: this.onDataUrlSubmit }, "Add Dataset"))); + }; + DataSelectorBase.prototype.handleFileTypeChange = function (event) { + this.setState({ fileType: event.target.value }); + }; + DataSelectorBase.prototype.renderPastePanel = function () { + return (React.createElement("div", { styleName: 'paste-panel' }, + React.createElement("div", { className: 'form-group' }, + React.createElement("label", { htmlFor: 'data-name' }, "Name"), + React.createElement("input", { name: 'dataName', value: this.state.dataName, onChange: this.handleTextChange, id: 'data-name', type: 'name' })), + React.createElement("div", { className: 'form-group' }, + React.createElement("textarea", { name: 'dataText', value: this.state.dataText, onChange: this.handleTextChange })), + React.createElement("button", { onClick: this.onDataTextSubmit }, "Add Data"))); + }; + DataSelectorBase.prototype.onDatasetChange = function (dataset) { + this.props.handleAction(actions_1.datasetLoad(dataset.name, dataset)); + this.closeModal(); + }; + DataSelectorBase.prototype.onFileChange = function (event) { + var handleAction = this.props.handleAction; + var reader = new FileReader(); + var file = event.target.files[0]; + reader.onload = function (lEvent) { + var name = file.name.replace(/\.\w+$/, ''); + var format = file.name.split('.').pop(); + var values; + try { + values = vega.read(lEvent.target.result, { type: format }); + } + catch (err) { + window.alert(err.message); + } + handleAction(actions_1.datasetLoad(name, { values: values, format: format })); + }; + reader.readAsText(file); + }; + DataSelectorBase.prototype.onDataTextSubmit = function () { + var values = vega.read(this.state.dataText, { type: 'csv' }); + this.props.handleAction(actions_1.datasetLoad(this.state.dataName, { values: values })); + }; + DataSelectorBase.prototype.loadDataString = function (data) { + var name = this.state.dataName; + var fileType = this.state.fileType; + var values = vega.read(data, { type: fileType }); + this.props.handleAction(actions_1.datasetLoad(name, { values: values })); + }; + DataSelectorBase.prototype.onDataUrlSubmit = function () { + var _this = this; + var loader = vega.loader(); + loader.load(this.state.dataUrl).then(function (data) { + _this.loadDataString(data); + }).catch(function (error) { + console.warn('Error occurred while loading data: ', error); + }); + }; + DataSelectorBase.prototype.openModal = function () { + this.setState({ modalIsOpen: true }); + }; + DataSelectorBase.prototype.closeModal = function () { + this.setState({ modalIsOpen: false }); + }; + // https://facebook.github.io/react/docs/forms.html + DataSelectorBase.prototype.handleTextChange = function (event) { + var name = event.target.name; + this.setState((_a = {}, _a[name] = event.target.value, _a)); + var _a; + }; + return DataSelectorBase; +}(React.PureComponent)); +exports.DataSelectorBase = DataSelectorBase; +var DataSelectorRenderer = CSSModules(DataSelectorBase, styles); +exports.DataSelector = react_redux_1.connect(function (state) { + return { + data: selectors_1.selectDataset(state) + }; +}, actions_1.createDispatchHandler())(DataSelectorRenderer); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/data-selector/index.js.map b/build/components/data-selector/index.js.map new file mode 100644 index 000000000..fd6f698cd --- /dev/null +++ b/build/components/data-selector/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/data-selector/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/encoding-pane/encoding-pane.scss b/build/components/encoding-pane/encoding-pane.scss new file mode 100644 index 000000000..7a198ec2f --- /dev/null +++ b/build/components/encoding-pane/encoding-pane.scss @@ -0,0 +1,7 @@ +.encoding-pane { + background-color: #E2E9F3; +} + +.shelf-group { + margin-bottom: 12px; +} diff --git a/build/components/encoding-pane/encoding-shelf.d.ts b/build/components/encoding-pane/encoding-shelf.d.ts new file mode 100644 index 000000000..0d638d70a --- /dev/null +++ b/build/components/encoding-pane/encoding-shelf.d.ts @@ -0,0 +1,25 @@ +/// +/// +import { Schema } from 'compassql/build/src/schema'; +import * as React from 'react'; +import { ConnectDropTarget } from 'react-dnd'; +import { ActionHandler } from '../../actions/index'; +import { SpecEncodingAction } from '../../actions/shelf'; +import { ShelfFieldDef, ShelfId } from '../../models'; +/** + * Props for react-dnd of EncodingShelf + */ +export interface EncodingShelfDropTargetProps { + connectDropTarget: ConnectDropTarget; + isOver: boolean; + item: Object; +} +export interface EncodingShelfPropsBase extends ActionHandler { + id: ShelfId; + fieldDef: ShelfFieldDef; + schema: Schema; +} +export interface EncodingShelfState { + customizerIsOpened: boolean; +} +export declare const EncodingShelf: () => React.PureComponent; diff --git a/build/components/encoding-pane/encoding-shelf.js b/build/components/encoding-pane/encoding-shelf.js new file mode 100644 index 000000000..4bbd58758 --- /dev/null +++ b/build/components/encoding-pane/encoding-shelf.js @@ -0,0 +1,200 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var wildcard_1 = require("compassql/build/src/wildcard"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_dnd_1 = require("react-dnd"); +var TetherComponent = require("react-tether"); +var shelf_1 = require("../../actions/shelf"); +var constants_1 = require("../../constants"); +var encoding_1 = require("../../models/shelf/spec/encoding"); +var index_1 = require("../field/index"); +var styles = require("./encoding-shelf.scss"); +var field_customizer_1 = require("./field-customizer"); +var function_picker_1 = require("./function-picker"); +; +var EncodingShelfBase = (function (_super) { + __extends(EncodingShelfBase, _super); + function EncodingShelfBase(props) { + var _this = _super.call(this, props) || this; + _this.popupRefHandler = function (ref) { + _this.fieldCustomizer = ref; + }; + _this.fieldHandler = function (ref) { + _this.encodingShelf = ref; + }; + _this.state = { + customizerIsOpened: false + }; + _this.onWildcardAdd = _this.onWildcardAdd.bind(_this); + _this.onWildcardRemove = _this.onWildcardRemove.bind(_this); + _this.onWildcardDisable = _this.onWildcardDisable.bind(_this); + _this.onWildcardEnable = _this.onWildcardEnable.bind(_this); + _this.toggleCustomizer = _this.toggleCustomizer.bind(_this); + return _this; + } + EncodingShelfBase.prototype.componentWillUpdate = function (nextProps, nextState) { + if (!nextState) { + return; + } + if (nextState.customizerIsOpened) { + document.addEventListener('click', this.handleClickOutside.bind(this), true); + } + else if (this.state.customizerIsOpened) { + document.removeEventListener('click', this.handleClickOutside.bind(this), true); + } + }; + EncodingShelfBase.prototype.render = function () { + var _a = this.props, id = _a.id, connectDropTarget = _a.connectDropTarget, fieldDef = _a.fieldDef, handleAction = _a.handleAction; + var isWildcardShelf = wildcard_1.isWildcard(id.channel); + var channelName = isWildcardShelf ? 'any' : id.channel; + return connectDropTarget(React.createElement("div", { styleName: isWildcardShelf ? 'wildcard-shelf' : 'encoding-shelf' }, + React.createElement("div", { styleName: "shelf-label" }, + React.createElement(TetherComponent, { attachment: "top left", targetAttachment: "bottom left" }, + (fieldDef && !encoding_1.isWildcardChannelId(id)) ? + React.createElement("span", { onClick: this.toggleCustomizer, ref: this.fieldHandler }, + channelName, + ' ', + " ", + React.createElement("i", { className: 'fa fa-caret-down' })) : + React.createElement("span", null, channelName), + this.state.customizerIsOpened && + React.createElement("div", { ref: this.popupRefHandler }, + React.createElement(field_customizer_1.FieldCustomizer, { shelfId: id, fieldDef: fieldDef, handleAction: handleAction })))), + fieldDef ? this.renderField() : this.renderFieldPlaceholder())); + }; + EncodingShelfBase.prototype.onWildcardEnable = function () { + var _a = this.props, id = _a.id, handleAction = _a.handleAction; + handleAction({ + type: shelf_1.SPEC_FUNCTION_ENABLE_WILDCARD, + payload: { + shelfId: id + } + }); + }; + EncodingShelfBase.prototype.onWildcardDisable = function () { + var _a = this.props, id = _a.id, handleAction = _a.handleAction; + handleAction({ + type: shelf_1.SPEC_FUNCTION_DISABLE_WILDCARD, + payload: { + shelfId: id + } + }); + }; + EncodingShelfBase.prototype.onWildcardAdd = function (fn) { + var _a = this.props, id = _a.id, handleAction = _a.handleAction; + handleAction({ + type: shelf_1.SPEC_FUNCTION_ADD_WILDCARD, + payload: { + shelfId: id, + fn: fn + } + }); + }; + EncodingShelfBase.prototype.onWildcardRemove = function (fn) { + var _a = this.props, id = _a.id, handleAction = _a.handleAction; + handleAction({ + type: shelf_1.SPEC_FUNCTION_REMOVE_WILDCARD, + payload: { + shelfId: id, + fn: fn + } + }); + }; + EncodingShelfBase.prototype.onFunctionChange = function (fn) { + var _a = this.props, id = _a.id, handleAction = _a.handleAction; + handleAction({ + type: shelf_1.SPEC_FUNCTION_CHANGE, + payload: { + shelfId: id, + fn: fn + } + }); + }; + EncodingShelfBase.prototype.onRemove = function () { + var _a = this.props, id = _a.id, handleAction = _a.handleAction; + this.closePopup(); + handleAction({ + type: shelf_1.SPEC_FIELD_REMOVE, + payload: id + }); + }; + EncodingShelfBase.prototype.renderField = function () { + var _a = this.props, id = _a.id, fieldDef = _a.fieldDef, schema = _a.schema; + var renderFunctionPicker = fieldDef.type === 'quantitative' || fieldDef.type === 'temporal'; + var functionPicker = renderFunctionPicker ? + React.createElement(function_picker_1.FunctionPicker, { fieldDefParts: fieldDef, onFunctionChange: this.onFunctionChange.bind(this), wildcardHandler: this }) : null; + return (React.createElement("div", { styleName: 'field-wrapper' }, + React.createElement(index_1.Field, { draggable: true, fieldDef: fieldDef, caretShow: true, isPill: true, schema: schema, popupComponent: functionPicker, onRemove: this.onRemove.bind(this), parentId: { type: constants_1.FieldParentType.ENCODING_SHELF, id: id } }))); + }; + EncodingShelfBase.prototype.renderFieldPlaceholder = function () { + var _a = this.props, item = _a.item, isOver = _a.isOver; + return (React.createElement("span", { styleName: isOver ? 'placeholder-over' : item ? 'placeholder-active' : 'placeholder' }, "Drop a field here")); + }; + EncodingShelfBase.prototype.handleClickOutside = function (e) { + if (this.fieldCustomizer && this.encodingShelf && (this.fieldCustomizer.contains(e.target) || + this.encodingShelf.contains(e.target))) { + return; + } + this.closePopup(); + }; + EncodingShelfBase.prototype.closePopup = function () { + this.setState({ + customizerIsOpened: false + }); + }; + EncodingShelfBase.prototype.toggleCustomizer = function () { + this.setState({ + customizerIsOpened: !this.state.customizerIsOpened + }); + }; + return EncodingShelfBase; +}(React.PureComponent)); +var encodingShelfTarget = { + // TODO: add canDrop + drop: function (props, monitor) { + // Don't drop twice for nested drop target + if (monitor.didDrop()) { + return; + } + var _a = monitor.getItem(), fieldDef = _a.fieldDef, parentId = _a.parentId; + switch (parentId.type) { + case constants_1.FieldParentType.FIELD_LIST: + props.handleAction({ + type: shelf_1.SPEC_FIELD_ADD, + // TODO(https://github.com/vega/voyager/issues/428): + // support inserting a field between two existing fields on the wildcard shelf (replace = false) + payload: { shelfId: props.id, fieldDef: fieldDef, replace: true } + }); + break; + case constants_1.FieldParentType.ENCODING_SHELF: + props.handleAction({ + type: shelf_1.SPEC_FIELD_MOVE, + payload: { from: parentId.id, to: props.id } + }); + break; + default: + throw new Error('Field dragged from unregistered source type to EncodingShelf'); + } + } +}; +var collect = function (connect, monitor) { + return { + connectDropTarget: connect.dropTarget(), + isOver: monitor.isOver(), + item: monitor.getItem() + }; +}; +// HACK: do type casting to suppress compile error for: https://github.com/Microsoft/TypeScript/issues/13526 +exports.EncodingShelf = react_dnd_1.DropTarget(constants_1.DraggableType.FIELD, encodingShelfTarget, collect)(CSSModules(EncodingShelfBase, styles)); +//# sourceMappingURL=encoding-shelf.js.map \ No newline at end of file diff --git a/build/components/encoding-pane/encoding-shelf.js.map b/build/components/encoding-pane/encoding-shelf.js.map new file mode 100644 index 000000000..a3c8c90da --- /dev/null +++ b/build/components/encoding-pane/encoding-shelf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"encoding-shelf.js","sourceRoot":"","sources":["../../../src/components/encoding-pane/encoding-shelf.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/encoding-pane/encoding-shelf.scss b/build/components/encoding-pane/encoding-shelf.scss new file mode 100644 index 000000000..f4c1307bd --- /dev/null +++ b/build/components/encoding-pane/encoding-shelf.scss @@ -0,0 +1,104 @@ +@import './placeholder.scss'; + +$pill-radius: 3px; +$pill-height: 22px; + +.encoding-shelf { + background-color: hsla(224,25%,29%,0.2); + border: 1px solid #ddd; + border-radius: $pill-radius; + display: flex; + font-size: 11px; + margin-bottom: 4px; + + width: 100%; + height: 22px; +} + + +.field-wrapper { + flex-grow: 1; + box-sizing: border-box; + border: 1px solid transparent; + border-radius: 3px; + width: 168px; + height: $pill-height; +} + +.wildcard-shelf { + @extend .encoding-shelf; + background-color: hsla(185,80%,29%,0.4); +} + +.shelf-label { + user-select: none; + display: block; + width: 52px; + margin: 0 0.2rem; + // text-align: right; + line-height: $pill-height; + // cursor: pointer; + flex-shrink: 0; + + :global .fa { + margin-top: 4px; + opacity: 0.5; + } +// &.expanded .fa, &:hover .fa { +// opacity: 1; +// } +} + +.overlay-screen { + z-index: 1; + + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +// TODO: bring some of these back + +// .shelf.disabled { +// opacity: 0.5; +// } + +// /** Don't disable shelf in preview mode */ +// .preview .shelf.disabled { +// opacity: 1; +// } + +// .shelf{ + +// } +// .shelf-functions { +// max-width: 280px; +// } + +// .shelf-properties, .shelf-functions{ +// line-height: 20px; + +// label { +// display: inline-block; + +// &.prop-label { +// width: 110px; +// text-align: right; +// margin-right: 3px; +// .name { +// text-overflow: ellipsis; +// width: 90px; +// overflow: hidden; +// display: inline-block; +// vertical-align: middle; +// } +// } + +// &.func-label, &.type-label { +// min-width: 75px; +// margin-right: 5px; +// } +// } +// } diff --git a/build/components/encoding-pane/field-customizer.d.ts b/build/components/encoding-pane/field-customizer.d.ts new file mode 100644 index 000000000..2ed12ac57 --- /dev/null +++ b/build/components/encoding-pane/field-customizer.d.ts @@ -0,0 +1,17 @@ +/// +import * as React from 'react'; +import { ActionHandler } from '../../actions'; +import { SpecEncodingAction } from '../../actions/shelf'; +import { ShelfFieldDef, ShelfId } from '../../models/shelf/spec'; +export interface FieldCustomizerProps extends ActionHandler { + shelfId: ShelfId; + fieldDef: ShelfFieldDef; +} +export interface CustomProp { + prop: string; + nestedProp?: string; +} +export declare class FieldCustomizerBase extends React.PureComponent { + render(): JSX.Element; +} +export declare const FieldCustomizer: typeof FieldCustomizerBase; diff --git a/build/components/encoding-pane/field-customizer.js b/build/components/encoding-pane/field-customizer.js new file mode 100644 index 000000000..0fa5e41c0 --- /dev/null +++ b/build/components/encoding-pane/field-customizer.js @@ -0,0 +1,44 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_tabs_1 = require("react-tabs"); // eslint-disable-line +var styles = require("./field-customizer.scss"); +var property_editor_1 = require("./property-editor"); +var property_editor_schema_1 = require("./property-editor-schema"); +var FieldCustomizerBase = (function (_super) { + __extends(FieldCustomizerBase, _super); + function FieldCustomizerBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + FieldCustomizerBase.prototype.render = function () { + var _a = this.props, shelfId = _a.shelfId, handleAction = _a.handleAction, fieldDef = _a.fieldDef; + var propertyGroupIndex = property_editor_schema_1.getFieldPropertyGroupIndex(shelfId, fieldDef); + var keys = propertyGroupIndex ? Object.keys(propertyGroupIndex) : undefined; + return (React.createElement("div", { styleName: 'field-customizer' }, keys && (React.createElement(react_tabs_1.Tabs, null, + React.createElement(react_tabs_1.TabList, null, keys.map(function (encodingType, i) { + return (React.createElement(react_tabs_1.Tab, { key: 'tab' + i }, encodingType)); + })), + React.createElement("div", null, keys.map(function (encodingType, i) { + var customProps = propertyGroupIndex[encodingType]; + return (React.createElement(react_tabs_1.TabPanel, { key: 'tabPanel' + encodingType + i }, customProps.map(function (customizableProp) { + var prop = customizableProp.prop, nestedProp = customizableProp.nestedProp; + return (React.createElement(property_editor_1.PropertyEditor, { key: prop + '_' + nestedProp + i, prop: prop, nestedProp: nestedProp, shelfId: shelfId, fieldDef: fieldDef, handleAction: handleAction, propTab: encodingType })); + }))); + })))))); + }; + return FieldCustomizerBase; +}(React.PureComponent)); +exports.FieldCustomizerBase = FieldCustomizerBase; +exports.FieldCustomizer = CSSModules(FieldCustomizerBase, styles); +//# sourceMappingURL=field-customizer.js.map \ No newline at end of file diff --git a/build/components/encoding-pane/field-customizer.js.map b/build/components/encoding-pane/field-customizer.js.map new file mode 100644 index 000000000..75353d8c2 --- /dev/null +++ b/build/components/encoding-pane/field-customizer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"field-customizer.js","sourceRoot":"","sources":["../../../src/components/encoding-pane/field-customizer.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,8CAAgD;AAChD,yCAAwD,CAAC,sBAAsB;AAI/E,gDAAkD;AAClD,qDAAiD;AACjD,mEAAoE;AAYpE;IAAyC,uCAA6C;IAAtF;;IAiDA,CAAC;IAhDQ,oCAAM,GAAb;QACQ,IAAA,eAA8C,EAA7C,oBAAO,EAAE,8BAAY,EAAE,sBAAQ,CAAe;QACrD,IAAM,kBAAkB,GAAG,mDAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzE,IAAM,IAAI,GAAG,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;QAC9E,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,kBAAkB,IAC9B,IAAI,IAAI,CACP,oBAAC,iBAAI;YACH,oBAAC,oBAAO,QAEJ,IAAI,CAAC,GAAG,CAAC,UAAC,YAAY,EAAE,CAAC;gBACvB,MAAM,CAAC,CACL,oBAAC,gBAAG,IAAC,GAAG,EAAE,KAAK,GAAG,CAAC,IAAG,YAAY,CAAO,CAC1C,CAAC;YACJ,CAAC,CAAC,CAEI;YACV,iCAEI,IAAI,CAAC,GAAG,CAAC,UAAC,YAAY,EAAE,CAAC;gBACvB,IAAM,WAAW,GAAiB,kBAAkB,CAAC,YAAY,CAAC,CAAC;gBACnE,MAAM,CAAC,CACL,oBAAC,qBAAQ,IAAC,GAAG,EAAE,UAAU,GAAG,YAAY,GAAG,CAAC,IAExC,WAAW,CAAC,GAAG,CAAC,UAAA,gBAAgB;oBACvB,IAAA,4BAAI,EAAE,wCAAU,CAAqB;oBAC5C,MAAM,CAAC,CACL,oBAAC,gCAAc,IACb,GAAG,EAAE,IAAI,GAAG,GAAG,GAAG,UAAU,GAAG,CAAC,EAChC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,YAAY,GACrB,CACH,CAAC;gBACJ,CAAC,CAAC,CAEK,CACZ,CAAC;YACJ,CAAC,CAAC,CACA,CACD,CACR,CACG,CACP,CAAC;IACJ,CAAC;IACH,0BAAC;AAAD,CAAC,AAjDD,CAAyC,KAAK,CAAC,aAAa,GAiD3D;AAjDY,kDAAmB;AAmDnB,QAAA,eAAe,GAAG,UAAU,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/encoding-pane/field-customizer.scss b/build/components/encoding-pane/field-customizer.scss new file mode 100644 index 000000000..91e0d2345 --- /dev/null +++ b/build/components/encoding-pane/field-customizer.scss @@ -0,0 +1,43 @@ +.field-customizer { + background-color: #eee; + border-bottom: 5px solid #eee; + border-radius: 3px; + width: 250px; + + fieldset { + border: 0; + padding-bottom: 10px; + padding-top: 10px; + } + + form { + height: 1.8em; + } + + label { + display: inline-block; + font-size: 11px !important; // cannot access react-form's css attributes, so have to use important + padding-right: 10px; + text-align: left; + width: 75px; + } + + ul { + border-bottom: 1px solid #aaa; + margin: 0 0; + padding: 2px; + height: 18px; + } + + li { + display: inline-block; + border: 1px solid transparent; + border-bottom: none; + bottom: -1px; + position: relative; + list-style: none; + padding: 2px 10px; + cursor: pointer; + font-size: 12px; + } +} diff --git a/build/components/encoding-pane/function-picker.d.ts b/build/components/encoding-pane/function-picker.d.ts new file mode 100644 index 000000000..739b01f97 --- /dev/null +++ b/build/components/encoding-pane/function-picker.d.ts @@ -0,0 +1,26 @@ +/// +import * as React from 'react'; +import { TimeUnit } from 'vega-lite/build/src/timeunit'; +import { ShelfFunction } from '../../models/shelf'; +import { ShelfFieldDef } from '../../models/shelf'; +export interface FunctionPickerProps { + fieldDefParts: { + [k in 'fn' | 'type']?: ShelfFieldDef[k]; + }; + onFunctionChange: (fn: ShelfFunction | TimeUnit) => void; + wildcardHandler?: FunctionPickerWildcardHandler; +} +export interface FunctionPickerWildcardHandler { + onWildcardEnable: () => void; + onWildcardDisable: () => void; + onWildcardAdd: (fn: ShelfFunction) => void; + onWildcardRemove: (fn: ShelfFunction) => void; +} +export declare class FunctionPickerBase extends React.PureComponent { + constructor(props: FunctionPickerProps); + render(): JSX.Element; + private onFunctionChange(event); + private onFunctionCheck(event); + private onCheck(event); +} +export declare const FunctionPicker: typeof FunctionPickerBase; diff --git a/build/components/encoding-pane/function-picker.js b/build/components/encoding-pane/function-picker.js new file mode 100644 index 000000000..9e1180d9e --- /dev/null +++ b/build/components/encoding-pane/function-picker.js @@ -0,0 +1,80 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var wildcard_1 = require("compassql/build/src/wildcard"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var util_1 = require("vega-lite/build/src/util"); +var shelf_1 = require("../../models/shelf"); +var styles = require("./function-picker.scss"); +var FunctionPickerBase = (function (_super) { + __extends(FunctionPickerBase, _super); + function FunctionPickerBase(props) { + var _this = _super.call(this, props) || this; + // Bind - https://facebook.github.io/react/docs/handling-events.html + _this.onFunctionChange = _this.onFunctionChange.bind(_this); + _this.onCheck = _this.onCheck.bind(_this); + _this.onFunctionCheck = _this.onFunctionCheck.bind(_this); + return _this; + } + FunctionPickerBase.prototype.render = function () { + var _this = this; + var _a = this.props, fieldDefParts = _a.fieldDefParts, wildcardHandler = _a.wildcardHandler; + var fn = fieldDefParts.fn, type = fieldDefParts.type; + var supportedFns = shelf_1.getSupportedFunction(type); + var fnIsWildcard = wildcard_1.isWildcard(fn); + var checkboxradios = supportedFns.map(function (f) { return (React.createElement("label", { styleName: "func-label", key: f || '-' }, + React.createElement("input", { onChange: fnIsWildcard ? _this.onFunctionCheck : _this.onFunctionChange, type: fnIsWildcard ? "checkbox" : "radio", checked: wildcard_1.isWildcard(fn) ? util_1.contains(fn.enum, f) : (f === fn), value: f || '-' }), + ' ', + f || '-')); }); + return checkboxradios.length > 0 && (React.createElement("div", { styleName: "function-chooser" }, + wildcardHandler && (React.createElement("label", { styleName: "wildcard-button" }, + React.createElement("input", { type: "checkbox", onChange: this.onCheck }), + " Wildcard")), + React.createElement("h4", null, "Function"), + checkboxradios)); + }; + FunctionPickerBase.prototype.onFunctionChange = function (event) { + var shelfFunction = event.target.value; + if (shelfFunction === '-') { + shelfFunction = undefined; + } + this.props.onFunctionChange(shelfFunction); + }; + FunctionPickerBase.prototype.onFunctionCheck = function (event) { + var checked = event.target.checked; + var shelfFunction = event.target.value; + if (shelfFunction === '-') { + shelfFunction = undefined; + } + if (checked) { + this.props.wildcardHandler.onWildcardAdd(shelfFunction); + } + else { + this.props.wildcardHandler.onWildcardRemove(shelfFunction); + } + }; + FunctionPickerBase.prototype.onCheck = function (event) { + var checked = event.target.checked; + if (checked) { + this.props.wildcardHandler.onWildcardEnable(); + } + else { + this.props.wildcardHandler.onWildcardDisable(); + } + }; + return FunctionPickerBase; +}(React.PureComponent)); +exports.FunctionPickerBase = FunctionPickerBase; +exports.FunctionPicker = CSSModules(FunctionPickerBase, styles); +// FIXME: move this to other parts and expand with more rules and test? +//# sourceMappingURL=function-picker.js.map \ No newline at end of file diff --git a/build/components/encoding-pane/function-picker.js.map b/build/components/encoding-pane/function-picker.js.map new file mode 100644 index 000000000..9bca0327e --- /dev/null +++ b/build/components/encoding-pane/function-picker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"function-picker.js","sourceRoot":"","sources":["../../../src/components/encoding-pane/function-picker.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/encoding-pane/function-picker.scss b/build/components/encoding-pane/function-picker.scss new file mode 100644 index 000000000..e872ae52d --- /dev/null +++ b/build/components/encoding-pane/function-picker.scss @@ -0,0 +1,34 @@ +.popup-menu { + padding: 5px; + background-color: #eee; + border: 1px solid #eee; + border-radius: 3px; +} + +.function-chooser { + @extend .popup-menu; + width: 265px; + + // Tether append our popup element to body thus it's not under .voyager as in our other global style. + // TODO: change tether's output location from body + h4 { + font-size: 12px; + margin: 0 0 6px; + } +} + +label.func-label { + display: inline-block; + width: 130px; // set width to roughly half of .shelf-functions to create double columns + + font-weight: normal; + // TODO: extract these two to somewhere common? + text-transform: uppercase; + font-size: 11px; +} + +.wildcard-button { + float: right; + font-size: 12px; +} + diff --git a/build/components/encoding-pane/index.d.ts b/build/components/encoding-pane/index.d.ts new file mode 100644 index 000000000..a5e47ee9a --- /dev/null +++ b/build/components/encoding-pane/index.d.ts @@ -0,0 +1,3 @@ +/// +import * as React from 'react'; +export declare const EncodingPane: React.ComponentClass<{}>; diff --git a/build/components/encoding-pane/index.js b/build/components/encoding-pane/index.js new file mode 100644 index 000000000..e17347abc --- /dev/null +++ b/build/components/encoding-pane/index.js @@ -0,0 +1,109 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var wildcard_1 = require("compassql/build/src/wildcard"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var redux_action_1 = require("../../actions/redux-action"); +var shelf_1 = require("../../actions/shelf"); +var selectors_1 = require("../../selectors"); +var index_1 = require("../../selectors/index"); +var shelf_2 = require("../../selectors/shelf"); +var filter_pane_1 = require("../filter-pane"); +var styles = require("./encoding-pane.scss"); +var encoding_shelf_1 = require("./encoding-shelf"); +var mark_picker_1 = require("./mark-picker"); +var EncodingPanelBase = (function (_super) { + __extends(EncodingPanelBase, _super); + function EncodingPanelBase(props) { + var _this = _super.call(this, props) || this; + // Bind - https://facebook.github.io/react/docs/handling-events.html + _this.onClear = _this.onClear.bind(_this); + return _this; + } + EncodingPanelBase.prototype.render = function () { + var _a = this.props, specPreview = _a.specPreview, spec = _a.spec; + var wildcards = this.props.config.wildcards; + var anyEncodings = (specPreview || spec).anyEncodings; + var positionShelves = ['x', 'y'].map(this.encodingShelf, this); + var facetShelves = ['row', 'column'].map(this.encodingShelf, this); + var nonPositionShelves = ['size', 'color', 'shape', 'detail', 'text'].map(this.encodingShelf, this); + var wildcardShelvesGroup = wildcards !== 'disabled' && (React.createElement("div", { styleName: "shelf-group" }, + React.createElement("h3", null, "Wildcard Shelves"), + anyEncodings.map(function (_, i) { return i; }).concat([-1 // map the empty placeholder to -1 + ]).map(this.wildcardShelf, this))); + return (React.createElement("div", { className: "pane", styleName: "encoding-pane" }, + React.createElement("a", { className: "right", onClick: this.onClear }, + React.createElement("i", { className: "fa fa-eraser" }), + ' ', + "Clear"), + React.createElement("h2", null, + "Encoding", + specPreview && ' Preview'), + React.createElement("div", { styleName: "shelf-group" }, positionShelves), + React.createElement("div", { styleName: "shelf-group" }, + React.createElement("div", { className: "right" }, this.markPicker()), + React.createElement("h3", null, "Mark"), + nonPositionShelves), + React.createElement("div", { styleName: "shelf-group" }, + React.createElement("h3", null, "Facet"), + facetShelves), + wildcardShelvesGroup, + React.createElement("div", { styleName: "shelf-group" }, + React.createElement("h3", null, "Filter"), + this.filterPane()))); + }; + /** + * Return encoding shelf for normal (non-wildcard channels). + */ + EncodingPanelBase.prototype.encodingShelf = function (channel) { + // This one can't be wildcard, thus we use VL's Channel, not our ShelfChannel + var _a = this.props, handleAction = _a.handleAction, spec = _a.spec, specPreview = _a.specPreview, schema = _a.schema; + var encoding = (specPreview || spec).encoding; + return (React.createElement(encoding_shelf_1.EncodingShelf, { key: channel, id: { channel: channel }, fieldDef: encoding[channel], schema: schema, handleAction: handleAction })); + }; + EncodingPanelBase.prototype.markPicker = function () { + var _a = this.props, handleAction = _a.handleAction, spec = _a.spec, specPreview = _a.specPreview; + var mark = (specPreview || spec).mark; + return React.createElement(mark_picker_1.MarkPicker, { mark: mark, handleAction: handleAction }); + }; + EncodingPanelBase.prototype.wildcardShelf = function (index) { + var _a = this.props, handleAction = _a.handleAction, spec = _a.spec, specPreview = _a.specPreview, schema = _a.schema; + var anyEncodings = (specPreview || spec).anyEncodings; + var id = { + channel: wildcard_1.SHORT_WILDCARD, + index: index + }; + return (React.createElement(encoding_shelf_1.EncodingShelf, { key: index, id: id, schema: schema, fieldDef: anyEncodings[index], handleAction: handleAction })); + }; + EncodingPanelBase.prototype.filterPane = function () { + var _a = this.props, filters = _a.filters, schema = _a.schema, handleAction = _a.handleAction; + return (React.createElement(filter_pane_1.FilterPane, { filters: filters, schema: schema, handleAction: handleAction })); + }; + EncodingPanelBase.prototype.onClear = function () { + this.props.handleAction({ type: shelf_1.SPEC_CLEAR }); + }; + return EncodingPanelBase; +}(React.PureComponent)); +exports.EncodingPane = react_redux_1.connect(function (state) { + var presentUndoableState = state.undoable.present; + return { + spec: shelf_2.selectShelfSpec(state), + filters: shelf_2.selectFilters(state), + schema: selectors_1.selectDataset(state).schema, + fieldDefs: index_1.selectSchemaFieldDefs(state), + specPreview: selectors_1.selectShelfPreview(state).spec, + config: selectors_1.selectConfig(state) + }; +}, redux_action_1.createDispatchHandler())(CSSModules(EncodingPanelBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/encoding-pane/index.js.map b/build/components/encoding-pane/index.js.map new file mode 100644 index 000000000..b9e51dd3b --- /dev/null +++ b/build/components/encoding-pane/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/encoding-pane/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/encoding-pane/mark-picker.d.ts b/build/components/encoding-pane/mark-picker.d.ts new file mode 100644 index 000000000..5b21e3664 --- /dev/null +++ b/build/components/encoding-pane/mark-picker.d.ts @@ -0,0 +1,16 @@ +/// +import * as React from 'react'; +import { ActionHandler, SpecMarkChangeType } from '../../actions'; +import { ShelfMark } from '../../models'; +export interface MarkPickerProps extends ActionHandler { + mark: ShelfMark; +} +/** + * Control for selecting mark type + */ +export declare class MarkPickerBase extends React.PureComponent { + constructor(props: MarkPickerProps); + render(): JSX.Element; + private onMarkChange(event); +} +export declare const MarkPicker: typeof MarkPickerBase; diff --git a/build/components/encoding-pane/mark-picker.js b/build/components/encoding-pane/mark-picker.js new file mode 100644 index 000000000..cba98c8e0 --- /dev/null +++ b/build/components/encoding-pane/mark-picker.js @@ -0,0 +1,46 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var wildcard_1 = require("compassql/build/src/wildcard"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var mark_1 = require("vega-lite/build/src/mark"); +var styles = require("./mark-picker.scss"); +var actions_1 = require("../../actions"); +var ALL_MARKS = [wildcard_1.SHORT_WILDCARD].concat(mark_1.PRIMITIVE_MARKS); +var options = ALL_MARKS.map(function (mark) { return (React.createElement("option", { key: mark, value: mark }, mark === wildcard_1.SHORT_WILDCARD ? 'auto' : mark)); }); +/** + * Control for selecting mark type + */ +var MarkPickerBase = (function (_super) { + __extends(MarkPickerBase, _super); + function MarkPickerBase(props) { + var _this = _super.call(this, props) || this; + // Bind - https://facebook.github.io/react/docs/handling-events.html + _this.onMarkChange = _this.onMarkChange.bind(_this); + return _this; + } + MarkPickerBase.prototype.render = function () { + var mark = this.props.mark; + return (React.createElement("select", { styleName: wildcard_1.isWildcard(mark) ? 'mark-picker-any' : 'mark-picker', value: mark, onChange: this.onMarkChange }, options)); + }; + MarkPickerBase.prototype.onMarkChange = function (event) { + this.props.handleAction({ + type: actions_1.SPEC_MARK_CHANGE_TYPE, + payload: event.target.value + }); + }; + return MarkPickerBase; +}(React.PureComponent)); +exports.MarkPickerBase = MarkPickerBase; +exports.MarkPicker = CSSModules(MarkPickerBase, styles); +//# sourceMappingURL=mark-picker.js.map \ No newline at end of file diff --git a/build/components/encoding-pane/mark-picker.js.map b/build/components/encoding-pane/mark-picker.js.map new file mode 100644 index 000000000..046d53b40 --- /dev/null +++ b/build/components/encoding-pane/mark-picker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mark-picker.js","sourceRoot":"","sources":["../../../src/components/encoding-pane/mark-picker.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yDAAwE;AACxE,6BAA+B;AAC/B,8CAAgD;AAChD,iDAAyD;AAEzD,2CAA6C;AAE7C,yCAAuF;AAGvF,IAAM,SAAS,IAAI,yBAAc,SAAK,sBAAe,CAAC,CAAC;AAEvD,IAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,UAAA,IAAI,IAAI,OAAA,CACpC,gCAAQ,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAC3B,IAAI,KAAK,yBAAc,GAAG,MAAM,GAAG,IAAI,CACjC,CACV,EAJqC,CAIrC,CAAC,CAAC;AAMH;;GAEG;AACH;IAAoC,kCAAwC;IAC1E,wBAAY,KAAsB;QAAlC,YACE,kBAAM,KAAK,CAAC,SAIb;QAFC,oEAAoE;QACpE,KAAI,CAAC,YAAY,GAAG,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAI,CAAC,CAAC;;IACnD,CAAC;IAEM,+BAAM,GAAb;QACS,IAAA,sBAAI,CAAe;QAC1B,MAAM,CAAC,CACL,gCACE,SAAS,EAAE,qBAAU,CAAC,IAAI,CAAC,GAAG,iBAAiB,GAAG,aAAa,EAC/D,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,IAAI,CAAC,YAAY,IAE1B,OAAO,CACD,CACV,CAAC;IACJ,CAAC;IACO,qCAAY,GAApB,UAAqB,KAAU;QAC7B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YACtB,IAAI,EAAE,+BAAqB;YAC3B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAkB;SACzC,CAAC,CAAC;IACL,CAAC;IACH,qBAAC;AAAD,CAAC,AA1BD,CAAoC,KAAK,CAAC,aAAa,GA0BtD;AA1BY,wCAAc;AA4Bd,QAAA,UAAU,GAAG,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/encoding-pane/mark-picker.scss b/build/components/encoding-pane/mark-picker.scss new file mode 100644 index 000000000..224e33d78 --- /dev/null +++ b/build/components/encoding-pane/mark-picker.scss @@ -0,0 +1,13 @@ +// customizing css for select box http://cssdeck.com/labs/styling-select-box-with-css3 + +.mark-picker { + background: #f8f8f8; + color:#333; + border: #888888 1px solid; +} + +.mark-picker-any { + background: #e3f9fd; + color: #5798a5; + border: #9bc4cc 1px solid; +} diff --git a/build/components/encoding-pane/placeholder.scss b/build/components/encoding-pane/placeholder.scss new file mode 100644 index 000000000..3aa41d7f4 --- /dev/null +++ b/build/components/encoding-pane/placeholder.scss @@ -0,0 +1,35 @@ +$pill-radius: 3px; +$pill-height: 22px; +$text-color: #212121; + +.placeholder { + display: block; + width: 100%; + padding: 0 0.5em; + border: 1px solid hsla(0,0%,30%,0.1); + background-color: white; + line-height: $pill-height - 2; + border-radius: $pill-radius; + text-overflow: ellipsis; + font-weight: normal; + color: #ccc; +} + +.placeholder-over { + @extend .placeholder; + border: 1px dashed #4CAF50; + background-color: #d0efb3; + color: $text-color; +} + +.placeholder-active { + @extend .placeholder-over; + background-color: #C8E6C9; +} + + +.placeholder-disabled { + @extend .placeholder; + background-color: #e0e0e0; + color: grey; + } diff --git a/build/components/encoding-pane/property-editor-schema.d.ts b/build/components/encoding-pane/property-editor-schema.d.ts new file mode 100644 index 000000000..098f35a0e --- /dev/null +++ b/build/components/encoding-pane/property-editor-schema.d.ts @@ -0,0 +1,57 @@ +import { Channel } from 'vega-lite/build/src/channel'; +import { ShelfFieldDef, ShelfId } from '../../models/shelf/spec'; +export interface SchemaProperties { + [key: string]: SchemaProperty; +} +export interface ObjectSchema { + type: 'object'; + title?: string; + properties: SchemaProperties; +} +export interface StringSchema { + type: 'string'; + title: string; + enum?: string[]; + default?: string; +} +export interface IntegerSchema { + type: 'number'; + title: string; + minimum: number; + maximum: number; + multipleOf: number; +} +export declare function isStringSchema(schema: SchemaProperty): schema is StringSchema; +export declare type SchemaProperty = ObjectSchema | StringSchema | IntegerSchema; +export interface UISchema { + [key: string]: UISchemaItem; +} +export interface UISchemaItem { + 'ui:widget'?: string; + 'ui:placeholder'?: string; + 'ui:emptyValue'?: string; +} +export interface PropertyEditorSchema { + uiSchema: UISchema; + schema: ObjectSchema; +} +export declare const CATEGORICAL_COLOR_SCHEMES: string[]; +export declare const SEQUENTIAL_COLOR_SCHEMES: string[]; +export declare function generatePropertyEditorSchema(prop: string, nestedProp: string, propTab: string, fieldDef: ShelfFieldDef, channel: Channel): PropertyEditorSchema; +export declare function getFieldPropertyGroupIndex(shelfId: ShelfId, fieldDef: ShelfFieldDef): { + 'Common': { + prop: string; + }[]; +} | { + 'Legend': { + prop: string; + nestedProp: string; + }[]; + 'Scale': { + prop: string; + nestedProp: string; + }[]; +}; +export declare function generateFormData(shelfId: ShelfId, fieldDef: ShelfFieldDef): {}; +export declare function isContinuous(fieldDef: ShelfFieldDef): boolean; +export declare function isDiscrete(fieldDef: ShelfFieldDef): boolean; diff --git a/build/components/encoding-pane/property-editor-schema.js b/build/components/encoding-pane/property-editor-schema.js new file mode 100644 index 000000000..4e8f57bb3 --- /dev/null +++ b/build/components/encoding-pane/property-editor-schema.js @@ -0,0 +1,268 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var expandedtype_1 = require("compassql/build/src/query/expandedtype"); +var channel_1 = require("vega-lite/build/src/channel"); +var util_1 = require("vega-lite/build/src/util"); +var vlSchema = require("vega-lite/build/vega-lite-schema.json"); +function isStringSchema(schema) { + return schema.type === 'string'; +} +exports.isStringSchema = isStringSchema; +// ------------------------------------------------------------------------------ +// Channel-Field Indexes for custom encoding +// Key is Tab name, value is list of fieldDef properties +// ------------------------------------------------------------------------------ +var AXIS_ORIENT_TITLE = ['title', 'orient'].map(function (p) { return ({ prop: 'axis', nestedProp: p }); }); +var LEGEND_ORIENT_TITLE = ['orient', 'title'].map(function (p) { return ({ prop: 'legend', nestedProp: p }); }); +var POSITION_FIELD_NOMINAL_INDEX = { + 'Common': [ + { + prop: 'scale', + nestedProp: 'type' + } + ].concat(AXIS_ORIENT_TITLE) +}; +var POSITION_FIELD_TEMPORAL_INDEX = POSITION_FIELD_NOMINAL_INDEX; +var POSITION_FIELD_QUANTITATIVE_INDEX = { + 'Common': POSITION_FIELD_NOMINAL_INDEX.Common.concat([ + { prop: 'stack' } + ]) +}; +var COLOR_CHANNEL_FIELD_INDEX = { + 'Legend': ['orient', 'title', 'type'].map(function (p) { return ({ prop: 'legend', nestedProp: p }); }), + 'Scale': ['type', 'domain', 'scheme'].map(function (p) { return ({ prop: 'scale', nestedProp: p }); }) +}; +var SIZE_CHANNEL_FIELD_INDEX = { + 'Legend': ['orient', 'title'].map(function (p) { return ({ prop: 'legend', nestedProp: p }); }), + 'Scale': ['type', 'domain', 'range'].map(function (p) { return ({ prop: 'scale', nestedProp: p }); }) +}; +var SHAPE_CHANNEL_FIELD_INDEX = { + 'Legend': LEGEND_ORIENT_TITLE, + 'Scale': ['domain', 'range'].map(function (p) { return ({ prop: 'scale', nestedProp: p }); }) +}; +// ------------------------------------------------------------------------------ +// Color Scheme Constants +// ------------------------------------------------------------------------------ +exports.CATEGORICAL_COLOR_SCHEMES = ['accent', 'category10', 'category20', 'category20b', 'category20c', 'dark2', + 'paired', 'pastel1', 'pastel1', 'set1', 'set2', 'set3', 'tableau10', 'tableau20']; +exports.SEQUENTIAL_COLOR_SCHEMES = ['blues', 'greens', 'greys', 'purples', 'reds', 'oranges', 'viridis', 'inferno', + 'magma', 'plasma', 'bluegreen', 'bluepurple', 'greenblue', 'orangered', 'blueorange']; +// ------------------------------------------------------------------------------ +// Generator/Factory Methods +// ------------------------------------------------------------------------------ +function generatePropertyEditorSchema(prop, nestedProp, propTab, fieldDef, channel) { + var title = generateTitle(prop, nestedProp, propTab); + var propertyKey = nestedProp ? prop + '_' + nestedProp : prop; + switch (prop) { + case 'scale': + var scaleTypes = getSupportedScaleTypes(channel, fieldDef); + return generateScaleEditorSchema(nestedProp, scaleTypes, fieldDef, title, propertyKey); + case 'axis': + return generateAxisEditorSchema(nestedProp, channel, title, propertyKey); + case 'stack': + return generateSelectSchema('stack', vlSchema.definitions.StackOffset.enum, title); + case 'legend': + return generateLegendEditorSchema(nestedProp, title, propertyKey); + case 'format': + return generateTextBoxSchema('format', '', title, 'string'); + default: + throw new Error('Property combination not recognized'); + } +} +exports.generatePropertyEditorSchema = generatePropertyEditorSchema; +function generateLegendEditorSchema(legendProp, title, propertyKey) { + switch (legendProp) { + case 'orient': + return generateSelectSchema(propertyKey, vlSchema.definitions.LegendOrient.enum, title); + case 'title': + return generateTextBoxSchema(propertyKey, '', title, 'string'); + case 'type': + return generateSelectSchema(propertyKey, vlSchema.definitions.Legend.properties.type.enum, title); + default: + throw new Error('Property combination not recognized'); + } +} +function generateAxisEditorSchema(axisProp, channel, title, propertyKey) { + switch (axisProp) { + case 'orient': + return generateSelectSchema(propertyKey, channel === 'y' ? ['left', 'right'] : ['top', 'bottom'], title); + case 'title': + return generateTextBoxSchema(propertyKey, '', title, 'string'); + default: + throw new Error('Property combination not recognized'); + } +} +function generateScaleEditorSchema(scaleProp, scaleTypes, fieldDef, title, propertyKey) { + switch (scaleProp) { + case 'type': + return generateSelectSchema(propertyKey, scaleTypes, title); + case 'scheme': + return generateSelectSchema(propertyKey, isContinuous(fieldDef) ? exports.SEQUENTIAL_COLOR_SCHEMES : + exports.CATEGORICAL_COLOR_SCHEMES, title); + case 'range': + case 'domain': + return generateTextBoxSchema(propertyKey, isDiscrete(fieldDef) ? + 'a, b, c, ...' : 'Min Number, Max Number', title, 'string'); + default: + throw new Error('Provided property is not supported'); + } +} +// TODO: Eventually refactor to Vega-Lite +function getSupportedScaleTypes(channel, fieldDef) { + switch (fieldDef.type) { + case expandedtype_1.ExpandedType.QUANTITATIVE: + if (util_1.contains([channel_1.Channel.X, channel_1.Channel.Y], channel)) { + return ["linear", "log", "pow", "sqrt"]; + } + else if (channel === channel_1.Channel.COLOR) { + return ["linear", "pow", "sqrt", "log", "sequential"]; + } + else if (channel === channel_1.Channel.SIZE) { + return ["linear", "pow", "sqrt", "log"]; + } + else { + return []; + } + case expandedtype_1.ExpandedType.ORDINAL: + case expandedtype_1.ExpandedType.NOMINAL: + if (util_1.contains([channel_1.Channel.X, channel_1.Channel.Y], channel)) { + return ["point", "band"]; + } + else if (channel === channel_1.Channel.COLOR) { + return ["ordinal"]; + } + else if (channel === channel_1.Channel.SIZE) { + return ["point", "band"]; + } + else { + return []; + } + case expandedtype_1.ExpandedType.TEMPORAL: + if (util_1.contains([channel_1.Channel.X, channel_1.Channel.Y], channel)) { + return ["time", "utc"]; + } + else if (channel === channel_1.Channel.COLOR) { + return ["time", "utc", "sequential"]; + } + else if (channel === channel_1.Channel.SIZE) { + return ["time", "utc"]; + } + else { + return []; + } + default: + return []; + } +} +function generateSelectSchema(propertyKey, enumVals, title) { + var schema = { + type: 'object', + properties: (_a = {}, + _a[propertyKey] = { + type: 'string', + title: title, + enum: enumVals + }, + _a) + }; + var uiSchema = (_b = {}, + _b[propertyKey] = { + 'ui:widget': 'select', + 'ui:placeholder': 'auto', + 'ui:emptyValue': 'auto' + }, + _b); + return { schema: schema, uiSchema: uiSchema }; + var _a, _b; +} +function generateTextBoxSchema(propKey, placeHolderText, title, primitiveType) { + var schema = { + type: 'object', + properties: (_a = {}, + _a[propKey] = { + title: title, + type: primitiveType + }, + _a) + }; + var uiSchema = (_b = {}, + _b[propKey] = { + 'ui:emptyValue': '', + 'ui:placeholder': placeHolderText + }, + _b); + return { schema: schema, uiSchema: uiSchema }; + var _a, _b; +} +function getFieldPropertyGroupIndex(shelfId, fieldDef) { + if (fieldDef && (shelfId.channel === channel_1.Channel.X || shelfId.channel === channel_1.Channel.Y)) { + switch (fieldDef.type) { + case expandedtype_1.ExpandedType.QUANTITATIVE: + return POSITION_FIELD_QUANTITATIVE_INDEX; + case expandedtype_1.ExpandedType.ORDINAL: + return POSITION_FIELD_NOMINAL_INDEX; + case expandedtype_1.ExpandedType.NOMINAL: + return POSITION_FIELD_NOMINAL_INDEX; + case expandedtype_1.ExpandedType.TEMPORAL: + return POSITION_FIELD_TEMPORAL_INDEX; + } + } + else if (shelfId.channel === channel_1.Channel.COLOR) { + return COLOR_CHANNEL_FIELD_INDEX; + } + else if (shelfId.channel === channel_1.Channel.SIZE) { + return SIZE_CHANNEL_FIELD_INDEX; + } + else if (shelfId.channel === channel_1.Channel.SHAPE) { + return SHAPE_CHANNEL_FIELD_INDEX; + } +} +exports.getFieldPropertyGroupIndex = getFieldPropertyGroupIndex; +function generateFormData(shelfId, fieldDef) { + var index = getFieldPropertyGroupIndex(shelfId, fieldDef); + var formDataIndex = {}; + for (var _i = 0, _a = Object.keys(index); _i < _a.length; _i++) { + var key = _a[_i]; + for (var _b = 0, _c = index[key]; _b < _c.length; _b++) { + var customProp = _c[_b]; + var prop = customProp.prop; + var nestedProp = customProp.nestedProp; + var propertyKey = nestedProp ? prop + '_' + nestedProp : prop; + var formData = fieldDef[prop] ? nestedProp ? fieldDef[prop][nestedProp] : fieldDef[prop] : undefined; + // Display empty string when '?' is passed in to retrieve default value + // '?' is passed when formData is empty to avoid passing in empty string as a property/nestedProp value + formDataIndex[propertyKey] = formData === undefined ? '' : formData; + } + } + return formDataIndex; +} +exports.generateFormData = generateFormData; +// ------------------------------------------------------------------------------ +// General-Purpose Helper Methods +// ------------------------------------------------------------------------------ +function isContinuous(fieldDef) { + return util_1.contains([expandedtype_1.ExpandedType.ORDINAL, expandedtype_1.ExpandedType.TEMPORAL, expandedtype_1.ExpandedType.QUANTITATIVE], fieldDef.type); +} +exports.isContinuous = isContinuous; +function isDiscrete(fieldDef) { + return !isContinuous(fieldDef); +} +exports.isDiscrete = isDiscrete; +// Capitalize first letter for aesthetic purposes in form +function toTitleCase(str) { + return str.replace(/\w\S*/g, function (txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); +} +// Generate title for react-form with appropriate casing, prop, nestedProp +function generateTitle(prop, nestedProp, propTab) { + var title; + if (propTab === 'Common') { + title = nestedProp ? prop + ' ' + nestedProp : prop; + } + else { + title = nestedProp || prop; + } + return toTitleCase(title); +} +//# sourceMappingURL=property-editor-schema.js.map \ No newline at end of file diff --git a/build/components/encoding-pane/property-editor-schema.js.map b/build/components/encoding-pane/property-editor-schema.js.map new file mode 100644 index 000000000..55fdacdf0 --- /dev/null +++ b/build/components/encoding-pane/property-editor-schema.js.map @@ -0,0 +1 @@ +{"version":3,"file":"property-editor-schema.js","sourceRoot":"","sources":["../../../src/components/encoding-pane/property-editor-schema.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/encoding-pane/property-editor.d.ts b/build/components/encoding-pane/property-editor.d.ts new file mode 100644 index 000000000..b7ba2f159 --- /dev/null +++ b/build/components/encoding-pane/property-editor.d.ts @@ -0,0 +1,19 @@ +/// +import * as React from 'react'; +import { ActionHandler } from '../../actions'; +import { SpecEncodingAction } from '../../actions/shelf'; +import { ShelfFieldDef, ShelfId } from '../../models/shelf/spec'; +export interface PropertyEditorProps extends ActionHandler { + prop: string; + nestedProp: string; + propTab: string; + shelfId: ShelfId; + fieldDef: ShelfFieldDef; +} +export declare class PropertyEditorBase extends React.PureComponent { + constructor(props: PropertyEditorProps); + render(): JSX.Element; + protected changeFieldProperty(result: any): void; + private parseFormDataResult(result); +} +export declare const PropertyEditor: typeof PropertyEditorBase; diff --git a/build/components/encoding-pane/property-editor.js b/build/components/encoding-pane/property-editor.js new file mode 100644 index 000000000..cbe3f5aaf --- /dev/null +++ b/build/components/encoding-pane/property-editor.js @@ -0,0 +1,98 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var expandedtype_1 = require("compassql/build/src/query/expandedtype"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_jsonschema_form_1 = require("react-jsonschema-form"); +var throttle_debounce_1 = require("throttle-debounce"); +var shelf_1 = require("../../actions/shelf"); +var spec_1 = require("../../models/shelf/spec"); +var property_editor_schema_1 = require("./property-editor-schema"); +var styles = require("./property-editor.scss"); +var PropertyEditorBase = (function (_super) { + __extends(PropertyEditorBase, _super); + function PropertyEditorBase(props) { + var _this = _super.call(this, props) || this; + _this.changeFieldProperty = _this.changeFieldProperty.bind(_this); + _this.changeFieldProperty = throttle_debounce_1.debounce(500, _this.changeFieldProperty); + return _this; + } + PropertyEditorBase.prototype.render = function () { + var _a = this.props, prop = _a.prop, nestedProp = _a.nestedProp, propTab = _a.propTab, shelfId = _a.shelfId, fieldDef = _a.fieldDef; + if (!spec_1.isWildcardChannelId(shelfId)) { + var _b = property_editor_schema_1.generatePropertyEditorSchema(prop, nestedProp, propTab, fieldDef, shelfId.channel), schema = _b.schema, uiSchema = _b.uiSchema; + var formData = property_editor_schema_1.generateFormData(shelfId, fieldDef); + return (React.createElement("div", { styleName: "property-editor" }, + React.createElement(react_jsonschema_form_1.default, { schema: schema, uiSchema: uiSchema, formData: formData, onChange: this.changeFieldProperty }, + React.createElement("button", { type: "submit", style: { display: 'none' } }, "Submit")))); + } + }; + PropertyEditorBase.prototype.changeFieldProperty = function (result) { + var _a = this.props, prop = _a.prop, nestedProp = _a.nestedProp, shelfId = _a.shelfId, handleAction = _a.handleAction; + var value = this.parseFormDataResult(result.formData[Object.keys(result.formData)[0]]); + if (nestedProp) { + handleAction({ + type: shelf_1.SPEC_FIELD_NESTED_PROP_CHANGE, + payload: { + shelfId: shelfId, + prop: prop, + nestedProp: nestedProp, + value: value + } + }); + } + else { + handleAction({ + type: shelf_1.SPEC_FIELD_PROP_CHANGE, + payload: { + shelfId: shelfId, + prop: prop, + value: value + } + }); + } + }; + PropertyEditorBase.prototype.parseFormDataResult = function (result) { + var _a = this.props, fieldDef = _a.fieldDef, prop = _a.prop, nestedProp = _a.nestedProp; + var reg = /\s*,\s*/; // regex for parsing comma delimited strings + if (result === '') { + return undefined; + } + if (prop === 'scale') { + if (nestedProp === 'range') { + var range = result.split(reg); + if (property_editor_schema_1.isContinuous(fieldDef) && range.length !== 2) { + throw new Error('Invalid format for range. Must follow format: Min Number, Max Number'); + } + return result === '' ? undefined : range; + } + else if (nestedProp === 'domain') { + var domain = result.split(reg); + if (fieldDef.type === expandedtype_1.ExpandedType.QUANTITATIVE && domain.length !== 2) { + throw new Error('Invalid format for domain. Must follow format: Min Number, Max Number'); + } + else if (fieldDef.type === expandedtype_1.ExpandedType.TEMPORAL) { + // TODO: Not supported yet + throw new Error('Voyager does not currently support temporal domain values'); + } + return result === '' ? undefined : domain; + } + } + // if form data is empty, default to auto suggested view, which is ? in compass + return result === '' ? undefined : result; + }; + return PropertyEditorBase; +}(React.PureComponent)); +exports.PropertyEditorBase = PropertyEditorBase; +exports.PropertyEditor = CSSModules(PropertyEditorBase, styles); +//# sourceMappingURL=property-editor.js.map \ No newline at end of file diff --git a/build/components/encoding-pane/property-editor.js.map b/build/components/encoding-pane/property-editor.js.map new file mode 100644 index 000000000..9ed49ad3e --- /dev/null +++ b/build/components/encoding-pane/property-editor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"property-editor.js","sourceRoot":"","sources":["../../../src/components/encoding-pane/property-editor.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/encoding-pane/property-editor.scss b/build/components/encoding-pane/property-editor.scss new file mode 100644 index 000000000..ebec6abed --- /dev/null +++ b/build/components/encoding-pane/property-editor.scss @@ -0,0 +1,19 @@ +.property-editor { + :global .form-group { + font-size: 11px; + + label { + font-size: 12px; + font-weight: bold; + margin: 5px; + } + + div { + display: inline-block; + } + + select:focus { + outline: none + } + } +} diff --git a/build/components/field/field.scss b/build/components/field/field.scss new file mode 100644 index 000000000..9f9d9d416 --- /dev/null +++ b/build/components/field/field.scss @@ -0,0 +1,243 @@ +$any-color: #bbb; +$any-hover-color: #666; + +.field { + display: flex; + vertical-align: middle; + border-radius: 3px; + line-height: 18px; + box-sizing: border-box; + height: 20px; + padding: 1px 3px; + font-size: 11px; + border: 1px solid transparent; + user-select: none; + overflow: hidden; +} + +.func { + text-transform: uppercase; + font-weight: 700; + font-size: 11px; + margin-right: 2px; + flex-shrink: 0; +} + +.field-pill { + @extend .field; + background-color: hsla(0,0%,93%,0.8); + font-weight: 500; + width: 100%; +} + + +.wildcard-field-pill { + @extend .field; + background-color:rgba(216, 250, 251, 0.8); + font-weight: 500; + width: 100%; +} + +.caret-type { + flex-shrink: 0; +} + +.type { + font-size: 0.8rem; + margin-right: 3px; + margin-right: 6px; + flex-shrink: 0; +} + +.text { + flex-grow: 1; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.fn-text { + @extend .text; + flex-grow: 1; + + &::before { + content: "("; + } + &::after { + content: ")"; + } +} + +.filter-button-unadded { + color: #7f7f7f; +} + +// .field-info { + + + +// .field-info-text { +// display: flex; +// flex-grow: 1; +// overflow: hidden; +// } + +// .field-func, .field-count { +// flex-shrink: 0; +// margin-right: 2px; +// } + +// .field-func { +// text-overflow: ellipsis; +// max-width: 75px; +// overflow: hidden; +// } +// } + +// .field-func, .field-count{ +// text-transform: uppercase; +// font-weight: bold; + +// font-size: 11px; +// &.any { +// color: $any-color; +// } +// } + +// .field-info .field-name { +// display: inline-block; +// overflow: hidden; +// text-overflow: ellipsis; + +// &.hasfunc { +// &::before { +// content:"(" +// } +// &::after { +// content:")" +// } +// &.any::before, &.any::after { +// color: $any-color; +// } +// } +// } + +// .field-info { +// .fa.fa-caret-down, .fa.fa-times, .fa.fa-filter, .fa.fa-plus { +// flex-shrink:0; +// // visibility: hidden; +// border-radius: 3px; +// margin-top: 1px; +// } +// .fa.fa-caret-down { +// padding: 2px 3px 1px; +// } +// .fa.fa-times, .fa.fa-filter, .fa.fa-plus { +// padding: 1px 2px; +// } + +// .filter, .add { +// margin-left: 2px; +// } + +// .type-caret .fa-caret-down { +// visibility:hidden; +// } + +// .type-caret.active { +// color: black; +// cursor: pointer; +// .fa-caret-down { +// visibility: visible; +// } +// } + +// .type-caret.active:hover .fa.fa-caret-down, .fa.fa-times:hover, +// .fa.fa-filter:hover, .fa.fa-plus:hover, +// &:hover .type-caret.active:hover .fa.fa-caret-down, +// &.highlighted .type-caret.active:hover .fa.fa-caret-down { +// color: white; +// background-color: #999; +// } + +// .type-caret.drop-enabled .fa.fa-caret-down { +// background-color: #bbb; +// color: black; +// } +// } + +// .field-info.unselected { +// border: 1px dashed hsla(0,0%,0%,0.15); +// background-color: #fafafa; +// } + +// .field-info.selected { +// border: 1px solid hsla(0,0%,0%,0.15); +// background-color: hsla(0,0%,93%,0.8); +// font-weight: 500; +// } + +// .field-info, .field-info.selected, .field-info.unselected, .field-info.pill { +// &.any { +// background-color: rgb(216,250,251); +// opacity: 0.8; +// } +// &.enumerated-field { +// background-color: rgba(216,250,251,0.7); +// opacity: 0.8; +// } + +// &.enumerated-channel { +// border: 1px dashed hsla(185,80%,29%,0.35); +// opacity: 0.8; +// } +// } + + +// .field-info.list-item { // TODO: remove as it's not used on Voyager2 +// margin-bottom: 4px; +// } + +// .field-info.highlighted, +// .field-info.highlighted.any, +// .field-info.highlighted.enumerated-field, +// .field-info.highlighted.enumerated-channel, +// .field-list-item:hover .field-info { +// border-style: solid; +// background-color: #c6e5ff; +// font-weight: 500; + +// .field-func, .field-count{ +// &.any { +// color: $any-hover-color; +// } +// } + +// .field-info .field-name.hasfunc { +// &.any::before, &.any::after { +// color: $any-hover-color; +// } +// } +// } + +// .field-info.ui-draggable-dragging { +// min-width: 150px; +// width: auto; +// box-shadow: 2px 2px 1px rgba(0,0,0,0.2); + +// .info { +// display: none; +// } +// } + +// .tooltip-content { +// max-width: 300px; +// strong { +// width: 75px; +// display: inline-block; +// text-align: right; +// margin-right: 5px; +// } +// } + + diff --git a/build/components/field/index.d.ts b/build/components/field/index.d.ts new file mode 100644 index 000000000..aa196f082 --- /dev/null +++ b/build/components/field/index.d.ts @@ -0,0 +1,61 @@ +/// +/// +import { Schema } from 'compassql/build/src/schema'; +import * as React from 'react'; +import { DragElementWrapper } from 'react-dnd'; +import { OneOfFilter, RangeFilter } from 'vega-lite/build/src/filter'; +import { FieldParentType } from '../../constants'; +import { ShelfId } from '../../models/shelf'; +import { ShelfFieldDef } from '../../models/shelf'; +/** + * Props for react-dnd of Field + */ +export interface FieldDragSourceProps { + connectDragSource?: DragElementWrapper; + isDragging?: boolean; +} +export interface FieldPropsBase { + fieldDef: ShelfFieldDef; + isPill: boolean; + isEnumeratedWildcardField?: boolean; + parentId?: FieldParentId; + draggable: boolean; + /** + * Add field event handler. If not provided, add button will disappear. + */ + onAdd?: (fieldDef: ShelfFieldDef) => void; + onDoubleClick?: (fieldDef: ShelfFieldDef) => void; + /** Remove field event handler. If not provided, remove button will disappear. */ + onRemove?: () => void; + /** + * If filter button is shown, we need to the status whether it is active and an event handler for onToggle + */ + filter?: { + active: boolean; + onToggle: (fieldDef: ShelfFieldDef) => void; + }; + caretShow: boolean; + schema?: Schema; + /** If not provided, it does not have a popup */ + popupComponent?: JSX.Element; +} +export interface FieldProps extends FieldDragSourceProps, FieldPropsBase { +} +export interface FieldState { + popupIsOpened: boolean; +} +/** + * Type and Identifier of Field's parent component + */ +export declare type FieldParentId = { + type: typeof FieldParentType.ENCODING_SHELF; + id: ShelfId; +} | { + type: typeof FieldParentType.FIELD_LIST; +}; +export interface DraggedFieldIdentifier { + fieldDef: ShelfFieldDef; + parentId: FieldParentId; + filter: RangeFilter | OneOfFilter; +} +export declare const Field: () => React.PureComponent; diff --git a/build/components/field/index.js b/build/components/field/index.js new file mode 100644 index 000000000..fc17431b9 --- /dev/null +++ b/build/components/field/index.js @@ -0,0 +1,195 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var wildcard_1 = require("compassql/build/src/wildcard"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_dnd_1 = require("react-dnd"); +var TetherComponent = require("react-tether"); +var constants_1 = require("../../constants"); +var filter_1 = require("../../models/shelf/filter"); +var styles = require("./field.scss"); +; +; +var FieldBase = (function (_super) { + __extends(FieldBase, _super); + function FieldBase(props) { + var _this = _super.call(this, props) || this; + _this.fieldRefHandler = function (ref) { + _this.field = ref; + }; + _this.popupRefHandler = function (ref) { + _this.popup = ref; + }; + _this.state = ({ + popupIsOpened: false + }); + // Bind - https://facebook.github.io/react/docs/handling-events.html + _this.onFilterToggle = _this.onFilterToggle.bind(_this); + _this.onAdd = _this.onAdd.bind(_this); + _this.onDoubleClick = _this.onDoubleClick.bind(_this); + _this.togglePopup = _this.togglePopup.bind(_this); + return _this; + } + FieldBase.prototype.componentWillUpdate = function (nextProps, nextState) { + if (!nextState) { + return; + } + if (nextState.popupIsOpened) { + document.addEventListener('click', this.handleClickOutside.bind(this), true); + } + else if (this.state.popupIsOpened) { + document.removeEventListener('click', this.handleClickOutside.bind(this), true); + } + }; + FieldBase.prototype.render = function () { + var _a = this.props, connectDragSource = _a.connectDragSource, fieldDef = _a.fieldDef, isPill = _a.isPill, popupComponent = _a.popupComponent; + var fn = fieldDef.fn, field = fieldDef.field, description = fieldDef.description; + var isWildcardField = wildcard_1.isWildcard(field) || this.props.isEnumeratedWildcardField; + /** Whether the fieldDef has a function that involves field. (Count doesn't involve a specific field.) */ + var isFieldFn = fn && fn !== 'count'; + var fnName; + if (wildcard_1.isWildcard(fn)) { + fnName = (fn.enum.length > 1) ? '?' : fn.enum[0]; + } + else { + fnName = fn; + } + var component = (React.createElement("span", { styleName: isWildcardField ? 'wildcard-field-pill' : isPill ? 'field-pill' : 'field', onDoubleClick: this.onDoubleClick }, + this.renderCaretTypeSpan(), + this.renderFuncSpan(fnName), + React.createElement("span", { styleName: isFieldFn ? 'fn-text' : 'text' }, wildcard_1.isWildcard(field) ? description : field !== '*' ? field : ''), + this.renderAddFilterSpan(), + this.renderAddSpan(), + this.renderRemoveSpan())); + // Wrap with connect dragSource if it is injected + if (!popupComponent) { + return connectDragSource ? connectDragSource(component) : component; + } + else { + return (React.createElement("div", { ref: this.fieldRefHandler }, + React.createElement(TetherComponent, { attachment: "top left", targetAttachment: "bottom left" }, + connectDragSource ? connectDragSource(component) : component, + React.createElement("div", { ref: this.popupRefHandler }, this.state.popupIsOpened && popupComponent)))); + } + }; + FieldBase.prototype.onFilterToggle = function () { + var _a = this.props, filter = _a.filter, fieldDef = _a.fieldDef; + filter.onToggle(fieldDef); + }; + FieldBase.prototype.renderCaretTypeSpan = function () { + var _a = this.props, caretShow = _a.caretShow, fieldDef = _a.fieldDef, popupComponent = _a.popupComponent; + var type = fieldDef.type; + var icon = TYPE_ICONS[type]; + var title = TYPE_NAMES[type]; + return (React.createElement("span", { styleName: "caret-type", onClick: this.togglePopup }, + caretShow && React.createElement("i", { className: (popupComponent ? '' : 'hidden ') + 'fa fa-caret-down' }), + caretShow && ' ', + type && React.createElement("i", { className: 'fa ' + icon, styleName: "type", title: title }))); + }; + FieldBase.prototype.renderAddSpan = function () { + return this.props.onAdd && (React.createElement("span", null, + React.createElement("a", { onClick: this.onAdd }, + React.createElement("i", { className: "fa fa-plus" })))); + }; + FieldBase.prototype.renderRemoveSpan = function () { + var onRemove = this.props.onRemove; + return onRemove && (React.createElement("span", null, + React.createElement("a", { onClick: onRemove }, + React.createElement("i", { className: "fa fa-times" })))); + }; + FieldBase.prototype.renderAddFilterSpan = function () { + var _a = this.props, filter = _a.filter, fieldDef = _a.fieldDef; + if (filter && !wildcard_1.isWildcard(fieldDef.field)) { + var style = filter.active ? '' : 'filter-button-unadded'; + return this.props.filter && (React.createElement("span", { styleName: style }, + React.createElement("a", { onClick: this.onFilterToggle }, + React.createElement("i", { className: 'fa fa-filter' })))); + } + }; + FieldBase.prototype.renderFuncSpan = function (fnName) { + return (React.createElement("span", { styleName: "func", title: fnName }, fnName)); + }; + FieldBase.prototype.onAdd = function () { + this.props.onAdd(this.props.fieldDef); + }; + FieldBase.prototype.onDoubleClick = function () { + if (this.props.onDoubleClick) { + this.props.onDoubleClick(this.props.fieldDef); + } + }; + FieldBase.prototype.handleClickOutside = function (e) { + if (!this.field || this.field.contains(e.target) || this.popup.contains(e.target)) { + return; + } + this.closePopup(); + }; + FieldBase.prototype.closePopup = function () { + if (this.props.popupComponent) { + this.setState({ + popupIsOpened: false + }); + } + }; + FieldBase.prototype.togglePopup = function () { + if (this.props.popupComponent) { + this.setState({ + popupIsOpened: !this.state.popupIsOpened + }); + } + }; + return FieldBase; +}(React.PureComponent)); +; +// FIXME add icon for key +var TYPE_NAMES = { + nominal: 'text', + ordinal: 'text-ordinal', + quantitative: 'number', + temporal: 'time', + geographic: 'geo' +}; +var TYPE_ICONS = { + nominal: 'fa-font', + ordinal: 'fa-font', + quantitative: 'fa-hashtag', + temporal: 'fa-calendar', +}; +var fieldSource = { + beginDrag: function (props) { + var fieldDef = props.fieldDef, parentId = props.parentId, schema = props.schema; + var domain; + if (!wildcard_1.isWildcard(fieldDef.field) && fieldDef.field !== '*') { + domain = schema.domain({ field: fieldDef.field }); + } + var filter = filter_1.createDefaultFilter(fieldDef, domain); + return { fieldDef: fieldDef, parentId: parentId, filter: filter }; + }, + canDrag: function (props, monitor) { + return props.draggable; + } +}; +/** + * Specifies which props to inject into your component. + */ +var collect = function (connect, monitor) { + return { + // Call this function inside render() + // to let React DnD handle the drag events: + connectDragSource: connect.dragSource(), + // You can ask the monitor about the current drag state: + isDragging: monitor.isDragging() + }; +}; +// HACK: do type casting to suppress compile error for: https://github.com/Microsoft/TypeScript/issues/13526 +exports.Field = react_dnd_1.DragSource(constants_1.DraggableType.FIELD, fieldSource, collect)(CSSModules(FieldBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/field/index.js.map b/build/components/field/index.js.map new file mode 100644 index 000000000..297db2e76 --- /dev/null +++ b/build/components/field/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/field/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/filter-pane/filter-pane.scss b/build/components/filter-pane/filter-pane.scss new file mode 100644 index 000000000..5d3c83d36 --- /dev/null +++ b/build/components/filter-pane/filter-pane.scss @@ -0,0 +1,18 @@ +@import '../encoding-pane/placeholder.scss'; + +$radius: 3px; + +.filter-shelf { + background-color: white; + border-radius: $radius; + border: 1px solid #ddd; + margin-bottom: 4px; + max-height: 150px; + overflow: scroll; +} + +.filter-pane { + max-height: calc(40vh); + overflow-y: auto; + overflow-x: hidden; +} diff --git a/build/components/filter-pane/index.d.ts b/build/components/filter-pane/index.d.ts new file mode 100644 index 000000000..37f9950bb --- /dev/null +++ b/build/components/filter-pane/index.d.ts @@ -0,0 +1,22 @@ +/// +/// +import { Schema } from 'compassql/build/src/schema'; +import * as React from 'react'; +import { ConnectDropTarget } from 'react-dnd'; +import { OneOfFilter, RangeFilter } from 'vega-lite/build/src/filter'; +import { FilterAction } from '../../actions'; +import { ActionHandler } from '../../actions/redux-action'; +/** + * Props for react-dnd of FilterShelf + */ +export interface FilterPaneDropTargetProps { + connectDropTarget: ConnectDropTarget; + isOver: boolean; + item: Object; + canDrop: boolean; +} +export interface FilterPanePropsBase extends ActionHandler { + filters: Array; + schema: Schema; +} +export declare const FilterPane: () => React.PureComponent; diff --git a/build/components/filter-pane/index.js b/build/components/filter-pane/index.js new file mode 100644 index 000000000..aa1347365 --- /dev/null +++ b/build/components/filter-pane/index.js @@ -0,0 +1,185 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var expandedtype_1 = require("compassql/build/src/query/expandedtype"); +var wildcard_1 = require("compassql/build/src/wildcard"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_dnd_1 = require("react-dnd"); +var filter_1 = require("vega-lite/build/src/filter"); +var timeunit_1 = require("vega-lite/build/src/timeunit"); +var actions_1 = require("../../actions"); +var constants_1 = require("../../constants"); +var filter_2 = require("../../models/shelf/filter"); +var function_picker_1 = require("../encoding-pane/function-picker"); +var index_1 = require("../field/index"); +var styles = require("./filter-pane.scss"); +var one_of_filter_shelf_1 = require("./one-of-filter-shelf"); +var range_filter_shelf_1 = require("./range-filter-shelf"); +; +var FilterPaneBase = (function (_super) { + __extends(FilterPaneBase, _super); + function FilterPaneBase(props) { + var _this = _super.call(this, props) || this; + _this.filterModifyTimeUnit = _this.filterModifyTimeUnit.bind(_this); + return _this; + } + FilterPaneBase.prototype.render = function () { + var _this = this; + var _a = this.props, filters = _a.filters, connectDropTarget = _a.connectDropTarget; + var filterShelves = filters.map(function (filter, index) { + return _this.renderFilterShelf(filter, index); + }); + return connectDropTarget(React.createElement("div", { styleName: 'filter-pane' }, + filterShelves, + this.renderFieldPlaceholder())); + }; + FilterPaneBase.prototype.filterRemove = function (index) { + var handleAction = this.props.handleAction; + handleAction({ + type: actions_1.FILTER_REMOVE, + payload: { + index: index + } + }); + }; + FilterPaneBase.prototype.filterModifyTimeUnit = function (timeUnit, index) { + var _a = this.props, handleAction = _a.handleAction, schema = _a.schema, filters = _a.filters; + var domain = schema.domain({ field: filters[index].field }); + if (timeUnit === '-') { + timeUnit = undefined; + } + handleAction({ + type: actions_1.FILTER_MODIFY_TIME_UNIT, + payload: { + index: index, + domain: domain, + timeUnit: timeUnit + } + }); + }; + FilterPaneBase.prototype.renderFilterShelf = function (filter, index) { + var _this = this; + var _a = this.props, handleAction = _a.handleAction, schema = _a.schema; + var domain = schema.domain({ field: filter.field }); + var field = filter.field, timeUnit = filter.timeUnit; + var fieldSchema = schema.fieldSchema(filter.field); + var fieldDef = { + fn: timeUnit, + field: field, + type: fieldSchema.vlType + }; + var onFunctionChange = function (tu) { + _this.filterModifyTimeUnit(tu, index); + }; + var popupComponent = fieldDef.type === expandedtype_1.ExpandedType.TEMPORAL && + React.createElement(function_picker_1.FunctionPicker, { fieldDefParts: { + fn: timeUnit, + type: expandedtype_1.ExpandedType.TEMPORAL + }, onFunctionChange: onFunctionChange }); + var filterComponent; + if (filter_1.isRangeFilter(filter)) { + if (fieldDef.type === expandedtype_1.ExpandedType.TEMPORAL) { + domain = filter_2.getDefaultTimeRange(domain, timeUnit); + } + filterComponent = (React.createElement(range_filter_shelf_1.RangeFilterShelf, { domain: domain, filter: filter, index: index, renderDateTimePicker: this.renderDateTimePicker(fieldDef.type, timeUnit), handleAction: handleAction })); + } + else if (filter_1.isOneOfFilter(filter)) { + if (timeUnit) { + domain = filter_2.getDefaultList(timeUnit); + } + filterComponent = (React.createElement(one_of_filter_shelf_1.OneOfFilterShelf, { domain: domain, index: index, filter: filter, handleAction: handleAction })); + } + return (React.createElement("div", { styleName: 'filter-shelf', key: index }, + React.createElement(index_1.Field, { draggable: false, fieldDef: fieldDef, caretShow: true, isPill: true, onRemove: this.filterRemove.bind(this, index), popupComponent: popupComponent }), + filterComponent)); + }; + FilterPaneBase.prototype.renderFieldPlaceholder = function () { + var _a = this.props, item = _a.item, isOver = _a.isOver, canDrop = _a.canDrop; + var styleName, text; + if (item && !canDrop) { + styleName = 'placeholder-disabled'; + text = 'Cannot drop a field here'; + } + else { + styleName = isOver ? 'placeholder-over' : item ? 'placeholder-active' : 'placeholder'; + text = 'Drop a field here'; + } + return (React.createElement("span", { styleName: styleName }, text)); + }; + /** + * returns whether we should render date time picker instead of normal number input + */ + FilterPaneBase.prototype.renderDateTimePicker = function (type, timeUnit) { + if (!timeUnit) { + if (type === expandedtype_1.ExpandedType.QUANTITATIVE) { + return false; + } + else if (type === expandedtype_1.ExpandedType.TEMPORAL) { + return true; + } + } + switch (timeUnit) { + case timeunit_1.TimeUnit.YEAR: + case timeunit_1.TimeUnit.MONTH: + case timeunit_1.TimeUnit.DAY: + case timeunit_1.TimeUnit.DATE: + case timeunit_1.TimeUnit.HOURS: + case timeunit_1.TimeUnit.MINUTES: + case timeunit_1.TimeUnit.SECONDS: + case timeunit_1.TimeUnit.MILLISECONDS: + return false; + case timeunit_1.TimeUnit.YEARMONTHDATE: + return true; + default: + throw new Error(timeUnit + ' is not supported'); + } + }; + return FilterPaneBase; +}(React.PureComponent)); +var filterShelfTarget = { + drop: function (props, monitor) { + if (monitor.didDrop()) { + return; + } + var filter = monitor.getItem().filter; + if (wildcard_1.isWildcard(filter.field)) { + window.alert('Cannot add wildcard filter'); + throw new Error('Cannot add wildcard filter'); + } + if (filter_2.filterHasField(props.filters, filter.field)) { + window.alert('Cannot add more than one filter of the same field'); + return; + } + props.handleAction({ + type: actions_1.FILTER_ADD, + payload: { + filter: filter + } + }); + }, + canDrop: function (props, monitor) { + var fieldDef = monitor.getItem().fieldDef; + return !wildcard_1.isWildcard(fieldDef.field) && fieldDef.field !== '*'; + } +}; +var collect = function (connect, monitor) { + return { + connectDropTarget: connect.dropTarget(), + isOver: monitor.isOver(), + item: monitor.getItem(), + canDrop: monitor.canDrop() + }; +}; +// HACK: do type casting to suppress compile error for: https://github.com/Microsoft/TypeScript/issues/13526 +exports.FilterPane = react_dnd_1.DropTarget(constants_1.DraggableType.FIELD, filterShelfTarget, collect)(CSSModules(FilterPaneBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/filter-pane/index.js.map b/build/components/filter-pane/index.js.map new file mode 100644 index 000000000..e55db9f51 --- /dev/null +++ b/build/components/filter-pane/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/filter-pane/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/filter-pane/one-of-filter-shelf.d.ts b/build/components/filter-pane/one-of-filter-shelf.d.ts new file mode 100644 index 000000000..e94215df2 --- /dev/null +++ b/build/components/filter-pane/one-of-filter-shelf.d.ts @@ -0,0 +1,30 @@ +/// +import * as React from 'react'; +import { DateTime } from 'vega-lite/build/src/datetime'; +import { OneOfFilter } from 'vega-lite/build/src/filter'; +import { FilterAction } from '../../actions'; +export interface OneOfFilterShelfProps { + domain: string[] | number[] | boolean[] | DateTime[]; + filter: OneOfFilter; + index: number; + handleAction: (action: FilterAction) => void; +} +export interface OneOfFilterShelfState { + hideSearchBar: boolean; +} +export declare class OneOfFilterShelfBase extends React.PureComponent { + constructor(props: OneOfFilterShelfProps); + render(): JSX.Element; + protected filterModifyOneOf(index: number, oneOf: string[] | number[] | boolean[] | DateTime[]): void; + private toggleCheckbox(option); + private onSelectOne(value); + private onSelectAll(); + private onClearAll(); + private onClickSearch(); + private onSearch(e); + /** + * returns all div nodes in current filter shelf + */ + private getDivs(); +} +export declare const OneOfFilterShelf: typeof OneOfFilterShelfBase; diff --git a/build/components/filter-pane/one-of-filter-shelf.js b/build/components/filter-pane/one-of-filter-shelf.js new file mode 100644 index 000000000..26962d837 --- /dev/null +++ b/build/components/filter-pane/one-of-filter-shelf.js @@ -0,0 +1,123 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var actions_1 = require("../../actions"); +var util_1 = require("../../reducers/util"); +var styles = require("./one-of-filter-shelf.scss"); +var OneOfFilterShelfBase = (function (_super) { + __extends(OneOfFilterShelfBase, _super); + function OneOfFilterShelfBase(props) { + var _this = _super.call(this, props) || this; + _this.state = ({ + hideSearchBar: true + }); + return _this; + } + OneOfFilterShelfBase.prototype.render = function () { + var _this = this; + var _a = this.props, domain = _a.domain, filter = _a.filter, index = _a.index; + var oneOfFilter = domain.map(function (option) { + return (React.createElement("div", { key: option, className: 'option-div', styleName: 'option-row' }, + React.createElement("label", null, + React.createElement("input", { name: index.toString(), value: option, type: 'checkbox', checked: filter.oneOf.indexOf(option) !== -1, onChange: _this.toggleCheckbox.bind(_this, option) }), + " ", + '' + option), + React.createElement("span", { onClick: _this.onSelectOne.bind(_this, option), styleName: 'keep-only' }, "Keep Only"))); + }); + return (React.createElement("div", { id: index.toString() }, + React.createElement("div", { styleName: 'below-header' }, + React.createElement("span", null, + React.createElement("a", { styleName: 'select-all', onClick: this.onSelectAll.bind(this) }, "Select All"), + " /", + React.createElement("a", { styleName: 'clear-all', onClick: this.onClearAll.bind(this) }, "Clear All")), + this.state.hideSearchBar ? + null : + React.createElement("input", { type: 'text', onChange: this.onSearch.bind(this), autoFocus: true }), + React.createElement("a", { styleName: 'search', onClick: this.onClickSearch.bind(this) }, + React.createElement("i", { className: 'fa fa-search' }))), + oneOfFilter)); + }; + OneOfFilterShelfBase.prototype.filterModifyOneOf = function (index, oneOf) { + var handleAction = this.props.handleAction; + handleAction({ + type: actions_1.FILTER_MODIFY_ONE_OF, + payload: { + index: index, + oneOf: oneOf + } + }); + }; + OneOfFilterShelfBase.prototype.toggleCheckbox = function (option) { + var oneOf = this.props.filter.oneOf; + var valueIndex = oneOf.indexOf(option); + var changedSelectedValues; + if (valueIndex === -1) { + changedSelectedValues = util_1.insertItemToArray(oneOf, oneOf.length, option); + } + else { + changedSelectedValues = util_1.removeItemFromArray(oneOf, valueIndex).array; + } + this.filterModifyOneOf(this.props.index, changedSelectedValues); + }; + OneOfFilterShelfBase.prototype.onSelectOne = function (value) { + var index = this.props.index; + this.filterModifyOneOf(index, [value]); + }; + OneOfFilterShelfBase.prototype.onSelectAll = function () { + var _a = this.props, domain = _a.domain, index = _a.index; + this.filterModifyOneOf(index, domain.slice()); + }; + OneOfFilterShelfBase.prototype.onClearAll = function () { + var index = this.props.index; + this.filterModifyOneOf(index, []); + }; + OneOfFilterShelfBase.prototype.onClickSearch = function () { + if (!this.state.hideSearchBar) { + var divs = this.getDivs(); + Array.prototype.forEach.call(divs, function (div) { + div.style.display = 'block'; + }); + } + this.setState({ + hideSearchBar: !this.state.hideSearchBar + }); + }; + OneOfFilterShelfBase.prototype.onSearch = function (e) { + var searchedDivs = this.getDivs(); + Array.prototype.forEach.call(searchedDivs, function (searchedDiv) { + // its first child is label, the label's child is checkbox input + var searchedOption = searchedDiv.childNodes[0].childNodes[0]; + if (searchedOption.value.toLowerCase().indexOf(e.target.value.toLowerCase().trim()) === -1) { + searchedDiv.style.display = 'none'; + } + else { + searchedDiv.style.display = 'block'; + } + }); + }; + /** + * returns all div nodes in current filter shelf + */ + OneOfFilterShelfBase.prototype.getDivs = function () { + // select the current filter shelf + var container = document.getElementById(this.props.index.toString()); + // select all divs + var divs = container.getElementsByClassName('option-div'); + return divs; + }; + return OneOfFilterShelfBase; +}(React.PureComponent)); +exports.OneOfFilterShelfBase = OneOfFilterShelfBase; +exports.OneOfFilterShelf = CSSModules(OneOfFilterShelfBase, styles); +//# sourceMappingURL=one-of-filter-shelf.js.map \ No newline at end of file diff --git a/build/components/filter-pane/one-of-filter-shelf.js.map b/build/components/filter-pane/one-of-filter-shelf.js.map new file mode 100644 index 000000000..498f13620 --- /dev/null +++ b/build/components/filter-pane/one-of-filter-shelf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"one-of-filter-shelf.js","sourceRoot":"","sources":["../../../src/components/filter-pane/one-of-filter-shelf.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,8CAAgD;AAGhD,yCAAiE;AACjE,4CAA2E;AAC3E,mDAAqD;AAcrD;IAA0C,wCAAiE;IACzG,8BAAY,KAA4B;QAAxC,YACE,kBAAM,KAAK,CAAC,SAIb;QAHC,KAAI,CAAC,KAAK,GAAG,CAAC;YACZ,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;;IACL,CAAC;IAEM,qCAAM,GAAb;QAAA,iBA0CC;QAzCO,IAAA,eAAoC,EAAnC,kBAAM,EAAE,kBAAM,EAAE,gBAAK,CAAe;QAC3C,IAAM,WAAW,GAAI,MAAgB,CAAC,GAAG,CAAC,UAAA,MAAM;YAC9C,MAAM,CAAC,CACL,6BAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAC,YAAY,EAAC,SAAS,EAAC,YAAY;gBAC7D;oBACE,+BACE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAC,UAAU,EACf,OAAO,EAAG,MAAM,CAAC,KAAe,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACvD,QAAQ,EAAE,KAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAI,EAAE,MAAM,CAAC,GAChD;;oBAAE,EAAE,GAAG,MAAM,CACT;gBACR,8BAAM,OAAO,EAAE,KAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAI,EAAE,MAAM,CAAC,EAAE,SAAS,EAAC,WAAW,gBAElE,CACH,CACP,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,CACL,6BAAK,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE;YACvB,6BAAK,SAAS,EAAC,cAAc;gBAC3B;oBACE,2BAAG,SAAS,EAAC,YAAY,EAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,iBAE1D;;oBACJ,2BAAG,SAAS,EAAC,WAAW,EAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,gBAExD,CACC;gBACN,IAAI,CAAC,KAAK,CAAC,aAAa;oBACvB,IAAI;oBACJ,+BAAO,IAAI,EAAC,MAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG;gBAE3E,2BAAG,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC1D,2BAAG,SAAS,EAAC,cAAc,GAAE,CAC3B,CACA;YACL,WAAW,CACR,CACP,CAAC;IACJ,CAAC;IAES,gDAAiB,GAA3B,UAA4B,KAAa,EAAE,KAAmD;QACrF,IAAA,sCAAY,CAAe;QAClC,YAAY,CAAC;YACX,IAAI,EAAE,8BAAoB;YAC1B,OAAO,EAAE;gBACP,KAAK,OAAA;gBACL,KAAK,OAAA;aACN;SACF,CAAC,CAAC;IACL,CAAC;IAEO,6CAAc,GAAtB,UAAuB,MAA4C;QACjE,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;QACtC,IAAM,UAAU,GAAI,KAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,qBAAqB,CAAC;QAC1B,EAAE,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtB,qBAAqB,GAAG,wBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,qBAAqB,GAAG,0BAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAClE,CAAC;IAEO,0CAAW,GAAnB,UAAoB,KAA2C;QACtD,IAAA,wBAAK,CAAe;QAC3B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IAEO,0CAAW,GAAnB;QACQ,IAAA,eAA4B,EAA3B,kBAAM,EAAE,gBAAK,CAAe;QACnC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,yCAAU,GAAlB;QACS,IAAA,wBAAK,CAAe;QAC3B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;IAEO,4CAAa,GAArB;QACE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9B,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAC,GAAmB;gBACrD,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC;YACZ,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa;SACzC,CAAC,CAAC;IACL,CAAC;IAEO,uCAAQ,GAAhB,UAAiB,CAAM;QACrB,IAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAC,WAA2B;YACrE,gEAAgE;YAChE,IAAM,cAAc,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAqB,CAAC;YACnF,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3F,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACrC,CAAC;YAAC,IAAI,CAAC,CAAC;gBACN,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,sCAAO,GAAf;QACE,kCAAkC;QAClC,IAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvE,kBAAkB;QAClB,IAAM,IAAI,GAAG,SAAS,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC;IACd,CAAC;IACH,2BAAC;AAAD,CAAC,AA7HD,CAA0C,KAAK,CAAC,aAAa,GA6H5D;AA7HY,oDAAoB;AA8HpB,QAAA,gBAAgB,GAAG,UAAU,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/filter-pane/one-of-filter-shelf.scss b/build/components/filter-pane/one-of-filter-shelf.scss new file mode 100644 index 000000000..d4995b502 --- /dev/null +++ b/build/components/filter-pane/one-of-filter-shelf.scss @@ -0,0 +1,40 @@ +$margin: 4px; +$radius: 3px; + +.select-all, .clear-all { + color: #4B0082; + cursor: pointer; + font-size: 11px; + margin: $margin; +} + +.select-all:hover, .clear-all:hover { + color: #2980b9; +} + +.keep-only { + color: transparent; + cursor: pointer; + flex-grow: 1; + text-align: right; +} + +.keep-only:hover { + color: gray; +} + +.option-row { + margin: $margin; + display: flex; + justify-content: space-between; +} + +.search { + margin-right: 1px; +} + +.below-header { + display: flex; + justify-content: space-between; + margin: 2px; +} diff --git a/build/components/filter-pane/range-filter-shelf.d.ts b/build/components/filter-pane/range-filter-shelf.d.ts new file mode 100644 index 000000000..4800f2fa3 --- /dev/null +++ b/build/components/filter-pane/range-filter-shelf.d.ts @@ -0,0 +1,42 @@ +/// +import * as React from 'react'; +import { DateTime } from 'vega-lite/build/src/datetime'; +import { RangeFilter } from 'vega-lite/build/src/filter'; +import { FilterAction } from '../../actions'; +import { ActionHandler } from '../../actions/redux-action'; +export interface RangeFilterShelfProps extends ActionHandler { + domain: number[] | DateTime[]; + index: number; + filter: RangeFilter; + renderDateTimePicker: boolean; +} +export interface RangeFilterShelfState { + minDateTimePickerOpen: boolean; + maxDateTimePickerOpen: boolean; +} +export declare class RangeFilterShelfBase extends React.PureComponent { + constructor(props: RangeFilterShelfProps); + render(): JSX.Element; + protected filterModifyExtent(input: number[]): void; + protected filterModifyMaxBound(e: any): void; + protected filterModifyMinBound(e: any): void; + private renderNumberInput(bound); + private renderDateTimePicker(date, bound); + private focusInput(id); + private toggleMinDateTimePicker(); + private toggleMaxDateTimePicker(); + /** + * returns whether to show the time component in the date time picker + */ + private showTime(timeUnit); + /** + * Returns a function to format how the number is displayed in range filter for + * the given time unit. + */ + private getFormat(renderDateTime, timeUnit); + /** + * Returns the range filter step for the given time unit. + */ + private getStep(timeUnit); +} +export declare const RangeFilterShelf: typeof RangeFilterShelfBase; diff --git a/build/components/filter-pane/range-filter-shelf.js b/build/components/filter-pane/range-filter-shelf.js new file mode 100644 index 000000000..ca21403ef --- /dev/null +++ b/build/components/filter-pane/range-filter-shelf.js @@ -0,0 +1,280 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Slider = require("rc-slider"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var DateTimePicker = require("react-datetime"); +var TetherComponent = require("react-tether"); +var timeunit_1 = require("vega-lite/build/src/timeunit"); +var actions_1 = require("../../actions"); +var filter_1 = require("../../models/shelf/filter"); +var styles = require("./range-filter-shelf.scss"); +var RangeFilterShelfBase = (function (_super) { + __extends(RangeFilterShelfBase, _super); + function RangeFilterShelfBase(props) { + var _this = _super.call(this, props) || this; + _this.state = ({ + minDateTimePickerOpen: false, + maxDateTimePickerOpen: false + }); + _this.filterModifyExtent = _this.filterModifyExtent.bind(_this); + _this.filterModifyMaxBound = _this.filterModifyMaxBound.bind(_this); + _this.filterModifyMinBound = _this.filterModifyMinBound.bind(_this); + _this.toggleMinDateTimePicker = _this.toggleMinDateTimePicker.bind(_this); + _this.toggleMaxDateTimePicker = _this.toggleMaxDateTimePicker.bind(_this); + return _this; + } + RangeFilterShelfBase.prototype.render = function () { + var _a = this.props, filter = _a.filter, domain = _a.domain, renderDateTimePicker = _a.renderDateTimePicker; + var createSliderWithTooltip = Slider.createSliderWithTooltip; + var Range = createSliderWithTooltip(Slider.Range); + var minInput, maxInput, currMin, currMax, lowerBound, upperBound; + if (renderDateTimePicker) { + // when render date time picker, it must be an temporal filter, thus the range must be DateTime[]. + minInput = this.renderDateTimePicker(new Date(filter_1.convertToTimestamp(filter.range[0])), 'min'); + maxInput = this.renderDateTimePicker(new Date(filter_1.convertToTimestamp(filter.range[1])), 'max'); + currMin = filter_1.convertToTimestamp(filter.range[0]); + currMax = filter_1.convertToTimestamp(filter.range[1]); + lowerBound = Math.floor(filter_1.convertToTimestamp(domain[0])); + upperBound = Math.ceil(filter_1.convertToTimestamp(domain[1])); + } + else { + minInput = this.renderNumberInput('min'); + maxInput = this.renderNumberInput('max'); + currMin = filter.range[0]; + currMax = filter.range[1]; + // Math.floor/ceil because the slider requires the the difference between max and min + // must be a multiple of step (which is 1 by default) + lowerBound = Math.floor(Number(domain[0])); + upperBound = Math.ceil(Number(domain[1])); + } + return (React.createElement("div", { styleName: 'range-filter-pane' }, + React.createElement("div", null, + React.createElement("div", { styleName: 'bound' }, minInput), + React.createElement("div", { styleName: 'bound' }, maxInput)), + React.createElement(Range, { allowCross: false, defaultValue: [currMin, currMax], min: lowerBound, max: upperBound, onAfterChange: this.filterModifyExtent.bind(this), tipFormatter: this.getFormat(renderDateTimePicker, filter.timeUnit), step: this.getStep(filter.timeUnit) }))); + }; + RangeFilterShelfBase.prototype.filterModifyExtent = function (input) { + // filterModifyExtent is only triggered by slider, so input must be number[]. + var range; + if (this.props.renderDateTimePicker) { + range = [filter_1.convertToDateTimeObject(input[0]), filter_1.convertToDateTimeObject(input[1])]; + } + else { + range = input; + } + if (range[0] > range[1]) { + window.alert('Invalid bound'); + return; + } + var _a = this.props, handleAction = _a.handleAction, index = _a.index; + handleAction({ + type: actions_1.FILTER_MODIFY_EXTENT, + payload: { + index: index, + range: range + } + }); + }; + RangeFilterShelfBase.prototype.filterModifyMaxBound = function (e) { + var maxBound; + if (e.hasOwnProperty('target')) { + maxBound = Number(e.target.value); + } + else { + maxBound = e; + } + var _a = this.props, handleAction = _a.handleAction, index = _a.index; + if (this.props.renderDateTimePicker) { + maxBound = filter_1.convertToDateTimeObject(maxBound); + } + var minBound = this.props.filter.range[0]; + if (maxBound < minBound) { + window.alert('Maximum bound cannot be smaller than minimum bound'); + return; + } + handleAction({ + type: actions_1.FILTER_MODIFY_MAX_BOUND, + payload: { + index: index, + maxBound: maxBound + } + }); + }; + RangeFilterShelfBase.prototype.filterModifyMinBound = function (e) { + var minBound; + if (e.hasOwnProperty('target')) { + minBound = Number(e.target.value); + } + else { + minBound = e; + } + var _a = this.props, handleAction = _a.handleAction, index = _a.index, renderDateTimePicker = _a.renderDateTimePicker; + if (renderDateTimePicker) { + minBound = filter_1.convertToDateTimeObject(minBound); + } + var range = this.props.filter.range; + var maxBound = range[1]; + if (minBound > maxBound) { + window.alert('Minimum bound cannot be greater than maximum bound'); + return; + } + handleAction({ + type: actions_1.FILTER_MODIFY_MIN_BOUND, + payload: { + index: index, + minBound: minBound + } + }); + }; + RangeFilterShelfBase.prototype.renderNumberInput = function (bound) { + var filter = this.props.filter; + var onChangeAction, value; + if (bound === 'min') { + onChangeAction = this.filterModifyMinBound; + value = filter.range[0]; + } + else if (bound === 'max') { + onChangeAction = this.filterModifyMaxBound; + value = filter.range[1]; + } + return (React.createElement("div", null, + bound, + ":", + React.createElement("a", { onClick: this.focusInput.bind(this, filter.field + "_" + bound) }, + React.createElement("i", { className: "fa fa-pencil" })), + React.createElement("input", { id: filter.field + "_" + bound, type: 'number', value: value.toString(), onChange: onChangeAction }))); + }; + RangeFilterShelfBase.prototype.renderDateTimePicker = function (date, bound) { + var onChangeAction, dateTimePickerOpen, dataTimePickerOpenAction; + if (bound === 'min') { + onChangeAction = this.filterModifyMinBound; + dateTimePickerOpen = this.state.minDateTimePickerOpen; + dataTimePickerOpenAction = this.toggleMinDateTimePicker; + } + else if (bound === 'max') { + onChangeAction = this.filterModifyMaxBound; + dateTimePickerOpen = this.state.maxDateTimePickerOpen; + dataTimePickerOpenAction = this.toggleMaxDateTimePicker; + } + return (React.createElement("div", null, + React.createElement(TetherComponent, { attachment: 'bottom center' }, + React.createElement("div", { styleName: 'bound' }, + bound, + ":", + React.createElement("a", { onClick: dataTimePickerOpenAction }, + React.createElement("i", { className: "fa fa-pencil" })), + date.toString()), + dateTimePickerOpen && + React.createElement("div", { styleName: 'date-time-picker-wrapper' }, + React.createElement(DateTimePicker, { defaultValue: date, timeFormat: this.showTime(this.props.filter.timeUnit), open: false, onChange: onChangeAction, disableOnClickOutside: false }))))); + }; + RangeFilterShelfBase.prototype.focusInput = function (id) { + document.getElementById(id).focus(); + }; + RangeFilterShelfBase.prototype.toggleMinDateTimePicker = function () { + this.setState({ + minDateTimePickerOpen: !this.state.minDateTimePickerOpen + }); + }; + RangeFilterShelfBase.prototype.toggleMaxDateTimePicker = function () { + this.setState({ + maxDateTimePickerOpen: !this.state.maxDateTimePickerOpen + }); + }; + /** + * returns whether to show the time component in the date time picker + */ + RangeFilterShelfBase.prototype.showTime = function (timeUnit) { + switch (timeUnit) { + case undefined: + case timeunit_1.TimeUnit.YEAR: + case timeunit_1.TimeUnit.MONTH: + case timeunit_1.TimeUnit.DAY: + case timeunit_1.TimeUnit.DATE: + case timeunit_1.TimeUnit.HOURS: + case timeunit_1.TimeUnit.MINUTES: + case timeunit_1.TimeUnit.SECONDS: + case timeunit_1.TimeUnit.MILLISECONDS: + return true; + case timeunit_1.TimeUnit.YEARMONTHDATE: + // hide time component as we do not care about it + return false; + default: + throw new Error(timeUnit + ' is not supported'); + } + }; + /** + * Returns a function to format how the number is displayed in range filter for + * the given time unit. + */ + RangeFilterShelfBase.prototype.getFormat = function (renderDateTime, timeUnit) { + if (!timeUnit) { + if (renderDateTime) { + // temporal filter without time unit + // TODO: https://github.com/vega/voyager/issues/443: use the time formatter Vega derives from D3 + return function (value) { + return new Date(value).toString(); + }; + } + else { + // quantitative filter + return; + } + } + switch (timeUnit) { + case timeunit_1.TimeUnit.YEAR: + case timeunit_1.TimeUnit.MONTH: + case timeunit_1.TimeUnit.DAY: + case timeunit_1.TimeUnit.DATE: + case timeunit_1.TimeUnit.HOURS: + case timeunit_1.TimeUnit.MINUTES: + case timeunit_1.TimeUnit.SECONDS: + case timeunit_1.TimeUnit.MILLISECONDS: + // do not need to format these time units. + return; + case timeunit_1.TimeUnit.YEARMONTHDATE: + // TODO: https://github.com/vega/voyager/issues/443: use the time formatter Vega derives from D3 + return function (value) { + return new Date(value).toString(); + }; + default: + throw new Error(timeUnit + ' is not supported'); + } + }; + /** + * Returns the range filter step for the given time unit. + */ + RangeFilterShelfBase.prototype.getStep = function (timeUnit) { + switch (timeUnit) { + case undefined: + case timeunit_1.TimeUnit.YEAR: + case timeunit_1.TimeUnit.MONTH: + case timeunit_1.TimeUnit.DAY: + case timeunit_1.TimeUnit.DATE: + case timeunit_1.TimeUnit.HOURS: + case timeunit_1.TimeUnit.MINUTES: + case timeunit_1.TimeUnit.SECONDS: + case timeunit_1.TimeUnit.MILLISECONDS: + return 1; + case timeunit_1.TimeUnit.YEARMONTHDATE: + return 24 * 60 * 60 * 1000; // step is one day in timestamp + default: + throw new Error(timeUnit + ' is not supported'); + } + }; + return RangeFilterShelfBase; +}(React.PureComponent)); +exports.RangeFilterShelfBase = RangeFilterShelfBase; +exports.RangeFilterShelf = CSSModules(RangeFilterShelfBase, styles); +//# sourceMappingURL=range-filter-shelf.js.map \ No newline at end of file diff --git a/build/components/filter-pane/range-filter-shelf.js.map b/build/components/filter-pane/range-filter-shelf.js.map new file mode 100644 index 000000000..30b2db791 --- /dev/null +++ b/build/components/filter-pane/range-filter-shelf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"range-filter-shelf.js","sourceRoot":"","sources":["../../../src/components/filter-pane/range-filter-shelf.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/filter-pane/range-filter-shelf.scss b/build/components/filter-pane/range-filter-shelf.scss new file mode 100644 index 000000000..afec06f36 --- /dev/null +++ b/build/components/filter-pane/range-filter-shelf.scss @@ -0,0 +1,346 @@ +$border-width: 1px; +$border: $border-width solid #999; +$radius: 3px; + +.range-filter-pane { + width: 80%; + margin-left: auto; + margin-right: auto; + margin: 10px auto; + + input { + font-size: 11px; + border: 0; + outline: 0; + background: transparent; + padding-bottom: $border-width; + } + + input:focus, input:hover { + border-bottom: $border; + padding-bottom: 0; + } + + a { + display: inline; + } +} + +.bound { + font-size: 10px; +} + +.date-time-picker-wrapper { + padding: 5px; + background-color: #eee; + border: 1px solid #eee; + border-radius: 3px; +} + +$track-color: #1f77b4; +$active-color: #1f9cb4; + +:global { + .rc-slider { + position: relative; + height: 14px; + padding: 5px 0; + width: 100%; + border-radius: 6px; + -ms-touch-action: none; + touch-action: none; + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + } + .rc-slider * { + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + } + .rc-slider-rail { + position: absolute; + width: 100%; + background-color: #e9e9e9; + height: 4px; + border-radius: 6px; + } + .rc-slider-track { + position: absolute; + left: 0; + height: 4px; + border-radius: 6px; + background-color: $track-color; + } + .rc-slider-handle { + position: absolute; + margin-left: -7px; + margin-top: -5px; + width: 14px; + height: 14px; + cursor: pointer; + cursor: -webkit-grab; + cursor: grab; + border-radius: 50%; + border: solid 2px $track-color; + background-color: #fff; + -ms-touch-action: pan-x; + touch-action: pan-x; + } + .rc-slider-handle:hover { + border-color: $active-color; + } + .rc-slider-handle:active { + border-color: $active-color; + box-shadow: 0 0 5px $active-color; + cursor: -webkit-grabbing; + cursor: grabbing; + } + .rc-slider-mark { + position: absolute; + top: 18px; + left: 0; + width: 100%; + font-size: 12px; + } + .rc-slider-mark-text { + position: absolute; + display: inline-block; + vertical-align: middle; + text-align: center; + cursor: pointer; + color: #999; + } + .rc-slider-mark-text-active { + color: #666; + } + .rc-slider-step { + position: absolute; + width: 100%; + height: 4px; + background: transparent; + } + .rc-slider-dot { + position: absolute; + bottom: -2px; + margin-left: -4px; + width: 8px; + height: 8px; + border: 2px solid #e9e9e9; + background-color: #fff; + cursor: pointer; + border-radius: 50%; + vertical-align: middle; + } + .rc-slider-dot:first-child { + margin-left: -4px; + } + .rc-slider-dot:last-child { + margin-left: -4px; + } + .rc-slider-dot-active { + border-color: #96dbfa; + } + .rc-slider-disabled { + background-color: #e9e9e9; + } + .rc-slider-disabled .rc-slider-track { + background-color: #ccc; + } + .rc-slider-disabled .rc-slider-handle, + .rc-slider-disabled .rc-slider-dot { + border-color: #ccc; + box-shadow: none; + background-color: #fff; + cursor: not-allowed; + } + .rc-slider-disabled .rc-slider-mark-text, + .rc-slider-disabled .rc-slider-dot { + cursor: not-allowed !important; + } + .rc-slider-vertical { + width: 14px; + height: 100%; + padding: 0 5px; + } + .rc-slider-vertical .rc-slider-rail { + height: 100%; + width: 4px; + } + .rc-slider-vertical .rc-slider-track { + left: 5px; + bottom: 0; + width: 4px; + } + .rc-slider-vertical .rc-slider-handle { + margin-left: -5px; + margin-bottom: -7px; + -ms-touch-action: pan-y; + touch-action: pan-y; + } + .rc-slider-vertical .rc-slider-mark { + top: 0; + left: 18px; + height: 100%; + } + .rc-slider-vertical .rc-slider-step { + height: 100%; + width: 4px; + } + .rc-slider-vertical .rc-slider-dot { + left: 2px; + margin-bottom: -4px; + } + .rc-slider-vertical .rc-slider-dot:first-child { + margin-bottom: -4px; + } + .rc-slider-vertical .rc-slider-dot:last-child { + margin-bottom: -4px; + } + .rc-slider-tooltip-zoom-down-enter, + .rc-slider-tooltip-zoom-down-appear { + -webkit-animation-duration: .3s; + animation-duration: .3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + display: block !important; + -webkit-animation-play-state: paused; + animation-play-state: paused; + } + .rc-slider-tooltip-zoom-down-leave { + -webkit-animation-duration: .3s; + animation-duration: .3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + display: block !important; + -webkit-animation-play-state: paused; + animation-play-state: paused; + } + .rc-slider-tooltip-zoom-down-enter.rc-slider-tooltip-zoom-down-enter-active, + .rc-slider-tooltip-zoom-down-appear.rc-slider-tooltip-zoom-down-appear-active { + -webkit-animation-name: rcSliderTooltipZoomDownIn; + animation-name: rcSliderTooltipZoomDownIn; + -webkit-animation-play-state: running; + animation-play-state: running; + } + .rc-slider-tooltip-zoom-down-leave.rc-slider-tooltip-zoom-down-leave-active { + -webkit-animation-name: rcSliderTooltipZoomDownOut; + animation-name: rcSliderTooltipZoomDownOut; + -webkit-animation-play-state: running; + animation-play-state: running; + } + .rc-slider-tooltip-zoom-down-enter, + .rc-slider-tooltip-zoom-down-appear { + -webkit-transform: scale(0, 0); + transform: scale(0, 0); + -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); + } + .rc-slider-tooltip-zoom-down-leave { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + } + @-webkit-keyframes rcSliderTooltipZoomDownIn { + 0% { + opacity: 0; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(0, 0); + transform: scale(0, 0); + } + 100% { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + } + @keyframes rcSliderTooltipZoomDownIn { + 0% { + opacity: 0; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(0, 0); + transform: scale(0, 0); + } + 100% { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + } + @-webkit-keyframes rcSliderTooltipZoomDownOut { + 0% { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(0, 0); + transform: scale(0, 0); + } + } + @keyframes rcSliderTooltipZoomDownOut { + 0% { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(0, 0); + transform: scale(0, 0); + } + } + .rc-slider-tooltip { + position: absolute; + left: -9999px; + top: -9999px; + visibility: visible; + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + } + .rc-slider-tooltip * { + box-sizing: border-box; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + } + .rc-slider-tooltip-hidden { + display: none; + } + .rc-slider-tooltip-placement-top { + padding: 4px 0 8px 0; + } + .rc-slider-tooltip-inner { + padding: 6px 2px; + min-width: 24px; + height: 24px; + font-size: 12px; + line-height: 1; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #6c6c6c; + border-radius: 6px; + box-shadow: 0 0 4px #d9d9d9; + } + .rc-slider-tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } + .rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow { + bottom: 4px; + left: 50%; + margin-left: -4px; + border-width: 4px 4px 0; + border-top-color: #6c6c6c; + } +} diff --git a/build/components/footer/footer.scss b/build/components/footer/footer.scss new file mode 100644 index 000000000..f945f65ee --- /dev/null +++ b/build/components/footer/footer.scss @@ -0,0 +1,16 @@ +.footer { + background-color: transparent; + position: fixed; + left: 10px; + bottom: 10px; + + a { + color: #fff; + background-color: transparent; + text-decoration: none; + } + a:hover { + color: #ddd; + cursor: pointer; + } +} diff --git a/build/components/footer/index.d.ts b/build/components/footer/index.d.ts new file mode 100644 index 000000000..6244621b9 --- /dev/null +++ b/build/components/footer/index.d.ts @@ -0,0 +1,7 @@ +/// +import * as React from 'react'; +export declare class FooterBase extends React.PureComponent<{}, {}> { + render(): JSX.Element; + private exportLogs(); +} +export declare const Footer: typeof FooterBase; diff --git a/build/components/footer/index.js b/build/components/footer/index.js new file mode 100644 index 000000000..4f8470452 --- /dev/null +++ b/build/components/footer/index.js @@ -0,0 +1,39 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var Papa = require("papaparse"); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var fileDownload = require("react-file-download"); +var export_logs_1 = require("../../models/export-logs"); +var index_1 = require("../../store/index"); +var styles = require("./footer.scss"); +var FooterBase = (function (_super) { + __extends(FooterBase, _super); + function FooterBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + FooterBase.prototype.render = function () { + return (React.createElement("div", { styleName: 'footer' }, + React.createElement("a", { onClick: this.exportLogs }, "Download logs"))); + }; + FooterBase.prototype.exportLogs = function () { + var logs = export_logs_1.constructLogString(index_1.actionLogs.getLog().actions); + var csv = Papa.unparse(logs); + var fileName = "Logs_voyager_" + new Date() + ".csv"; + fileDownload(csv, fileName); + }; + return FooterBase; +}(React.PureComponent)); +exports.FooterBase = FooterBase; +exports.Footer = CSSModules(FooterBase, styles); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/footer/index.js.map b/build/components/footer/index.js.map new file mode 100644 index 000000000..082addf5f --- /dev/null +++ b/build/components/footer/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/footer/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,6BAA+B;AAC/B,8CAAgD;AAChD,kDAAoD;AACpD,wDAA4D;AAC5D,2CAA6C;AAC7C,sCAAwC;AAGxC;IAAgC,8BAA2B;IAA3D;;IAeA,CAAC;IAdQ,2BAAM,GAAb;QACE,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,QAAQ;YACrB,2BAAG,OAAO,EAAE,IAAI,CAAC,UAAU,oBAAmB,CAC1C,CACP,CAAC;IACJ,CAAC;IAEO,+BAAU,GAAlB;QACE,IAAM,IAAI,GAAG,gCAAkB,CAAC,kBAAU,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAM,QAAQ,GAAG,kBAAgB,IAAI,IAAI,EAAE,SAAM,CAAC;QAClD,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACH,iBAAC;AAAD,CAAC,AAfD,CAAgC,KAAK,CAAC,aAAa,GAelD;AAfY,gCAAU;AAiBV,QAAA,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/header/controls.d.ts b/build/components/header/controls.d.ts new file mode 100644 index 000000000..5c81d60c4 --- /dev/null +++ b/build/components/header/controls.d.ts @@ -0,0 +1,6 @@ +/// +import * as React from 'react'; +export declare class ControlsBase extends React.PureComponent<{}, {}> { + render(): JSX.Element; +} +export declare const Controls: typeof ControlsBase; diff --git a/build/components/header/controls.js b/build/components/header/controls.js new file mode 100644 index 000000000..8bda2b3a9 --- /dev/null +++ b/build/components/header/controls.js @@ -0,0 +1,33 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var bookmark_1 = require("../bookmark"); +var styles = require("./controls.scss"); +var undo_redo_1 = require("./undo-redo"); +var ControlsBase = (function (_super) { + __extends(ControlsBase, _super); + function ControlsBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + ControlsBase.prototype.render = function () { + return (React.createElement("div", { styleName: 'controls' }, + React.createElement(bookmark_1.BookmarkPane, null), + React.createElement(undo_redo_1.UndoRedo, null))); + }; + return ControlsBase; +}(React.PureComponent)); +exports.ControlsBase = ControlsBase; +; +exports.Controls = CSSModules(ControlsBase, styles); +//# sourceMappingURL=controls.js.map \ No newline at end of file diff --git a/build/components/header/controls.js.map b/build/components/header/controls.js.map new file mode 100644 index 000000000..ee25f822c --- /dev/null +++ b/build/components/header/controls.js.map @@ -0,0 +1 @@ +{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../src/components/header/controls.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,8CAAgD;AAChD,wCAAyC;AACzC,wCAA0C;AAC1C,yCAAuC;AAEvC;IAAkC,gCAA2B;IAA7D;;IASA,CAAC;IARQ,6BAAM,GAAb;QACE,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,UAAU;YACvB,oBAAC,uBAAY,OAAE;YACf,oBAAC,oBAAQ,OAAE,CACP,CACP,CAAC;IACJ,CAAC;IACH,mBAAC;AAAD,CAAC,AATD,CAAkC,KAAK,CAAC,aAAa,GASpD;AATY,oCAAY;AASxB,CAAC;AAEW,QAAA,QAAQ,GAAG,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/header/controls.scss b/build/components/header/controls.scss new file mode 100644 index 000000000..69ff34521 --- /dev/null +++ b/build/components/header/controls.scss @@ -0,0 +1,27 @@ +.controls { + display: inline-block; + margin-top: auto; + margin-bottom: auto; +} + +.controls div { + display: inline-block; +} + +.controls button { + font-size: 14px; + margin-left: 10px; + margin-right: 50px; + cursor: pointer; + border: none; + background-color: transparent; +} + +.controls button:focus { + outline: none; +} + +.controls button:disabled { + color: #ccc; + cursor: not-allowed; +} diff --git a/build/components/header/header.scss b/build/components/header/header.scss new file mode 100644 index 000000000..3fa839241 --- /dev/null +++ b/build/components/header/header.scss @@ -0,0 +1,26 @@ +$padding: 8px; + +.voyager-logo { + width: 176px; + height: 33px; + margin-right: 57px; +} + +.idl-logo { + position: absolute; + right: $padding; + display: inline-block; +} + +.idl-logo img { + width: 40px; +} + +.header { + background-color: white; + height: 33px; + padding: $padding; + display: flex; + justify-content: flex-start; + align-items: center; +} \ No newline at end of file diff --git a/build/components/header/index.d.ts b/build/components/header/index.d.ts new file mode 100644 index 000000000..6416324e7 --- /dev/null +++ b/build/components/header/index.d.ts @@ -0,0 +1,11 @@ +/// +import * as React from 'react'; +import { InlineData } from 'vega-lite/build/src/data'; +export interface HeaderProps { + data: InlineData; +} +export declare class HeaderBase extends React.PureComponent { + render(): JSX.Element; + private openLink(); +} +export declare const Header: React.ComponentClass<{}>; diff --git a/build/components/header/index.js b/build/components/header/index.js new file mode 100644 index 000000000..948d4398b --- /dev/null +++ b/build/components/header/index.js @@ -0,0 +1,45 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var idlLogo = require("../../../images/idl-h56.png"); +var logo = require("../../../images/logo.png"); +var dataset_1 = require("../../selectors/dataset"); +var controls_1 = require("./controls"); +var styles = require("./header.scss"); +var HeaderBase = (function (_super) { + __extends(HeaderBase, _super); + function HeaderBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + HeaderBase.prototype.render = function () { + var data = this.props.data; + return (React.createElement("div", { styleName: 'header' }, + React.createElement("img", { styleName: 'voyager-logo', src: logo }), + data && React.createElement(controls_1.Controls, null), + React.createElement("a", { styleName: 'idl-logo', onClick: this.openLink }, + React.createElement("img", { src: idlLogo })))); + }; + HeaderBase.prototype.openLink = function () { + window.open('https://idl.cs.washington.edu/'); + }; + return HeaderBase; +}(React.PureComponent)); +exports.HeaderBase = HeaderBase; +exports.Header = react_redux_1.connect(function (state) { + return { + data: dataset_1.selectData(state) + }; +})(CSSModules(HeaderBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/header/index.js.map b/build/components/header/index.js.map new file mode 100644 index 000000000..dec37217d --- /dev/null +++ b/build/components/header/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/header/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,8CAAgD;AAChD,2CAAoC;AAEpC,qDAAuD;AACvD,+CAAiD;AAEjD,mDAAmD;AACnD,uCAAoC;AACpC,sCAAwC;AAMxC;IAAgC,8BAAoC;IAApE;;IAkBA,CAAC;IAjBQ,2BAAM,GAAb;QACS,IAAA,sBAAI,CAAe;QAE1B,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,QAAQ;YACrB,6BAAK,SAAS,EAAC,cAAc,EAAC,GAAG,EAAE,IAAI,GAAG;YACzC,IAAI,IAAI,oBAAC,mBAAQ,OAAE;YACpB,2BAAG,SAAS,EAAC,UAAU,EAAC,OAAO,EAAE,IAAI,CAAC,QAAQ;gBAC5C,6BAAK,GAAG,EAAE,OAAO,GAAG,CAClB,CACA,CACP,CAAC;IACJ,CAAC;IAEO,6BAAQ,GAAhB;QACE,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IACH,iBAAC;AAAD,CAAC,AAlBD,CAAgC,KAAK,CAAC,aAAa,GAkBlD;AAlBY,gCAAU;AAoBV,QAAA,MAAM,GAAG,qBAAO,CAC3B,UAAC,KAAY;IACX,MAAM,CAAC;QACL,IAAI,EAAE,oBAAU,CAAC,KAAK,CAAC;KACxB,CAAC;AACJ,CAAC,CACF,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/header/undo-redo.d.ts b/build/components/header/undo-redo.d.ts new file mode 100644 index 000000000..046094417 --- /dev/null +++ b/build/components/header/undo-redo.d.ts @@ -0,0 +1,9 @@ +/// +import * as React from 'react'; +export interface UndoRedoProps { + canUndo: boolean; + canRedo: boolean; + onUndo: () => void; + onRedo: () => void; +} +export declare const UndoRedo: React.ComponentClass<{}>; diff --git a/build/components/header/undo-redo.js b/build/components/header/undo-redo.js new file mode 100644 index 000000000..106c83b46 --- /dev/null +++ b/build/components/header/undo-redo.js @@ -0,0 +1,46 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var react_redux_1 = require("react-redux"); +var undo_redo_1 = require("../../actions/undo-redo"); +var UndoRedoBase = (function (_super) { + __extends(UndoRedoBase, _super); + function UndoRedoBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + UndoRedoBase.prototype.render = function () { + var _a = this.props, canUndo = _a.canUndo, canRedo = _a.canRedo, onUndo = _a.onUndo, onRedo = _a.onRedo; + return (React.createElement("div", null, + React.createElement("button", { onClick: onUndo, disabled: !canUndo }, + React.createElement("i", { className: 'fa fa-undo' }), + " Undo"), + React.createElement("button", { onClick: onRedo, disabled: !canRedo }, + React.createElement("i", { className: 'fa fa-repeat' }), + " Redo"))); + }; + return UndoRedoBase; +}(React.PureComponent)); +exports.UndoRedo = react_redux_1.connect(function (state) { + return { + canUndo: state.undoable.past.length > 0, + canRedo: state.undoable.future.length > 0 + }; +}, function (dispatch) { return ({ + onUndo: function () { + dispatch({ type: undo_redo_1.UNDO }); + }, + onRedo: function () { + dispatch({ type: undo_redo_1.REDO }); + } +}); })(UndoRedoBase); +//# sourceMappingURL=undo-redo.js.map \ No newline at end of file diff --git a/build/components/header/undo-redo.js.map b/build/components/header/undo-redo.js.map new file mode 100644 index 000000000..f18d42c9c --- /dev/null +++ b/build/components/header/undo-redo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"undo-redo.js","sourceRoot":"","sources":["../../../src/components/header/undo-redo.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,2CAAoC;AACpC,qDAAmD;AAUnD;IAA2B,gCAAuC;IAAlE;;IAcA,CAAC;IAbQ,6BAAM,GAAb;QACQ,IAAA,eAA+C,EAA9C,oBAAO,EAAE,oBAAO,EAAE,kBAAM,EAAE,kBAAM,CAAe;QACtD,MAAM,CAAC,CACL;YACE,gCAAQ,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO;gBACzC,2BAAG,SAAS,EAAC,YAAY,GAAG;wBACrB;YACT,gCAAQ,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO;gBACzC,2BAAG,SAAS,EAAC,cAAc,GAAG;wBACvB,CACL,CACP,CAAC;IACJ,CAAC;IACH,mBAAC;AAAD,CAAC,AAdD,CAA2B,KAAK,CAAC,aAAa,GAc7C;AAEY,QAAA,QAAQ,GAAG,qBAAO,CAAC,UAAC,KAAY;IAC3C,MAAM,CAAC;QACL,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QACvC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;KAC1C,CAAC;AACJ,CAAC,EAAE,UAAA,QAAQ,IAAI,OAAA,CAAC;IACd,MAAM;QACJ,QAAQ,CAAC,EAAC,IAAI,EAAE,gBAAI,EAAC,CAAC,CAAC;IACzB,CAAC;IACD,MAAM;QACJ,QAAQ,CAAC,EAAC,IAAI,EAAE,gBAAI,EAAC,CAAC,CAAC;IACzB,CAAC;CACF,CAAC,EAPa,CAOb,CAAC,CAAC,YAAY,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/load-data-pane/index.d.ts b/build/components/load-data-pane/index.d.ts new file mode 100644 index 000000000..7abf1e1d1 --- /dev/null +++ b/build/components/load-data-pane/index.d.ts @@ -0,0 +1,10 @@ +/// +import * as React from 'react'; +import { VoyagerConfig } from '../../models/config'; +export interface DataPanelProps { + config: VoyagerConfig; +} +export declare class LoadDataBase extends React.PureComponent { + render(): JSX.Element; +} +export declare const LoadData: React.ComponentClass<{}>; diff --git a/build/components/load-data-pane/index.js b/build/components/load-data-pane/index.js new file mode 100644 index 000000000..fca4610f6 --- /dev/null +++ b/build/components/load-data-pane/index.js @@ -0,0 +1,45 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var index_1 = require("../../selectors/index"); +var data_selector_1 = require("../data-selector"); +var styles = require("./load-data-pane.scss"); +var LoadDataBase = (function (_super) { + __extends(LoadDataBase, _super); + function LoadDataBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + LoadDataBase.prototype.render = function () { + var showDataSourceSelector = this.props.config.showDataSourceSelector; + if (showDataSourceSelector) { + return (React.createElement("div", { className: "pane", styleName: "load-data-pane" }, + "Please load a dataset", + ' ', + React.createElement(data_selector_1.DataSelector, { title: "Load" }))); + } + else { + // TODO: Make this a config parameter of lib-voyager + return (React.createElement("div", { className: "pane", styleName: "load-data-pane" }, "Please load a dataset. (For the Electron app, please use the menu bar.)")); + } + }; + return LoadDataBase; +}(React.PureComponent)); +exports.LoadDataBase = LoadDataBase; +exports.LoadData = react_redux_1.connect(function (state) { + return { + config: index_1.selectConfig(state) + }; +})(CSSModules(LoadDataBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/load-data-pane/index.js.map b/build/components/load-data-pane/index.js.map new file mode 100644 index 000000000..76dee32ed --- /dev/null +++ b/build/components/load-data-pane/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/load-data-pane/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,8CAAgD;AAChD,2CAAoC;AAGpC,+CAAmD;AACnD,kDAA8C;AAC9C,8CAAgD;AAOhD;IAAkC,gCAAuC;IAAzE;;IAoBA,CAAC;IAnBQ,6BAAM,GAAb;QACS,IAAA,iEAAsB,CAAsB;QACnD,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,MAAM,EAAC,SAAS,EAAC,gBAAgB;;gBAE7C,GAAG;gBACJ,oBAAC,4BAAY,IAAC,KAAK,EAAC,MAAM,GAAE,CACxB,CACP,CAAC;QACJ,CAAC;QAAC,IAAI,CAAC,CAAC;YACN,oDAAoD;YACpD,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,MAAM,EAAC,SAAS,EAAC,gBAAgB,+EAE1C,CACP,CAAC;QACJ,CAAC;IACH,CAAC;IACH,mBAAC;AAAD,CAAC,AApBD,CAAkC,KAAK,CAAC,aAAa,GAoBpD;AApBY,oCAAY;AAsBZ,QAAA,QAAQ,GAAG,qBAAO,CAC7B,UAAC,KAAY;IACX,MAAM,CAAC;QACL,MAAM,EAAE,oBAAY,CAAC,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC,CACF,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/load-data-pane/load-data-pane.scss b/build/components/load-data-pane/load-data-pane.scss new file mode 100644 index 000000000..160e356b6 --- /dev/null +++ b/build/components/load-data-pane/load-data-pane.scss @@ -0,0 +1,5 @@ +.load-data-pane { + text-align: center; + margin-top: 100px; + font-size: 24px; +} \ No newline at end of file diff --git a/build/components/log-pane/index.d.ts b/build/components/log-pane/index.d.ts new file mode 100644 index 000000000..e3ec49d3d --- /dev/null +++ b/build/components/log-pane/index.d.ts @@ -0,0 +1,15 @@ +/// +import * as React from 'react'; +import { LogAction } from '../../actions/log'; +import { ActionHandler } from '../../actions/redux-action'; +import { Log } from '../../models/log'; +export interface LogPaneProps extends ActionHandler { + log: Log; +} +export declare class LogPaneBase extends React.PureComponent { + render(): JSX.Element; + protected closeWarnings(): void; + protected closeErrors(): void; + private returnLevelWarnings(warnings, level); +} +export declare const LogPane: React.ComponentClass<{}>; diff --git a/build/components/log-pane/index.js b/build/components/log-pane/index.js new file mode 100644 index 000000000..1934abff5 --- /dev/null +++ b/build/components/log-pane/index.js @@ -0,0 +1,70 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var log_1 = require("../../actions/log"); +var redux_action_1 = require("../../actions/redux-action"); +var index_1 = require("../../selectors/index"); +var styles = require("./log-pane.scss"); +var LogPaneBase = (function (_super) { + __extends(LogPaneBase, _super); + function LogPaneBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + LogPaneBase.prototype.render = function () { + var warnings = this.props.log.warnings; + var errors = this.props.log.errors; + var warningPane = warnings.warn.length > 0 || warnings.debug.length > 0 || warnings.info.length > 0 ? (React.createElement("div", { styleName: 'warning-pane' }, + React.createElement("a", { styleName: 'close', onClick: this.closeWarnings.bind(this) }, "x"), + React.createElement("ul", null, + this.returnLevelWarnings(warnings, 'warn'), + this.returnLevelWarnings(warnings, 'info'), + this.returnLevelWarnings(warnings, 'debug')))) : null; + var errorPane = errors.length > 0 ? (React.createElement("div", { styleName: 'error-pane' }, + React.createElement("a", { styleName: 'close', onClick: this.closeErrors.bind(this) }, "x"), + React.createElement("ul", null, errors.map(function (error, index) { + return (React.createElement("li", { key: index }, error)); + })))) : null; + return (React.createElement("div", null, + warningPane, + errorPane)); + }; + LogPaneBase.prototype.closeWarnings = function () { + this.props.handleAction({ + type: log_1.LOG_WARNINGS_CLEAR + }); + }; + LogPaneBase.prototype.closeErrors = function () { + this.props.handleAction({ + type: log_1.LOG_ERRORS_CLEAR, + }); + }; + LogPaneBase.prototype.returnLevelWarnings = function (warnings, level) { + return warnings[level].map(function (warning, index) { + return (React.createElement("li", { key: index }, + "[", + level.toUpperCase(), + "] ", + warning)); + }); + }; + return LogPaneBase; +}(React.PureComponent)); +exports.LogPaneBase = LogPaneBase; +exports.LogPane = react_redux_1.connect(function (state) { + return { + log: index_1.selectLog(state) + }; +}, redux_action_1.createDispatchHandler())(CSSModules(LogPaneBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/log-pane/index.js.map b/build/components/log-pane/index.js.map new file mode 100644 index 000000000..ebb4a3940 --- /dev/null +++ b/build/components/log-pane/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/log-pane/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,8CAAgD;AAChD,2CAAoC;AACpC,yCAAkF;AAClF,2DAAgF;AAGhF,+CAAgD;AAChD,wCAA0C;AAM1C;IAAiC,+BAAqC;IAAtE;;IAwDA,CAAC;IAvDQ,4BAAM,GAAb;QACE,IAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzC,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QACrC,IAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CACtG,6BAAK,SAAS,EAAC,cAAc;YAC3B,2BAAG,SAAS,EAAC,OAAO,EAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAO;YAClE;gBACG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC1C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC1C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CACzC,CACD,CACP,GAAG,IAAI,CAAC;QAET,IAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CACpC,6BAAK,SAAS,EAAC,YAAY;YACzB,2BAAG,SAAS,EAAC,OAAO,EAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAO;YAChE,gCACG,MAAM,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,KAAK;gBACvB,MAAM,CAAC,CACL,4BAAI,GAAG,EAAE,KAAK,IAAG,KAAK,CAAM,CAC7B,CAAC;YACJ,CAAC,CAAC,CACC,CACD,CACP,GAAG,IAAI,CAAC;QAET,MAAM,CAAC,CACL;YACG,WAAW;YACX,SAAS,CACN,CACP,CAAC;IACJ,CAAC;IAES,mCAAa,GAAvB;QACE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YACtB,IAAI,EAAE,wBAAkB;SACzB,CAAC,CAAC;IACL,CAAC;IAES,iCAAW,GAArB;QACE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YACtB,IAAI,EAAE,sBAAgB;SACvB,CAAC,CAAC;IACL,CAAC;IAEO,yCAAmB,GAA3B,UAA4B,QAA2D,EAC3D,KAAmB;QAC7C,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAC,OAAO,EAAE,KAAa;YAChD,MAAM,CAAC,CACL,4BAAI,GAAG,EAAE,KAAK;;gBAAI,KAAK,CAAC,WAAW,EAAE;;gBAAI,OAAO,CAAM,CACvD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IACH,kBAAC;AAAD,CAAC,AAxDD,CAAiC,KAAK,CAAC,aAAa,GAwDnD;AAxDY,kCAAW;AA0DX,QAAA,OAAO,GAAG,qBAAO,CAC5B,UAAC,KAAY;IACX,MAAM,CAAC;QACL,GAAG,EAAE,iBAAS,CAAC,KAAK,CAAC;KACtB,CAAC;AACJ,CAAC,EAAE,oCAAqB,EAAa,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/log-pane/log-pane.scss b/build/components/log-pane/log-pane.scss new file mode 100644 index 000000000..9911a0d64 --- /dev/null +++ b/build/components/log-pane/log-pane.scss @@ -0,0 +1,38 @@ +.log-pane { + margin-left: -100px; + z-index: 10; + max-width: 500px; + position: absolute; + top: 15px; + padding: 15px; + border: 1px solid transparent; + border-radius: 4px; + left: 50%; + ul { + margin: 0; + padding: 0; + } + li { + list-style-type: none; + margin: 5px; + padding-left: 10px; + } +} + +.error-pane { + @extend .log-pane; + background-color: #f2dede; + color: #a94442; +} + +.warning-pane { + @extend .log-pane; + background-color: #fff9e5; + color: #FFCC00; +} + +.close { + position: absolute; + top: 5px; + right: 5px; +} diff --git a/build/components/plot-list/index.d.ts b/build/components/plot-list/index.d.ts new file mode 100644 index 000000000..ab8c00c3e --- /dev/null +++ b/build/components/plot-list/index.d.ts @@ -0,0 +1,27 @@ +/// +import * as React from 'react'; +import { InlineData } from 'vega-lite/build/src/data'; +import { ActionHandler } from '../../actions/redux-action'; +import { ResultAction } from '../../actions/result'; +import { ShelfAction } from '../../actions/shelf'; +import { Bookmark } from '../../models/bookmark'; +import { ResultType } from '../../models/result'; +import { Result } from '../../models/result/index'; +import { ShelfFilter } from '../../models/shelf/filter'; +export interface PlotListOwnProps extends ActionHandler { + result: Result; + resultType?: ResultType; + bookmark: Bookmark; +} +export interface PlotListConnectProps { + data: InlineData; + filters: ShelfFilter[]; +} +export declare type PlotListProps = PlotListOwnProps & PlotListConnectProps; +export declare class PlotListBase extends React.PureComponent { + constructor(props: PlotListProps); + render(): JSX.Element; + private onPlotSort(index, channel, value); + private onLoadMore(); +} +export declare const PlotList: React.ComponentClass; diff --git a/build/components/plot-list/index.js b/build/components/plot-list/index.js new file mode 100644 index 000000000..a4ea6ef7e --- /dev/null +++ b/build/components/plot-list/index.js @@ -0,0 +1,80 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var react_spinners_1 = require("react-spinners"); +var result_1 = require("../../actions/result"); +var constants_1 = require("../../constants"); +var index_1 = require("../../selectors/index"); +var shelf_1 = require("../../selectors/shelf"); +var plot_1 = require("../plot"); +var styles = require("./plot-list.scss"); +var PlotListBase = (function (_super) { + __extends(PlotListBase, _super); + function PlotListBase(props) { + var _this = _super.call(this, props) || this; + _this.onLoadMore = _this.onLoadMore.bind(_this); + return _this; + } + PlotListBase.prototype.render = function () { + var _this = this; + var _a = this.props, handleAction = _a.handleAction, bookmark = _a.bookmark, data = _a.data, filters = _a.filters, result = _a.result; + var plots = result.plots, limit = result.limit, isLoading = result.isLoading; + var plotListItems = plots && plots.slice(0, limit).map(function (plot, index) { + var spec = plot.spec, fieldInfos = plot.fieldInfos; + return (React.createElement(plot_1.Plot, { data: data, key: index, fieldInfos: fieldInfos, filters: filters, handleAction: handleAction, isPlotListItem: true, onSort: _this.onPlotSort.bind(_this, index), showBookmarkButton: true, showSpecifyButton: true, spec: spec, bookmark: bookmark })); + }); + return (React.createElement("div", null, + React.createElement("div", { styleName: "plot-list" }, isLoading ? + React.createElement("div", { styleName: 'plot-list-loading' }, + React.createElement(react_spinners_1.ClipLoader, { color: constants_1.SPINNER_COLOR })) : + plotListItems), + plots && plots.length > limit && (React.createElement("a", { styleName: "load-more", onClick: this.onLoadMore }, "Load more...")))); + }; + PlotListBase.prototype.onPlotSort = function (index, channel, value) { + var _a = this.props, handleAction = _a.handleAction, resultType = _a.resultType; + var action = { + type: result_1.RESULT_MODIFY_FIELD_PROP, + payload: { + resultType: resultType, + index: index, + channel: channel, + prop: 'sort', + value: value + } + }; + handleAction(action); + }; + PlotListBase.prototype.onLoadMore = function () { + var _a = this.props, handleAction = _a.handleAction, resultType = _a.resultType; + handleAction({ + type: result_1.RESULT_LIMIT_INCREASE, + payload: { + resultType: resultType, + increment: 4 + } + }); + }; + return PlotListBase; +}(React.PureComponent)); +exports.PlotListBase = PlotListBase; +exports.PlotList = react_redux_1.connect(function (state /*, props*/) { + // TODO: once we have multiple cached data from Leilani's engine + // take spec from props and read spec.data.name + return { + data: index_1.selectFilteredData(state), + filters: shelf_1.selectFilters(state) + }; +})(CSSModules(PlotListBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/plot-list/index.js.map b/build/components/plot-list/index.js.map new file mode 100644 index 000000000..13a202a3a --- /dev/null +++ b/build/components/plot-list/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/plot-list/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/plot-list/plot-list.scss b/build/components/plot-list/plot-list.scss new file mode 100644 index 000000000..b64494133 --- /dev/null +++ b/build/components/plot-list/plot-list.scss @@ -0,0 +1,23 @@ +.plot-list { + display: flex; + align-items: stretch; + align-content: flex-start; + flex-wrap: wrap; +} + +.plot-list-loading { + min-height: 290px; + margin: auto; + display: flex; +} + +.load-more { + display: block; + background: #e2e9f3; + height: 60px; + line-height: 60px; + vertical-align: middle; + text-align: center; + font-size: 1.2em; + margin-bottom: 20px; +} diff --git a/build/components/plot/bookmarkbutton.d.ts b/build/components/plot/bookmarkbutton.d.ts new file mode 100644 index 000000000..6f627ca86 --- /dev/null +++ b/build/components/plot/bookmarkbutton.d.ts @@ -0,0 +1,29 @@ +/// +import * as React from 'react'; +import { BookmarkAction } from '../../actions/bookmark'; +import { ActionHandler } from '../../actions/redux-action'; +import { Bookmark } from '../../models/bookmark'; +import { ResultPlot } from '../../models/result'; +export interface BookmarkProps extends ActionHandler { + bookmark: Bookmark; + plot: ResultPlot; +} +export interface BookmarkButtonState { + openDialog: boolean; +} +export declare class BookmarkButtonBase extends React.PureComponent { + private bookmarkDialog; + private bookmarkPopup; + constructor(props: BookmarkProps); + componentWillUpdate(nextProps: BookmarkProps, nextState: BookmarkButtonState): void; + render(): JSX.Element; + private onKeepBookmark(); + private isBookmarked(); + private onBookmarkClick(); + private onBookmarkRemove(); + private onBookmarkAdd(); + private bookmarkHandler; + private alertHandler; + private handleClickOutside(e); +} +export declare const BookmarkButton: typeof BookmarkButtonBase; diff --git a/build/components/plot/bookmarkbutton.js b/build/components/plot/bookmarkbutton.js new file mode 100644 index 000000000..f5a611da8 --- /dev/null +++ b/build/components/plot/bookmarkbutton.js @@ -0,0 +1,111 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var TetherComponent = require("react-tether"); +var bookmark_1 = require("../../actions/bookmark"); +var styles = require("./bookmarkbutton.scss"); +var BookmarkButtonBase = (function (_super) { + __extends(BookmarkButtonBase, _super); + function BookmarkButtonBase(props) { + var _this = _super.call(this, props) || this; + _this.bookmarkHandler = function (ref) { + _this.bookmarkPopup = ref; + }; + _this.alertHandler = function (ref) { + _this.bookmarkDialog = ref; + }; + _this.state = { + openDialog: false + }; + _this.onBookmarkRemove = _this.onBookmarkRemove.bind(_this); + _this.onBookmarkAdd = _this.onBookmarkAdd.bind(_this); + _this.onBookmarkClick = _this.onBookmarkClick.bind(_this); + _this.onKeepBookmark = _this.onKeepBookmark.bind(_this); + return _this; + } + BookmarkButtonBase.prototype.componentWillUpdate = function (nextProps, nextState) { + if (!nextState) { + return; + } + if (nextState.openDialog) { + document.addEventListener('click', this.handleClickOutside.bind(this), true); + } + else if (this.state.openDialog) { + document.removeEventListener('click', this.handleClickOutside.bind(this), true); + } + }; + BookmarkButtonBase.prototype.render = function () { + var styleName = (this.isBookmarked()) ? 'bookmark-command-selected' : 'command'; + return (React.createElement(TetherComponent, { attachment: "top right", targetAttachment: "bottom left" }, + React.createElement("i", { title: 'Bookmark', className: "fa fa-bookmark", styleName: styleName, onClick: this.onBookmarkClick }), + this.state.openDialog && + React.createElement("div", { styleName: 'bookmark-alert', ref: this.alertHandler }, + React.createElement("div", { ref: this.bookmarkHandler }, "Remove Bookmark?"), + React.createElement("small", null, "Your notes will be lost."), + React.createElement("div", null, + React.createElement("a", { onClick: this.onBookmarkRemove }, + React.createElement("span", { styleName: 'fa-span' }, + React.createElement("i", { className: "fa fa-trash-o" }), + "\u00A0Remove it\u00A0\u00A0")), + React.createElement("a", { onClick: this.onKeepBookmark }, + React.createElement("span", { styleName: 'fa-span' }, + React.createElement("i", { className: "fa fa-bookmark" }), + "\u00A0Keep it\u00A0\u00A0")))))); + }; + BookmarkButtonBase.prototype.onKeepBookmark = function () { + this.setState({ openDialog: false }); + }; + BookmarkButtonBase.prototype.isBookmarked = function () { + var _a = this.props, bookmark = _a.bookmark, plot = _a.plot; + return !!bookmark.dict[JSON.stringify(plot.spec)]; + }; + BookmarkButtonBase.prototype.onBookmarkClick = function () { + if (this.isBookmarked()) { + this.setState({ openDialog: !this.state.openDialog }); + } + else { + this.onBookmarkAdd(); + } + }; + BookmarkButtonBase.prototype.onBookmarkRemove = function () { + this.setState({ openDialog: false }); + this.props.handleAction({ + type: bookmark_1.BOOKMARK_REMOVE_PLOT, + payload: { + spec: this.props.plot.spec + } + }); + }; + BookmarkButtonBase.prototype.onBookmarkAdd = function () { + this.props.handleAction({ + type: bookmark_1.BOOKMARK_ADD_PLOT, + payload: { + plot: this.props.plot + } + }); + }; + BookmarkButtonBase.prototype.handleClickOutside = function (e) { + if (this.bookmarkPopup && this.bookmarkDialog && (this.bookmarkDialog.contains(e.target) || + this.bookmarkPopup.contains(e.target))) { + return; + } + this.setState({ + openDialog: false + }); + }; + return BookmarkButtonBase; +}(React.PureComponent)); +exports.BookmarkButtonBase = BookmarkButtonBase; +exports.BookmarkButton = CSSModules(BookmarkButtonBase, styles); +//# sourceMappingURL=bookmarkbutton.js.map \ No newline at end of file diff --git a/build/components/plot/bookmarkbutton.js.map b/build/components/plot/bookmarkbutton.js.map new file mode 100644 index 000000000..175949dd6 --- /dev/null +++ b/build/components/plot/bookmarkbutton.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bookmarkbutton.js","sourceRoot":"","sources":["../../../src/components/plot/bookmarkbutton.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/plot/bookmarkbutton.scss b/build/components/plot/bookmarkbutton.scss new file mode 100644 index 000000000..4eed6fbd7 --- /dev/null +++ b/build/components/plot/bookmarkbutton.scss @@ -0,0 +1,24 @@ +@import './plot.scss'; + +.bookmark-alert { + color: #fff; + background-color: #38425d; + padding: 8px; + font-size: 14px; + line-height: 18px; + min-width: 150px; + border-radius: 3px; + font-family: sans-serif; +} + +.bookmark-command-selected { + @extend .command; + color: #0c96d0; +} + +.fa-span { + font-size: 12px; +} +.fa-span:hover { + font-weight: bold; +} diff --git a/build/components/plot/index.d.ts b/build/components/plot/index.d.ts new file mode 100644 index 000000000..96a6c9c4d --- /dev/null +++ b/build/components/plot/index.d.ts @@ -0,0 +1,60 @@ +/// +import * as React from 'react'; +import { InlineData } from 'vega-lite/build/src/data'; +import { SortField, SortOrder } from 'vega-lite/build/src/sort'; +import { FacetedCompositeUnitSpec } from 'vega-lite/build/src/spec'; +import { BookmarkAction } from '../../actions/bookmark'; +import { LogAction } from '../../actions/log'; +import { ActionHandler } from '../../actions/redux-action'; +import { ResultAction } from '../../actions/result'; +import { ShelfAction } from '../../actions/shelf'; +import { ShelfPreviewAction } from '../../actions/shelf-preview'; +import { Bookmark } from '../../models/bookmark'; +import { PlotFieldInfo } from '../../models/result'; +import { ShelfFilter } from '../../models/shelf/filter'; +export interface PlotProps extends ActionHandler { + data: InlineData; + filters: ShelfFilter[]; + fieldInfos?: PlotFieldInfo[]; + isPlotListItem?: boolean; + showBookmarkButton?: boolean; + showSpecifyButton?: boolean; + onSort?: (channel: 'x' | 'y', sort: SortField | SortOrder) => void; + spec: FacetedCompositeUnitSpec; + bookmark?: Bookmark; + closeModal?: () => void; +} +export interface PlotState { + hovered: boolean; + preview: boolean; + copiedPopupIsOpened: boolean; +} +export declare class PlotBase extends React.PureComponent { + private hoverTimeoutId; + private previewTimeoutId; + private vegaLiteWrapper; + private plotLogger; + constructor(props: PlotProps); + componentDidUpdate(prevProps: PlotProps, prevState: PlotState): void; + render(): JSX.Element; + protected componentWillUnmount(): void; + private renderFields(); + private clearHoverTimeout(); + private clearPreviewTimeout(); + private onMouseEnter(); + private onMouseLeave(); + private onSort(channel); + private onSpecify(); + private onPreviewMouseEnter(); + private onPreviewMouseLeave(); + private renderSortButton(channel); + private renderSpecifyButton(); + private renderBookmarkButton(); + private handleTextChange(event); + private readonly specWithFilter; + private renderCopySpecButton(); + private copied(); + private isVerticallyOverFlown(element); + private vegaLiteWrapperRefHandler; +} +export declare const Plot: typeof PlotBase; diff --git a/build/components/plot/index.js b/build/components/plot/index.js new file mode 100644 index 000000000..1177bdeb9 --- /dev/null +++ b/build/components/plot/index.js @@ -0,0 +1,238 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CopyToClipboard = require("react-copy-to-clipboard"); +var CSSModules = require("react-css-modules"); +var TetherComponent = require("react-tether"); +var fielddef_1 = require("vega-lite/build/src/fielddef"); +var bookmark_1 = require("../../actions/bookmark"); +var shelf_1 = require("../../actions/shelf"); +var shelf_preview_1 = require("../../actions/shelf-preview"); +var constants_1 = require("../../constants"); +var filter_1 = require("../../models/shelf/filter"); +var index_1 = require("../field/index"); +var util_logger_1 = require("../util/util.logger"); +var index_2 = require("../vega-lite/index"); +var bookmarkbutton_1 = require("./bookmarkbutton"); +var styles = require("./plot.scss"); +var PlotBase = (function (_super) { + __extends(PlotBase, _super); + function PlotBase(props) { + var _this = _super.call(this, props) || this; + _this.vegaLiteWrapperRefHandler = function (ref) { + _this.vegaLiteWrapper = ref; + }; + _this.state = { + hovered: false, + preview: false, + copiedPopupIsOpened: false + }; + // Bind - https://facebook.github.io/react/docs/handling-events.html + _this.handleTextChange = _this.handleTextChange.bind(_this); + _this.onMouseEnter = _this.onMouseEnter.bind(_this); + _this.onMouseLeave = _this.onMouseLeave.bind(_this); + _this.onPreviewMouseEnter = _this.onPreviewMouseEnter.bind(_this); + _this.onPreviewMouseLeave = _this.onPreviewMouseLeave.bind(_this); + _this.onSpecify = _this.onSpecify.bind(_this); + _this.onSort = _this.onSort.bind(_this); + _this.plotLogger = new util_logger_1.Logger(props.handleAction); + return _this; + } + PlotBase.prototype.componentDidUpdate = function (prevProps, prevState) { + // We have to check this here since we do not know if it is vertically overflown + // during render time. + if (!this.isVerticallyOverFlown(this.vegaLiteWrapper) && this.state.hovered) { + // add a padding similar to .plot + this.vegaLiteWrapper.style.paddingRight = '11px'; + } + else { + // reset state otherwise, so we clean up what we add in the case above. + delete this.vegaLiteWrapper.style.paddingRight; + } + }; + PlotBase.prototype.render = function () { + var _a = this.props, isPlotListItem = _a.isPlotListItem, onSort = _a.onSort, showBookmarkButton = _a.showBookmarkButton, showSpecifyButton = _a.showSpecifyButton, spec = _a.spec, data = _a.data; + var notesDiv; + var specKey = JSON.stringify(spec); + if (this.props.bookmark.dict[specKey]) { + notesDiv = (React.createElement("textarea", { styleName: 'note', type: 'text', placeholder: 'notes', value: this.props.bookmark.dict[specKey].note, onChange: this.handleTextChange })); + } + return (React.createElement("div", { styleName: isPlotListItem ? 'plot-list-item-group' : 'plot-group' }, + React.createElement("div", { styleName: "plot-info" }, + React.createElement("div", { styleName: "command-toolbox" }, + onSort && this.renderSortButton('x'), + onSort && this.renderSortButton('y'), + showBookmarkButton && this.renderBookmarkButton(), + showSpecifyButton && this.renderSpecifyButton(), + React.createElement("span", { styleName: 'command' }, + React.createElement(TetherComponent, { attachment: 'bottom left', offset: '0px 30px' }, + this.renderCopySpecButton(), + this.state.copiedPopupIsOpened && React.createElement("span", { styleName: 'copied' }, "copied")))), + React.createElement("span", { onMouseEnter: this.onPreviewMouseEnter, onMouseLeave: this.onPreviewMouseLeave }, this.renderFields())), + React.createElement("div", { ref: this.vegaLiteWrapperRefHandler, styleName: this.state.hovered ? 'plot-scroll' : 'plot', className: "persist-scroll", onMouseEnter: this.onMouseEnter, onMouseLeave: this.onMouseLeave }, + React.createElement(index_2.VegaLite, { spec: spec, logger: this.plotLogger, data: data })), + notesDiv)); + }; + PlotBase.prototype.componentWillUnmount = function () { + this.clearHoverTimeout(); + }; + PlotBase.prototype.renderFields = function () { + var fieldInfos = this.props.fieldInfos; + if (fieldInfos) { + return fieldInfos.map(function (fieldInfo) { + var fieldDef = fieldInfo.fieldDef, isEnumeratedWildcardField = fieldInfo.isEnumeratedWildcardField; + return (React.createElement("div", { styleName: "plot-field-info", key: JSON.stringify(fieldDef) }, + React.createElement(index_1.Field, { fieldDef: fieldDef, caretShow: false, draggable: false, isEnumeratedWildcardField: isEnumeratedWildcardField, isPill: false }))); + }); + } + return undefined; + }; + PlotBase.prototype.clearHoverTimeout = function () { + if (this.hoverTimeoutId) { + clearTimeout(this.hoverTimeoutId); + this.hoverTimeoutId = undefined; + } + }; + PlotBase.prototype.clearPreviewTimeout = function () { + if (this.previewTimeoutId) { + clearTimeout(this.previewTimeoutId); + this.previewTimeoutId = undefined; + } + }; + PlotBase.prototype.onMouseEnter = function () { + var _this = this; + this.hoverTimeoutId = window.setTimeout(function () { + // TODO log action + _this.setState({ hovered: true }); + _this.hoverTimeoutId = undefined; + }, constants_1.PLOT_HOVER_MIN_DURATION); + }; + PlotBase.prototype.onMouseLeave = function () { + this.clearHoverTimeout(); + if (this.state.hovered) { + this.setState({ hovered: false }); + } + }; + PlotBase.prototype.onSort = function (channel) { + // TODO: really take `sort` as input instead of toggling like this + var _a = this.props, spec = _a.spec, onSort = _a.onSort; + var channelDef = spec.encoding[channel]; + if (fielddef_1.isFieldDef(channelDef)) { + var sort = channelDef.sort === 'descending' ? undefined : 'descending'; + onSort(channel, sort); + } + }; + PlotBase.prototype.onSpecify = function () { + if (this.props.closeModal) { + this.props.closeModal(); + } + this.onPreviewMouseLeave(); + var _a = this.props, handleAction = _a.handleAction, spec = _a.spec; + handleAction({ + type: shelf_1.SPEC_LOAD, + payload: { spec: spec, keepWildcardMark: true } + }); + }; + PlotBase.prototype.onPreviewMouseEnter = function () { + var _this = this; + this.previewTimeoutId = window.setTimeout(function () { + var _a = _this.props, handleAction = _a.handleAction, spec = _a.spec; + _this.setState({ preview: true }); + handleAction({ + type: shelf_preview_1.SHELF_PREVIEW_SPEC, + payload: { spec: spec } + }); + _this.previewTimeoutId = undefined; + }, constants_1.PLOT_HOVER_MIN_DURATION); + }; + PlotBase.prototype.onPreviewMouseLeave = function () { + this.clearPreviewTimeout(); + if (this.state.preview) { + this.setState({ preview: false }); + var handleAction = this.props.handleAction; + handleAction({ type: shelf_preview_1.SHELF_PREVIEW_DISABLE }); + } + }; + PlotBase.prototype.renderSortButton = function (channel) { + var spec = this.props.spec; + var channelDef = spec.encoding[channel]; + if (fielddef_1.isFieldDef(channelDef) && fielddef_1.isDiscrete(channelDef)) { + return React.createElement("i", { title: 'Sort', className: "fa fa-sort-alpha-asc", styleName: channel === 'x' ? 'sort-x-command' : 'command', onClick: this.onSort.bind(this, channel) }); + } + return undefined; + }; + PlotBase.prototype.renderSpecifyButton = function () { + return React.createElement("i", { title: 'Specify', className: "fa fa-server", styleName: "specify-command", onClick: this.onSpecify, onMouseEnter: this.onPreviewMouseEnter, onMouseLeave: this.onPreviewMouseLeave }); + }; + PlotBase.prototype.renderBookmarkButton = function () { + var plot = { + fieldInfos: this.props.fieldInfos, + spec: this.specWithFilter + }; + return (React.createElement(bookmarkbutton_1.BookmarkButton, { bookmark: this.props.bookmark, plot: plot, handleAction: this.props.handleAction })); + }; + PlotBase.prototype.handleTextChange = function (event) { + var handleAction = this.props.handleAction; + handleAction({ + type: bookmark_1.BOOKMARK_MODIFY_NOTE, + payload: { + note: event.target.value, + spec: this.props.spec + } + }); + }; + Object.defineProperty(PlotBase.prototype, "specWithFilter", { + get: function () { + var _a = this.props, spec = _a.spec, filters = _a.filters; + var transform = (spec.transform || []).concat(filter_1.toTransforms(filters)); + return __assign({}, spec, (transform.length > 0 ? { transform: transform } : {})); + }, + enumerable: true, + configurable: true + }); + PlotBase.prototype.renderCopySpecButton = function () { + // TODO: spec would only contain NamedData, but not the actual data. + // Need to augment spec.data + // TODO instead of pre-generating a text for the copy button, which + // takes a lot of memory for each plot + // Can only generate the text only when the button is clicked? + return (React.createElement(CopyToClipboard, { onCopy: this.copied.bind(this), text: JSON.stringify(this.specWithFilter, null, 2) }, + React.createElement("i", { title: 'Copy', className: 'fa fa-clipboard' }))); + }; + PlotBase.prototype.copied = function () { + var _this = this; + this.setState({ + copiedPopupIsOpened: true + }); + window.setTimeout(function () { + _this.setState({ + copiedPopupIsOpened: false + }); + }, 1000); + }; + PlotBase.prototype.isVerticallyOverFlown = function (element) { + return element.scrollHeight > element.clientHeight; + }; + return PlotBase; +}(React.PureComponent)); +exports.PlotBase = PlotBase; +exports.Plot = CSSModules(PlotBase, styles); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/plot/index.js.map b/build/components/plot/index.js.map new file mode 100644 index 000000000..c00c020ae --- /dev/null +++ b/build/components/plot/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/plot/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/plot/plot.scss b/build/components/plot/plot.scss new file mode 100644 index 000000000..7c5823e24 --- /dev/null +++ b/build/components/plot/plot.scss @@ -0,0 +1,71 @@ +.plot-group { + background-color: white; + overflow: hidden; + text-align: center; + padding: 8px; + max-height: 600px; + display: flex; + flex-direction: column; +} + +.plot-list-item-group { + @extend .plot-group; + margin: 4px 4px 0 0; + flex-grow: 1; + max-height: 290px; +} + +.plot { + overflow: hidden; + padding-right: 11px; +} + +.plot-scroll { + overflow: auto; + padding-right: 0px; +} + +.plot-info { + text-align: left; + margin-bottom: 6px; +} + +.plot-field-info { + display: inline-block; + margin-right: 4px; +} + +.command-toolbox { + float: right; +} + +.command { + cursor: pointer; + margin-left: 10px; + color: #aaa; +} + +.sort-x-command { + @extend .command; + transform: rotateZ(270deg); +} + +.command:hover { + color: #72c1d5; +} + +.specify-command { + @extend .command; + transform: scaleX(-1); +} + +.copied { + font-size: 12px; +} + +.note { + min-height: 60px; + resize: none; + border-color: #d3d3d3; + width: 100%; +} diff --git a/build/components/util/util.logger.d.ts b/build/components/util/util.logger.d.ts new file mode 100644 index 000000000..2a8aa0d71 --- /dev/null +++ b/build/components/util/util.logger.d.ts @@ -0,0 +1,10 @@ +import { LogAction } from '../../actions/log'; +export declare class Logger { + private handleAction; + constructor(handleAction: (action: LogAction) => void); + level(): this; + error(...args: string[]): void; + warn(...args: string[]): this; + info(...args: string[]): this; + debug(...args: string[]): this; +} diff --git a/build/components/util/util.logger.js b/build/components/util/util.logger.js new file mode 100644 index 000000000..92bca0e16 --- /dev/null +++ b/build/components/util/util.logger.js @@ -0,0 +1,68 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var log_1 = require("../../actions/log"); +var Logger = (function () { + function Logger(handleAction) { + this.handleAction = handleAction; + } + Logger.prototype.level = function () { + return this; + }; + Logger.prototype.error = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + this.handleAction({ + type: log_1.LOG_ERRORS_ADD, + payload: { + errors: args + } + }); + }; + Logger.prototype.warn = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + this.handleAction({ + type: log_1.LOG_WARNINGS_ADD, + payload: { + warnings: args, + level: 'warn' + } + }); + return this; + }; + Logger.prototype.info = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + this.handleAction({ + type: log_1.LOG_WARNINGS_ADD, + payload: { + warnings: args, + level: 'info' + } + }); + return this; + }; + Logger.prototype.debug = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + this.handleAction({ + type: log_1.LOG_WARNINGS_ADD, + payload: { + warnings: args, + level: 'debug' + } + }); + return this; + }; + return Logger; +}()); +exports.Logger = Logger; +//# sourceMappingURL=util.logger.js.map \ No newline at end of file diff --git a/build/components/util/util.logger.js.map b/build/components/util/util.logger.js.map new file mode 100644 index 000000000..0ce5fc883 --- /dev/null +++ b/build/components/util/util.logger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"util.logger.js","sourceRoot":"","sources":["../../../src/components/util/util.logger.ts"],"names":[],"mappings":";;AAAA,yCAA8E;AAE9E;IAGE,gBAAY,YAAyC;QACnD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAEM,sBAAK,GAAZ;QACE,MAAM,CAAC,IAAI,CAAC;IACd,CAAC;IAEM,sBAAK,GAAZ;QAAa,cAAiB;aAAjB,UAAiB,EAAjB,qBAAiB,EAAjB,IAAiB;YAAjB,yBAAiB;;QAC5B,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,oBAAc;YACpB,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI;aACb;SACF,CAAC,CAAC;IACL,CAAC;IAEM,qBAAI,GAAX;QAAY,cAAiB;aAAjB,UAAiB,EAAjB,qBAAiB,EAAjB,IAAiB;YAAjB,yBAAiB;;QAC3B,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,sBAAgB;YACtB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,MAAM;aACd;SACF,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;IACd,CAAC;IAEM,qBAAI,GAAX;QAAY,cAAiB;aAAjB,UAAiB,EAAjB,qBAAiB,EAAjB,IAAiB;YAAjB,yBAAiB;;QAC3B,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,sBAAgB;YACtB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,MAAM;aACd;SACF,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;IACd,CAAC;IAEM,sBAAK,GAAZ;QAAa,cAAiB;aAAjB,UAAiB,EAAjB,qBAAiB,EAAjB,IAAiB;YAAjB,yBAAiB;;QAC5B,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,sBAAgB;YACtB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,OAAO;aACf;SACF,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;IACd,CAAC;IACH,aAAC;AAAD,CAAC,AApDD,IAoDC;AApDY,wBAAM"} \ No newline at end of file diff --git a/build/components/vega-lite/index.d.ts b/build/components/vega-lite/index.d.ts new file mode 100644 index 000000000..0998ae97b --- /dev/null +++ b/build/components/vega-lite/index.d.ts @@ -0,0 +1,32 @@ +/// +import * as React from 'react'; +import * as vega from 'vega'; +import { InlineData } from 'vega-lite/build/src/data'; +import { TopLevelExtendedSpec } from 'vega-lite/build/src/spec'; +import { Logger } from '../util/util.logger'; +export interface VegaLiteProps { + spec: TopLevelExtendedSpec; + renderer?: 'svg' | 'canvas'; + logger: Logger; + data: InlineData; + viewRunAfter?: (view: vega.View) => any; +} +export interface VegaLiteState { + isLoading: boolean; +} +export declare class VegaLite extends React.PureComponent { + private view; + private size; + private mountTimeout; + private updateTimeout; + constructor(props: VegaLiteProps); + render(): JSX.Element; + componentDidMount(): void; + componentWillReceiveProps(nextProps: VegaLiteProps): void; + componentDidUpdate(prevProps: VegaLiteProps, prevState: VegaLiteState): void; + componentWillUnmount(): void; + protected updateSpec(): void; + private bindData(); + private runView(); + private getChartSize(); +} diff --git a/build/components/vega-lite/index.js b/build/components/vega-lite/index.js new file mode 100644 index 000000000..3530e036e --- /dev/null +++ b/build/components/vega-lite/index.js @@ -0,0 +1,161 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var react_spinners_1 = require("react-spinners"); +var vega = require("vega"); +var vl = require("vega-lite"); +var data_1 = require("vega-lite/build/src/data"); +var vegaTooltip = require("vega-tooltip"); +var constants_1 = require("../../constants"); +var CHART_REF = 'chart'; +var VegaLite = (function (_super) { + __extends(VegaLite, _super); + function VegaLite(props) { + var _this = _super.call(this, props) || this; + _this.state = { + isLoading: true + }; + return _this; + } + VegaLite.prototype.render = function () { + return (React.createElement("div", null, + React.createElement(react_spinners_1.ClipLoader, { color: constants_1.SPINNER_COLOR, loading: this.state.isLoading }), + React.createElement("div", { className: 'chart', ref: CHART_REF }), + React.createElement("div", { id: "vis-tooltip", className: "vg-tooltip" }))); + }; + VegaLite.prototype.componentDidMount = function () { + var _this = this; + if (this.mountTimeout) { + clearTimeout(this.mountTimeout); + } + this.setState({ + isLoading: true + }); + this.mountTimeout = window.setTimeout(function () { + _this.updateSpec(); + _this.runView(); + _this.setState({ + isLoading: false + }); + }); + }; + VegaLite.prototype.componentWillReceiveProps = function (nextProps) { + if (nextProps.spec !== this.props.spec) { + this.setState({ + isLoading: true + }); + this.size = this.getChartSize(); + } + }; + VegaLite.prototype.componentDidUpdate = function (prevProps, prevState) { + var _this = this; + if (this.updateTimeout) { + clearTimeout(this.updateTimeout); + } + this.updateTimeout = window.setTimeout(function (spec, data) { + if (prevProps.spec !== spec) { + var chart = _this.refs[CHART_REF]; + chart.style.width = _this.size.width + 'px'; + chart.style.height = _this.size.height + 'px'; + _this.updateSpec(); + } + else if (prevProps.data !== data) { + _this.bindData(); + } + _this.runView(); + _this.setState({ + isLoading: false + }); + }, 0, this.props.spec, this.props.data); + }; + VegaLite.prototype.componentWillUnmount = function () { + if (this.mountTimeout) { + clearTimeout(this.mountTimeout); + } + if (this.updateTimeout) { + clearTimeout(this.updateTimeout); + } + if (this.view) { + this.view.finalize(); + } + }; + VegaLite.prototype.updateSpec = function () { + // NOTE: spec used to test warning logger + // vlSpec = { + // "description": "A simple bar chart with embedded data.", + // "data": { + // "values": [ + // {"a": "A", "b": 28}, + // {"a": "B", "b": 55}, + // {"a": "C", "b": 43}, + // {"a": "D", "b": 91}, + // {"a": "E", "b": 81}, + // {"a": "F", "b": 53}, + // {"a": "G", "b": 19}, + // {"a": "H", "b": 87}, + // {"a": "I", "b": 52} + // ] + // }, + // "mark": "bar", + // "encoding": { + // "x": {"field": "a", "type": "quantitative"}, + // "y": {"field": "b", "type": "quantitative"} + // } + // }; + var logger = this.props.logger; + var vlSpec = this.props.spec; + try { + var spec = vl.compile(vlSpec, logger).spec; + var runtime = vega.parse(spec, vlSpec.config); + this.view = new vega.View(runtime) + .logLevel(vega.Warn) + .initialize(this.refs[CHART_REF]) + .renderer(this.props.renderer || 'canvas') + .hover(); + vegaTooltip.vega(this.view); + this.bindData(); + } + catch (err) { + logger.error(err); + } + }; + VegaLite.prototype.bindData = function () { + var _a = this.props, data = _a.data, spec = _a.spec; + if (data && data_1.isNamedData(spec.data)) { + this.view.change(spec.data.name, vega.changeset() + .remove(function () { return true; }) // remove previous data + .insert(data.values)); + } + }; + VegaLite.prototype.runView = function () { + try { + this.view.run(); + if (this.props.viewRunAfter) { + this.view.runAfter(this.props.viewRunAfter); + } + } + catch (err) { + this.props.logger.error(err); + } + }; + VegaLite.prototype.getChartSize = function () { + var chart = this.refs[CHART_REF]; + var chartContainer = chart.querySelector(this.props.renderer || 'canvas'); + var width = Number(chartContainer.getAttribute('width')); + var height = Number(chartContainer.getAttribute('height')); + return { width: width, height: height }; + }; + return VegaLite; +}(React.PureComponent)); +exports.VegaLite = VegaLite; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/vega-lite/index.js.map b/build/components/vega-lite/index.js.map new file mode 100644 index 000000000..0654f8d47 --- /dev/null +++ b/build/components/vega-lite/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/vega-lite/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/view-pane/index.d.ts b/build/components/view-pane/index.d.ts new file mode 100644 index 000000000..a29267750 --- /dev/null +++ b/build/components/view-pane/index.d.ts @@ -0,0 +1,26 @@ +/// +import * as React from 'react'; +import { InlineData } from 'vega-lite/build/src/data'; +import { FacetedCompositeUnitSpec } from 'vega-lite/build/src/spec'; +import { Action } from '../../actions/index'; +import { ActionHandler } from '../../actions/redux-action'; +import { Bookmark } from '../../models/bookmark'; +import { VoyagerConfig } from '../../models/config'; +import { RelatedViews as RelatedViewsModel } from '../../models/related-views'; +import { Result } from '../../models/result/index'; +import { ShelfFilter } from '../../models/shelf/filter'; +import { ShelfGroupBy } from '../../models/shelf/index'; +export interface ViewPaneProps extends ActionHandler { + isQuerySpecific: boolean; + spec: FacetedCompositeUnitSpec; + result: Result; + bookmark: Bookmark; + autoAddCount: boolean; + relatedViews: RelatedViewsModel; + groupBy: ShelfGroupBy; + defaultGroupBy: ShelfGroupBy; + config: VoyagerConfig; + data: InlineData; + filters: ShelfFilter[]; +} +export declare const ViewPane: React.ComponentClass<{}>; diff --git a/build/components/view-pane/index.js b/build/components/view-pane/index.js new file mode 100644 index 000000000..2e8e360b0 --- /dev/null +++ b/build/components/view-pane/index.js @@ -0,0 +1,140 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var redux_action_1 = require("../../actions/redux-action"); +var index_1 = require("../../actions/shelf/index"); +var spec_1 = require("../../actions/shelf/spec"); +var index_2 = require("../../models/shelf/index"); +var selectors_1 = require("../../selectors"); +var index_3 = require("../../selectors/index"); +var result_1 = require("../../selectors/result"); +var shelf_1 = require("../../selectors/shelf"); +var plot_1 = require("../plot"); +var plot_list_1 = require("../plot-list"); +var related_views_1 = require("./related-views"); +var related_views_button_1 = require("./related-views-button"); +var styles = require("./view-pane.scss"); +var NO_PLOT_MESSAGE = "No specified visualization yet. " + + "Start exploring by dragging a field to encoding pane " + + "on the left or examining univariate summaries below."; +var GROUP_BY_LABEL = { + auto: 'Automatic', + field: 'Field', + fieldTransform: 'Field and Transformations', + encoding: 'Visual Encodings' +}; +var ViewPaneBase = (function (_super) { + __extends(ViewPaneBase, _super); + function ViewPaneBase(props) { + var _this = _super.call(this, props) || this; + _this.onSort = _this.onSort.bind(_this); + _this.onAutoAddCountChange = _this.onAutoAddCountChange.bind(_this); + _this.onGroupByChange = _this.onGroupByChange.bind(_this); + return _this; + } + ViewPaneBase.prototype.render = function () { + var _a = this.props, isQuerySpecific = _a.isQuerySpecific, handleAction = _a.handleAction, relatedViews = _a.relatedViews, config = _a.config; + var collapseRelatedViews = relatedViews.isCollapsed === undefined ? config.relatedViews === 'initiallyCollapsed' : + relatedViews.isCollapsed; + var relatedViewsElement = config.relatedViews !== 'disabled' && (React.createElement("div", { className: "pane", styleName: collapseRelatedViews ? "view-pane-related-views-collapse" : + "view-pane-related-views" }, + React.createElement(related_views_button_1.RelatedViewsButton, { collapseRelatedViews: collapseRelatedViews, handleAction: handleAction }), + React.createElement("h2", null, "Related Views"), + !collapseRelatedViews && React.createElement(related_views_1.RelatedViews, null))); + if (isQuerySpecific) { + return (React.createElement("div", { styleName: "view-pane" }, + React.createElement("div", { className: "pane", styleName: collapseRelatedViews ? 'view-pane-specific-stretch' : 'view-pane-specific' }, + React.createElement("h2", null, "Specified View"), + this.renderSpecifiedView()), + relatedViewsElement)); + } + else { + return this.renderSpecifiedViews(); + } + }; + ViewPaneBase.prototype.onSort = function (channel, value) { + var handleAction = this.props.handleAction; + handleAction({ + type: spec_1.SPEC_FIELD_PROP_CHANGE, + payload: { + shelfId: { channel: channel }, + prop: 'sort', + value: value + } + }); + }; + ViewPaneBase.prototype.renderSpecifiedView = function () { + var _a = this.props, bookmark = _a.bookmark, data = _a.data, filters = _a.filters, handleAction = _a.handleAction, spec = _a.spec; + if (spec) { + return (React.createElement(plot_1.Plot, { bookmark: bookmark, data: data, filters: filters, handleAction: handleAction, onSort: this.onSort, showBookmarkButton: true, spec: spec })); + } + else { + return (React.createElement("span", null, NO_PLOT_MESSAGE)); + } + }; + ViewPaneBase.prototype.renderSpecifiedViews = function () { + var _a = this.props, bookmark = _a.bookmark, handleAction = _a.handleAction, autoAddCount = _a.autoAddCount, groupBy = _a.groupBy, defaultGroupBy = _a.defaultGroupBy, result = _a.result; + var options = index_2.SHELF_GROUP_BYS.map(function (value) { + var label = value === 'auto' ? + GROUP_BY_LABEL[defaultGroupBy] + " (Automatic)" : + GROUP_BY_LABEL[value]; + return (React.createElement("option", { value: value, key: value }, label)); + }); + return (React.createElement("div", { className: "pane", styleName: "view-pane-gallery" }, + React.createElement("div", { className: "right" }, + React.createElement("label", { styleName: "gallery-command" }, + "Showing views with different", + ' ', + React.createElement("select", { value: groupBy, onChange: this.onGroupByChange }, options)), + React.createElement("label", { styleName: "gallery-command" }, + React.createElement("input", { type: "checkbox", checked: autoAddCount, onChange: this.onAutoAddCountChange }), + ' ', + "Auto Add Count")), + React.createElement("h2", null, "Specified Views"), + React.createElement(plot_list_1.PlotList, { result: result, resultType: "main", handleAction: handleAction, bookmark: bookmark }))); + }; + ViewPaneBase.prototype.onAutoAddCountChange = function (event) { + var autoAddCount = event.target.checked; + var handleAction = this.props.handleAction; + handleAction({ + type: index_1.SHELF_AUTO_ADD_COUNT_CHANGE, + payload: { autoAddCount: autoAddCount } + }); + }; + ViewPaneBase.prototype.onGroupByChange = function (event) { + var handleAction = this.props.handleAction; + handleAction({ + type: index_1.SHELF_GROUP_BY_CHANGE, + payload: { groupBy: event.target.value } + }); + }; + return ViewPaneBase; +}(React.PureComponent)); +exports.ViewPane = react_redux_1.connect(function (state) { + return { + autoAddCount: shelf_1.selectShelfAutoAddCount(state), + bookmark: selectors_1.selectBookmark(state), + config: selectors_1.selectConfig(state), + data: index_3.selectFilteredData(state), + filters: shelf_1.selectFilters(state), + groupBy: shelf_1.selectShelfGroupBy(state), + defaultGroupBy: shelf_1.selectDefaultGroupBy(state), + isQuerySpecific: shelf_1.selectIsQuerySpecific(state), + result: result_1.selectResult.main(state), + spec: selectors_1.selectMainSpec(state), + relatedViews: index_3.selectRelatedViews(state) + }; +}, redux_action_1.createDispatchHandler())(CSSModules(ViewPaneBase, styles)); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/components/view-pane/index.js.map b/build/components/view-pane/index.js.map new file mode 100644 index 000000000..cfc960239 --- /dev/null +++ b/build/components/view-pane/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/view-pane/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/view-pane/related-views-button.d.ts b/build/components/view-pane/related-views-button.d.ts new file mode 100644 index 000000000..b20a35f3d --- /dev/null +++ b/build/components/view-pane/related-views-button.d.ts @@ -0,0 +1,13 @@ +/// +import * as React from 'react'; +import { ActionHandler } from '../../actions/redux-action'; +import { RelatedViewsAction } from '../../actions/related-views'; +export interface RelatedViewsButtonProps extends ActionHandler { + collapseRelatedViews: boolean; +} +export declare class RelatedViewsButtonBase extends React.PureComponent { + constructor(props: RelatedViewsButtonProps); + render(): JSX.Element; + private onHideClick(); +} +export declare const RelatedViewsButton: typeof RelatedViewsButtonBase; diff --git a/build/components/view-pane/related-views-button.js b/build/components/view-pane/related-views-button.js new file mode 100644 index 000000000..472edd29c --- /dev/null +++ b/build/components/view-pane/related-views-button.js @@ -0,0 +1,45 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var related_views_1 = require("../../actions/related-views"); +var styles = require("./related-views-button.scss"); +var RelatedViewsButtonBase = (function (_super) { + __extends(RelatedViewsButtonBase, _super); + function RelatedViewsButtonBase(props) { + var _this = _super.call(this, props) || this; + _this.onHideClick = _this.onHideClick.bind(_this); + return _this; + } + RelatedViewsButtonBase.prototype.render = function () { + var collapseRelatedViews = this.props.collapseRelatedViews; + return (React.createElement("div", { styleName: "right" }, + React.createElement("a", { onClick: this.onHideClick }, + collapseRelatedViews ? 'Expand' : 'Collapse', + "\u00A0\u00A0", + collapseRelatedViews ? React.createElement("i", { className: 'fa fa-toggle-up' }) : React.createElement("i", { className: 'fa fa-toggle-down' })))); + }; + RelatedViewsButtonBase.prototype.onHideClick = function () { + var collapseRelatedViews = this.props.collapseRelatedViews; + this.props.handleAction({ + type: related_views_1.RELATED_VIEWS_HIDE_TOGGLE, + payload: { + newIsCollapsed: !collapseRelatedViews + } + }); + }; + return RelatedViewsButtonBase; +}(React.PureComponent)); +exports.RelatedViewsButtonBase = RelatedViewsButtonBase; +exports.RelatedViewsButton = (CSSModules(RelatedViewsButtonBase, styles)); +//# sourceMappingURL=related-views-button.js.map \ No newline at end of file diff --git a/build/components/view-pane/related-views-button.js.map b/build/components/view-pane/related-views-button.js.map new file mode 100644 index 000000000..be2c6c0e6 --- /dev/null +++ b/build/components/view-pane/related-views-button.js.map @@ -0,0 +1 @@ +{"version":3,"file":"related-views-button.js","sourceRoot":"","sources":["../../../src/components/view-pane/related-views-button.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA+B;AAC/B,8CAAgD;AAEhD,6DAA0F;AAC1F,oDAAsD;AAOtD;IAA4C,0CAAgD;IAC1F,gCAAY,KAA8B;QAA1C,YACE,kBAAM,KAAK,CAAC,SAGb;QADC,KAAI,CAAC,WAAW,GAAG,KAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAI,CAAC,CAAC;;IACjD,CAAC;IAEM,uCAAM,GAAb;QACS,IAAA,sDAAoB,CAAe;QAC1C,MAAM,CAAC,CACL,6BAAK,SAAS,EAAC,OAAO;YACpB,2BAAG,OAAO,EAAE,IAAI,CAAC,WAAW;gBACzB,oBAAoB,GAAG,QAAQ,GAAG,UAAU;;gBAE5C,oBAAoB,GAAG,2BAAG,SAAS,EAAC,iBAAiB,GAAE,GAAG,2BAAG,SAAS,EAAC,mBAAmB,GAAE,CAC3F,CACA,CACP,CAAC;IACJ,CAAC;IAEO,4CAAW,GAAnB;QACS,IAAA,sDAAoB,CAAe;QAC1C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YACtB,IAAI,EAAE,yCAAyB;YAC/B,OAAO,EAAE;gBACP,cAAc,EAAE,CAAC,oBAAoB;aACtC;SACF,CAAC,CAAC;IACL,CAAC;IACH,6BAAC;AAAD,CAAC,AA7BD,CAA4C,KAAK,CAAC,aAAa,GA6B9D;AA7BY,wDAAsB;AA+BtB,QAAA,kBAAkB,GAAG,CAAC,UAAU,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/build/components/view-pane/related-views-button.scss b/build/components/view-pane/related-views-button.scss new file mode 100644 index 000000000..1ccce3188 --- /dev/null +++ b/build/components/view-pane/related-views-button.scss @@ -0,0 +1,3 @@ +.right { + float: right; +} diff --git a/build/components/view-pane/related-views.d.ts b/build/components/view-pane/related-views.d.ts new file mode 100644 index 000000000..a689fcc7a --- /dev/null +++ b/build/components/view-pane/related-views.d.ts @@ -0,0 +1,22 @@ +/// +import * as React from 'react'; +import { BookmarkAction } from '../../actions/bookmark'; +import { ActionHandler } from '../../actions/redux-action'; +import { ResultAction } from '../../actions/result'; +import { ShelfAction } from '../../actions/shelf'; +import { ShelfPreviewAction } from '../../actions/shelf-preview'; +import { Bookmark } from '../../models/bookmark'; +import { Result, ResultType } from '../../models/result'; +export interface RelatedViewsProps extends ActionHandler { + results: { + [k in ResultType]: Result; + }; + bookmark: Bookmark; +} +export declare class RelatedViewsBase extends React.PureComponent { + render(): JSX.Element; + private onSpecify(relatedViewType); + private onPreviewMouseEnter(relatedViewType); + private onPreviewMouseLeave(relatedViewType); +} +export declare const RelatedViews: React.ComponentClass<{}>; diff --git a/build/components/view-pane/related-views.js b/build/components/view-pane/related-views.js new file mode 100644 index 000000000..6ba91d97f --- /dev/null +++ b/build/components/view-pane/related-views.js @@ -0,0 +1,78 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var CSSModules = require("react-css-modules"); +var react_redux_1 = require("react-redux"); +var redux_action_1 = require("../../actions/redux-action"); +var shelf_preview_1 = require("../../actions/shelf-preview"); +var index_1 = require("../../actions/shelf/index"); +var result_1 = require("../../models/result"); +var index_2 = require("../../queries/index"); +var index_3 = require("../../selectors/index"); +var result_2 = require("../../selectors/result"); +var index_4 = require("../plot-list/index"); +var styles = require("./related-views.scss"); +var RelatedViewsBase = (function (_super) { + __extends(RelatedViewsBase, _super); + function RelatedViewsBase() { + return _super !== null && _super.apply(this, arguments) || this; + } + RelatedViewsBase.prototype.render = function () { + var _this = this; + var _a = this.props, bookmark = _a.bookmark, handleAction = _a.handleAction, results = _a.results; + var subpanes = index_2.RELATED_VIEWS_TYPES.map(function (relatedViewType) { + var title = index_2.RELATED_VIEWS_INDEX[relatedViewType].title; + var result = results[relatedViewType]; + var isLoading = result.isLoading, plots = result.plots; + return ((isLoading || plots && plots.length > 0) && React.createElement("div", { styleName: "related-views-subpane", key: relatedViewType }, + React.createElement("div", null, + React.createElement("h3", null, title), + relatedViewType !== 'histograms' && + React.createElement("i", { title: 'Specify', styleName: 'command', className: "fa fa-server", onClick: _this.onSpecify.bind(_this, relatedViewType), onMouseEnter: _this.onPreviewMouseEnter.bind(_this, relatedViewType), onMouseLeave: _this.onPreviewMouseLeave.bind(_this, relatedViewType) })), + React.createElement(index_4.PlotList, { handleAction: handleAction, bookmark: bookmark, resultType: relatedViewType, result: result }))); + }); + return (React.createElement("div", null, subpanes)); + }; + RelatedViewsBase.prototype.onSpecify = function (relatedViewType) { + var _a = this.props, handleAction = _a.handleAction, results = _a.results; + var query = results[relatedViewType].query; + handleAction({ + type: index_1.SHELF_LOAD_QUERY, + payload: { query: query } + }); + }; + RelatedViewsBase.prototype.onPreviewMouseEnter = function (relatedViewType) { + var _a = this.props, handleAction = _a.handleAction, results = _a.results; + var query = results[relatedViewType].query; + handleAction({ + type: shelf_preview_1.SHELF_PREVIEW_QUERY, + payload: { query: query } + }); + }; + RelatedViewsBase.prototype.onPreviewMouseLeave = function (relatedViewType) { + var handleAction = this.props.handleAction; + handleAction({ type: shelf_preview_1.SHELF_PREVIEW_DISABLE }); + }; + return RelatedViewsBase; +}(React.PureComponent)); +exports.RelatedViewsBase = RelatedViewsBase; +exports.RelatedViews = react_redux_1.connect(function (state) { + return { + results: result_1.RESULT_TYPES.reduce(function (results, resultType) { + results[resultType] = result_2.selectResult[resultType](state); + return results; + }, {}), + bookmark: index_3.selectBookmark(state) + }; +}, redux_action_1.createDispatchHandler())(CSSModules(RelatedViewsBase, styles)); +//# sourceMappingURL=related-views.js.map \ No newline at end of file diff --git a/build/components/view-pane/related-views.js.map b/build/components/view-pane/related-views.js.map new file mode 100644 index 000000000..30167933a --- /dev/null +++ b/build/components/view-pane/related-views.js.map @@ -0,0 +1 @@ +{"version":3,"file":"related-views.js","sourceRoot":"","sources":["../../../src/components/view-pane/related-views.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/components/view-pane/related-views.scss b/build/components/view-pane/related-views.scss new file mode 100644 index 000000000..c19fa6f0d --- /dev/null +++ b/build/components/view-pane/related-views.scss @@ -0,0 +1,13 @@ +.related-views-subpane { + margin-top: 20px; + + h3 { + display: inline-block; + } +} + +.command { + cursor: pointer; + margin-left: 10px; + color: #aaa; +} diff --git a/build/components/view-pane/view-pane.scss b/build/components/view-pane/view-pane.scss new file mode 100644 index 000000000..b31f9f223 --- /dev/null +++ b/build/components/view-pane/view-pane.scss @@ -0,0 +1,36 @@ +.view-pane { + overflow: scroll; + + // Absolute positon relative to Pane wrapper from `react-split-pane` + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +.view-pane-related-views-collapse { + margin-top: 15px; + height: 5%; +} + +.view-pane-related-views, .view-pane-related-views-collapse, .view-pane-specific, .view-pane-specific-stretch { + background: rgba(255,255,255,.6); +} + +.view-pane-specific-stretch { + height: 90%; +} + +.view-pane-related-views { + margin-top: 20px; +} + +.view-pane-gallery { + @extend .view-pane; + background: #C6E5E7; +} + +.gallery-command { + margin-left: 10px; +} diff --git a/build/constants.d.ts b/build/constants.d.ts new file mode 100644 index 000000000..cf28fdbea --- /dev/null +++ b/build/constants.d.ts @@ -0,0 +1,30 @@ +import { VoyagerConfig } from './models/config'; +export declare const HISTORY_LIMIT = 20; +export declare const PLOT_HOVER_MIN_DURATION = 500; +/** + * Types of draggable items (for react-dnd). + */ +export declare const DraggableType: { + FIELD: string; +}; +/** + * Type of parent for Field Component + */ +export declare enum FieldParentType { + ENCODING_SHELF = 0, + FIELD_LIST = 1, +} +export declare const SPINNER_COLOR = "#4C78A8"; +export declare const DEFAULT_DATASETS: ({ + url: string; + name: string; + description: string; + id: string; + group: string; +} | { + url: string; + name: string; + id: string; + group: string; +})[]; +export declare const VOYAGER_CONFIG: VoyagerConfig; diff --git a/build/constants.js b/build/constants.js new file mode 100644 index 000000000..3b37655c8 --- /dev/null +++ b/build/constants.js @@ -0,0 +1,97 @@ +"use strict"; +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HISTORY_LIMIT = 20; +exports.PLOT_HOVER_MIN_DURATION = 500; +/** + * Types of draggable items (for react-dnd). + */ +exports.DraggableType = { + FIELD: 'field' +}; +/** + * Type of parent for Field Component + */ +var FieldParentType; +(function (FieldParentType) { + FieldParentType[FieldParentType["ENCODING_SHELF"] = 0] = "ENCODING_SHELF"; + FieldParentType[FieldParentType["FIELD_LIST"] = 1] = "FIELD_LIST"; +})(FieldParentType = exports.FieldParentType || (exports.FieldParentType = {})); +; +var BASE_DATA_DIR = (process.env.NODE_ENV === 'production') ? 'datasets/' : 'node_modules/vega-datasets/'; +exports.SPINNER_COLOR = '#4C78A8'; +exports.DEFAULT_DATASETS = [ + { + name: 'Barley', + description: 'Barley yield by variety across the upper midwest in 1931 and 1932', + url: 'data/barley.json', + id: 'barley', + group: 'sample' + }, { + name: 'Cars', + description: 'Automotive statistics for a variety of car models between 1970 & 1982', + url: 'data/cars.json', + id: 'cars', + group: 'sample' + }, { + name: 'Crimea', + url: 'data/crimea.json', + id: 'crimea', + group: 'sample' + }, { + name: 'Driving', + url: 'data/driving.json', + id: 'driving', + group: 'sample' + }, { + name: 'Iris', + url: 'data/iris.json', + id: 'iris', + group: 'sample' + }, { + name: 'Jobs', + url: 'data/jobs.json', + id: 'jobs', + group: 'sample' + }, { + name: 'Population', + url: 'data/population.json', + id: 'population', + group: 'sample' + }, { + name: 'Movies', + url: 'data/movies.json', + id: 'movies', + group: 'sample' + }, { + name: 'Birdstrikes', + url: 'data/birdstrikes.json', + id: 'birdstrikes', + group: 'sample' + }, { + name: 'Burtin', + url: 'data/burtin.json', + id: 'burtin', + group: 'sample' + }, { + name: 'Campaigns', + url: 'data/weball26.json', + id: 'weball26', + group: 'sample' + } +].map(function (dataset) { + return __assign({}, dataset, { url: BASE_DATA_DIR + dataset.url }); +}); +var SERVER = process.env.SERVER; +exports.VOYAGER_CONFIG = { + showDataSourceSelector: true, + serverUrl: SERVER +}; +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/build/constants.js.map b/build/constants.js.map new file mode 100644 index 000000000..239ae1ae0 --- /dev/null +++ b/build/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;;;;;;;;AAEa,QAAA,aAAa,GAAG,EAAE,CAAC;AAEnB,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;GAEG;AACU,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;CACf,CAAC;AAEF;;GAEG;AACH,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,yEAAc,CAAA;IACd,iEAAU,CAAA;AACZ,CAAC,EAHW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAG1B;AAAA,CAAC;AAEF,IAAM,aAAa,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,GAAG,WAAW,GAAG,6BAA6B,CAAC;AAE/F,QAAA,aAAa,GAAG,SAAS,CAAC;AAE1B,QAAA,gBAAgB,GAAG;IAChC;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mEAAmE;QAChF,GAAG,EAAE,kBAAkB;QACvB,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,uEAAuE;QACpF,GAAG,EAAE,gBAAgB;QACrB,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,kBAAkB;QACvB,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,mBAAmB;QACxB,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,gBAAgB;QACrB,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,gBAAgB;QACrB,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,sBAAsB;QAC3B,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,kBAAkB;QACvB,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,aAAa;QACnB,GAAG,EAAE,uBAAuB;QAC5B,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,kBAAkB;QACvB,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;KAChB,EAAE;QACD,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,oBAAoB;QACzB,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,QAAQ;KAChB;CAAC,CAAC,GAAG,CAAC,UAAA,OAAO;IACZ,MAAM,cACD,OAAO,IACV,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,IAChC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AAErB,QAAA,cAAc,GAAkB;IAC3C,sBAAsB,EAAE,IAAI;IAC5B,SAAS,EAAE,MAAM;CAClB,CAAC"} \ No newline at end of file diff --git a/build/index.d.ts b/build/index.d.ts new file mode 100644 index 000000000..b1c158e2b --- /dev/null +++ b/build/index.d.ts @@ -0,0 +1 @@ +import 'font-awesome-sass-loader'; diff --git a/build/index.js b/build/index.js new file mode 100644 index 000000000..8fb71278e --- /dev/null +++ b/build/index.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var React = require("react"); +var ReactDOM = require("react-dom"); +var react_redux_1 = require("react-redux"); +require("font-awesome-sass-loader"); +var app_1 = require("./components/app"); +var constants_1 = require("./constants"); +var store_1 = require("./store"); +var store = store_1.configureStore(); +var config = constants_1.VOYAGER_CONFIG; +var data = undefined; +ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store }, + React.createElement(app_1.App, { config: config, data: data, dispatch: store.dispatch })), document.getElementById('root')); +// Hot Module Replacement API +if (module.hot) { + module.hot.accept('./components/app', function () { + var NextApp = require('./components/app').App; + ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store }, + React.createElement(NextApp, { config: config, data: data, dispatch: store.dispatch })), document.getElementById('root')); + }); +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/index.js.map b/build/index.js.map new file mode 100644 index 000000000..bfb81eb66 --- /dev/null +++ b/build/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;AAAA,6BAA+B;AAC/B,oCAAsC;AACtC,2CAAuC;AAEvC,oCAAkC;AAGlC,wCAAqC;AACrC,yCAA6C;AAE7C,iCAAyC;AAEzC,IAAM,KAAK,GAAG,sBAAc,EAAE,CAAC;AAC/B,IAAM,MAAM,GAAkB,0BAAc,CAAC;AAE7C,IAAM,IAAI,GAAS,SAAS,CAAC;AAE7B,QAAQ,CAAC,MAAM,CACX,oBAAC,sBAAQ,IAAC,KAAK,EAAE,KAAK;IAClB,oBAAC,SAAG,IACA,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,CACK,EACX,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAClC,CAAC;AAEF,6BAA6B;AAC7B,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACf,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,EAAE;QACpC,IAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC;QAChD,QAAQ,CAAC,MAAM,CACb,oBAAC,sBAAQ,IAAC,KAAK,EAAE,KAAK;YACpB,oBAAC,OAAO,IACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,KAAK,CAAC,QAAQ,GACxB,CACO,EACX,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"} \ No newline at end of file diff --git a/build/lib-voyager.d.ts b/build/lib-voyager.d.ts new file mode 100644 index 000000000..db538dd25 --- /dev/null +++ b/build/lib-voyager.d.ts @@ -0,0 +1,126 @@ +import 'font-awesome-sass-loader'; +import { Data } from 'vega-lite/build/src/data'; +import { FacetedCompositeUnitSpec } from 'vega-lite/build/src/spec'; +import { VoyagerConfig } from './models/config'; +import { SerializableState } from './models/index'; +export declare type Container = string | HTMLElement; +/** + * The Voyager class encapsulates the voyager application and allows for easy + * instantiation and interaction from non-react projects. + */ +export declare class Voyager { + private container; + private config; + private store; + private data; + private filename; + constructor(container: Container, config: VoyagerConfig, data: Data); + /** + * Update the dataset currently loaded into voyager + * + * @param {VoyagerData} data + * + * @memberof Voyager + */ + updateData(data: Data): void; + /** + * Update state to reflect the previous state + * + * @memberof Voyager + */ + undo(): void; + /** + * Update state to reflect the future state + * + * @memberof Voyager + */ + redo(): void; + /** + * Update the configuration of the voyager application. + * + * @param {VoyagerConfig} config + * + * @memberof Voyager + */ + updateConfig(config: VoyagerConfig): void; + setFilename(filename: string): void; + /** + * Apply a vega-lite spec to voyager. + * + * @param {VoyagerConfig} config + * + * @memberof Voyager + */ + setSpec(spec: Object): void; + /** + * Sets the entire voyager application state. This is useful for restoring + * the state of the application to a previosly saved state. + * + * @param state A State object with the following keys + * + * @param state.config + * @param state.dataset + * @param state.shelf + * @param state.result + * + * @memberof Voyager + */ + setApplicationState(state: SerializableState): void; + /** + * + * Gets the current application state. + * + * @returns {Readonly} + * + * @memberof Voyager + */ + getApplicationState(): SerializableState; + /** + * + * Gets Vega-Lite spec of current specified view + * + * @returns {Readonly} + * + * @memberof Voyager + */ + getSpec(includeData: boolean): FacetedCompositeUnitSpec; + /** + * + * Gets the current bookmarked vega-lite specs. + * + * @returns {string[]} + * + * @memberof Voyager + */ + getBookmarkedSpecs(): string[]; + /** + * Subscribe to state changes. + * + * This is useful for taking state snapshots to persist and later restore. + * + * @param {Function} onChange callback that takes a single state parameter. + * @returns {Function} unsubscribe, call this function to remove this listener. + * + * @memberof Voyager + */ + onStateChange(onChange: (state: SerializableState) => void): Function; + /** + * Initialized the application, and renders it into the target container + * + * @private + * + * @memberof Voyager + */ + private init(); + private render(spec?); + private renderFromState(state); +} +/** + * Create an instance of the voyager application. + * + * @param {Container} container css selector or HTMLElement that will be the parent + * element of the application + * @param {Object} config configuration options + * @param {Array} data data object. Can be a string or an array of objects. + */ +export declare function CreateVoyager(container: Container, config: VoyagerConfig, data: Data): Voyager; diff --git a/build/lib-voyager.js b/build/lib-voyager.js new file mode 100644 index 000000000..885992d2e --- /dev/null +++ b/build/lib-voyager.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("react-css-modules"),require("react-redux"),require("react-dom"),require("react-tether"),require("react-dnd"),require("redux"),require("redux-undo"),require("moment"),require("vega"),require("font-awesome-sass-loader"),require("react-dnd-html5-backend"),require("redux-thunk"),require("vega-lite"),require("vega-tooltip")):"function"==typeof define&&define.amd?define(["react","react-css-modules","react-redux","react-dom","react-tether","react-dnd","redux","redux-undo","moment","vega","font-awesome-sass-loader","react-dnd-html5-backend","redux-thunk","vega-lite","vega-tooltip"],t):"object"==typeof exports?exports.voyager=t(require("react"),require("react-css-modules"),require("react-redux"),require("react-dom"),require("react-tether"),require("react-dnd"),require("redux"),require("redux-undo"),require("moment"),require("vega"),require("font-awesome-sass-loader"),require("react-dnd-html5-backend"),require("redux-thunk"),require("vega-lite"),require("vega-tooltip")):e.voyager=t(e.react,e["react-css-modules"],e["react-redux"],e["react-dom"],e["react-tether"],e["react-dnd"],e.redux,e["redux-undo"],e.moment,e.vega,e["font-awesome-sass-loader"],e["react-dnd-html5-backend"],e["redux-thunk"],e["vega-lite"],e["vega-tooltip"])}(this,function(e,t,n,r,i,o,a,s,l,u,c,d,f,p,h){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/build/",t(t.s=705)}([function(t,n){t.exports=e},function(e,t,n){var r="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,i=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r};e.exports=n(479)(i,!0)},function(e,t,n){"use strict";function r(e,t){var n={};return t.forEach(function(t){e.hasOwnProperty(t)&&(n[t]=e[t])}),n}function i(e,t){var n=_(e);return t.forEach(function(e){delete n[e]}),n}function o(e){return P.isString(e)||P.isNumber(e)||E(e)?String(e):T(e)}function a(e,t){return e.indexOf(t)>-1}function s(e,t){return e.filter(function(e){return!a(t,e)})}function l(e,t){return e.concat(s(t,e))}function u(e,t){for(var n=0,r=0;r0&&r;){for(var i=e,o=0;o=0;s--)(i=e[s])&&(a=(o<3?i(a):o>3?i(t,n,a):i(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a}function a(e,t){return function(n,r){t(n,r,e)}}function s(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function l(e,t,n,r){return new(n||(n=Promise))(function(i,o){function a(e){try{l(r.next(e))}catch(e){o(e)}}function s(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){e.done?i(e.value):new n(function(t){t(e.value)}).then(a,s)}l((r=r.apply(e,t||[])).next())})}function u(e,t){function n(e){return function(t){return r([e,t])}}function r(n){if(i)throw new TypeError("Generator is already executing.");for(;l;)try{if(i=1,o&&(a=o[2&n[0]?"return":n[0]?"throw":"next"])&&!(a=a.call(o,n[1])).done)return a;switch(o=0,a&&(n=[0,a.value]),n[0]){case 0:case 1:a=n;break;case 4:return l.label++,{value:n[1],done:!1};case 5:l.label++,o=n[1],n=[0];continue;case 7:n=l.ops.pop(),l.trys.pop();continue;default:if(a=l.trys,!(a=a.length>0&&a[a.length-1])&&(6===n[0]||2===n[0])){l=0;continue}if(3===n[0]&&(!a||n[1]>a[0]&&n[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}function f(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}function p(){for(var e=[],t=0;t1||i(e,t)})})}function i(e,t){try{o(c[e](t))}catch(e){l(d[0][3],e)}}function o(e){e.value instanceof h?Promise.resolve(e.value.v).then(a,s):l(d[0][2],e)}function a(e){i("next",e)}function s(e){i("throw",e)}function l(e,t){e(t),d.shift(),d.length&&i(d[0][0],d[0][1])}if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var u,c=n.apply(e,t||[]),d=[];return u={},r("next"),r("throw"),r("return"),u[Symbol.asyncIterator]=function(){return this},u}function g(e){function t(t,i){e[t]&&(n[t]=function(n){return(r=!r)?{value:h(e[t](n)),done:"return"===t}:i?i(n):n})}var n,r;return n={},t("next"),t("throw",function(e){throw e}),t("return"),n[Symbol.iterator]=function(){return this},n}function y(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator];return t?t.call(e):"function"==typeof d?d(e):e[Symbol.iterator]()}Object.defineProperty(t,"__esModule",{value:!0}),t.__extends=r,n.d(t,"__assign",function(){return b}),t.__rest=i,t.__decorate=o,t.__param=a,t.__metadata=s,t.__awaiter=l,t.__generator=u,t.__exportStar=c,t.__values=d,t.__read=f,t.__spread=p,t.__await=h,t.__asyncGenerator=m,t.__asyncDelegator=g,t.__asyncValues=y;var v=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},b=Object.assign||function(e){for(var t,n=1,r=arguments.length;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function a(){return{fields:n(524).default,widgets:n(543).default,definitions:{},formContext:{}}}function s(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=e.type;if("function"==typeof t)return function(e){if(!e.MergedWidget){var t=e.defaultProps&&e.defaultProps.options||{};e.MergedWidget=function(n){var r=n.options,i=void 0===r?{}:r,a=o(n,["options"]);return N.default.createElement(e,R({options:R({},t,i)},a))}}return e.MergedWidget}(t);if("string"!=typeof t)throw new Error("Unsupported widget definition: "+(void 0===t?"undefined":M(t)));if(n.hasOwnProperty(t)){return s(e,n[t],n)}if(!F.hasOwnProperty(r))throw new Error('No widget for type "'+r+'"');if(F[r].hasOwnProperty(t)){return s(e,n[F[r][t]],n)}throw new Error('No widget "'+t+'" for type "'+r+'"')}function l(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=t;if(d(r)&&d(e.default))r=f(r,e.default);else if("default"in e)r=e.default;else{if("$ref"in e){var i=_(e.$ref,n);return l(i,r,n)}y(e)&&(r=e.items.map(function(e){return l(e,void 0,n)}))}switch(void 0===r&&(r=e.default),e.type){case"object":return Object.keys(e.properties||{}).reduce(function(t,i){return t[i]=l(e.properties[i],(r||{})[i],n),t},{});case"array":if(e.minItems)return new Array(e.minItems).fill(l(e.items,r,n))}return r}function u(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!d(e))throw new Error("Invalid schema: "+e);var r=E(e,n),i=l(r,e.default,n);return void 0===t?i:d(t)?f(i,t):t||i}function c(e){return Object.keys(e).filter(function(e){return 0===e.indexOf("ui:")}).reduce(function(t,n){var r=e[n];return"ui:widget"===n&&d(r)?(console.warn("Setting options via ui:widget object is deprecated, use ui:options instead"),R({},t,r.options||{},{widget:r.component})):"ui:options"===n&&d(r)?R({},t,r):R({},t,i({},n.substring(3),r))},{})}function d(e){return"object"===(void 0===e?"undefined":M(e))&&null!==e&&!Array.isArray(e)}function f(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=Object.assign({},e);return Object.keys(t).reduce(function(r,i){var o=e[i],a=t[i];return e.hasOwnProperty(i)&&d(a)?r[i]=f(o,a,n):n&&Array.isArray(o)&&Array.isArray(a)?r[i]=o.concat(a):r[i]=a,r},r)}function p(e){if(""!==e){if(/\.$/.test(e))return e;if(/\.0$/.test(e))return e;var t=Number(e),n="number"==typeof t&&!Number.isNaN(t);return/\.\d*0$/.test(e)?e:n?t:e}}function h(e,t){if(!Array.isArray(t))return e;var n=function(e){return e.reduce(function(e,t){return e[t]=!0,e},{})},i=function(e){return e.length>1?"properties '"+e.join("', '")+"'":"property '"+e[0]+"'"},o=n(e),a=n(t),s=t.filter(function(e){return"*"!==e&&!o[e]});if(s.length)throw new Error("uiSchema order list contains extraneous "+i(s));var l=e.filter(function(e){return!a[e]}),u=t.indexOf("*");if(-1===u){if(l.length)throw new Error("uiSchema order list does not contain "+i(l));return t}if(u!==t.lastIndexOf("*"))throw new Error("uiSchema order list contains more than one wildcard item");var c=[].concat(r(t));return c.splice.apply(c,[u,1].concat(r(l))),c}function m(e){return!!e.items&&(Array.isArray(e.items.enum)&&e.uniqueItems)}function g(e,t){return e.items&&"string"===e.items.type&&"data-url"===e.items.format||"files"===t["ui:widget"]}function y(e){return Array.isArray(e.items)&&e.items.length>0&&e.items.every(function(e){return d(e)})}function v(e){return!0===e.additionalItems&&console.warn("additionalItems=true is currently not supported"),d(e.additionalItems)}function b(e){return e.enum.map(function(t,n){return{label:e.enumNames&&e.enumNames[n]||String(t),value:t}})}function _(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=/^#\/definitions\/(.*)$/.exec(e);if(n&&n[1]){var r=n[1].split("/"),i=t,o=!0,a=!1,s=void 0;try{for(var l,u=r[Symbol.iterator]();!(o=(l=u.next()).done);o=!0){var c=l.value;if(c=c.replace(/~1/g,"/").replace(/~0/g,"~"),!i.hasOwnProperty(c))throw new Error("Could not find a definition for "+e+".");i=i[c]}}catch(e){a=!0,s=e}finally{try{!o&&u.return&&u.return()}finally{if(a)throw s}}return i}throw new Error("Could not find a definition for "+e+".")}function E(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e.hasOwnProperty("$ref"))return e;var n=_(e.$ref,t),r=(e.$ref,o(e,["$ref"]));return R({},n,r)}function S(e){return"[object Arguments]"===Object.prototype.toString.call(e)}function O(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(e===t)return!0;if("function"==typeof e||"function"==typeof t)return!0;if("object"!==(void 0===e?"undefined":M(e))||"object"!==(void 0===t?"undefined":M(t)))return!1;if(null===e||null===t)return!1;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(e instanceof RegExp&&t instanceof RegExp)return e.source===t.source&&e.global===t.global&&e.multiline===t.multiline&&e.lastIndex===t.lastIndex&&e.ignoreCase===t.ignoreCase;if(S(e)||S(t)){if(!S(e)||!S(t))return!1;var i=Array.prototype.slice;return O(i.call(e),i.call(t),n,r)}if(e.constructor!==t.constructor)return!1;var o=Object.keys(e),a=Object.keys(t);if(0===o.length&&0===a.length)return!0;if(o.length!==a.length)return!1;for(var s=n.length;s--;)if(n[s]===e)return r[s]===t;n.push(e),r.push(t),o.sort(),a.sort();for(var l=o.length-1;l>=0;l--)if(o[l]!==a[l])return!1;for(var u=void 0,c=o.length-1;c>=0;c--)if(u=o[c],!O(e[u],t[u],n,r))return!1;return n.pop(),r.pop(),!0}function w(e,t,n){var r=e.props,i=e.state;return!O(r,t)||!O(i,n)}function T(e,t,n){var r={$id:t||"root"};if("$ref"in e){return T(E(e,n),t,n)}if("items"in e&&!e.items.$ref)return T(e.items,t,n);if("object"!==e.type)return r;for(var i in e.properties||{}){var o=e.properties[i],a=r.$id+"_"+i;r[i]=T(o,a,n)}return r}function P(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(!e)return{year:-1,month:-1,day:-1,hour:t?-1:0,minute:t?-1:0,second:t?-1:0};var n=new Date(e);if(Number.isNaN(n.getTime()))throw new Error("Unable to parse date "+e);return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:t?n.getUTCHours():0,minute:t?n.getUTCMinutes():0,second:t?n.getUTCSeconds():0}}function A(e){var t=e.year,n=e.month,r=e.day,i=e.hour,o=void 0===i?0:i,a=e.minute,s=void 0===a?0:a,l=e.second,u=void 0===l?0:l,c=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],d=Date.UTC(t,n-1,r,o,s,u),f=new Date(d).toJSON();return c?f:f.slice(0,10)}function x(e,t){for(var n=String(e);n.length=0}function d(e,n){var r=JSON.parse(n.signal.replace(t.SELECTION_DOMAIN,"")),i=w.varName(r.selection),o=e.component.selection&&e.component.selection[i];return o?(S.warn('Use "bind": "scales" to setup a binding for scales and selections within the same view.'),{signal:"null"}):(o=e.getSelectionComponent(i,r.selection),r.encoding||r.field||(r.field=o.project[0].field,o.project.length>1&&S.warn('A "field" or "encoding" must be specified when using a selection as a scale domain. Using "field": '+w.stringValue(r.field)+".")),{signal:p(o.type).scaleDomain+"("+w.stringValue(i+t.STORE)+", "+w.stringValue(r.encoding||null)+", "+w.stringValue(r.field||null)+("global"===o.resolve?")":", "+w.stringValue(o.resolve)+")")})}function f(e,t){var n=e.component.selection;for(var r in n)if(n.hasOwnProperty(r)){var i=n[r];t(i,p(i.type))}}function p(e){switch(e){case"single":return x.default;case"multi":return A.default;case"interval":return P.default}return null}function h(e){for(var t=e.parent;t&&!T.isFacetModel(t);)t=t.parent;return t}function m(e){var t=w.stringValue(e.name),n=h(e);return n&&(t+=(n.facet.row?" + '_' + facet["+w.stringValue(n.field("row"))+"]":"")+(n.facet.column?" + '_' + facet["+w.stringValue(n.field("column"))+"]":"")),t}function g(e){var t=!1;return f(e,function(e){t=t||e.project.some(function(e){return e.field===O.SELECTION_ID})}),t}function y(e,t,n){return w.varName(e.name+"_"+("visual"===n?t:e.fields[t]))}function v(e){var t=null,n=null,r=null,i=null;return e.project.forEach(function(e,o){e.channel===E.X?(t=e,n=o):e.channel===E.Y&&(r=e,i=o)}),{x:t,xi:n,y:r,yi:i}}Object.defineProperty(t,"__esModule",{value:!0});var b=n(4),_=n(154),E=n(3),S=n(7),O=n(630),w=n(2),T=n(33),P=n(156),A=n(238),x=n(620),C=n(624);t.STORE="_store",t.TUPLE="_tuple",t.MODIFY="_modify",t.SELECTION_DOMAIN="_selection_domain_",t.parseUnitSelection=r,t.assembleUnitSelectionSignals=i,t.assembleTopLevelSignals=o,t.assembleUnitSelectionData=a,t.assembleUnitSelectionMarks=s,t.assembleLayerSelectionMarks=l,t.predicate=u,t.isRawSelectionDomain=c,t.selectionScaleDomain=d,t.unitName=m,t.requiresSelectionId=g,t.channelSignalName=y,t.spatialProjections=v},function(e,t,n){"use strict";function r(e){return!!_[e]}function i(e){return!!E[e]}function o(e){return!!w[e]}function a(e){return e.substr(3)}function s(e){return!!T[e]}function l(e,n){var r=o(e),i=r?new Date(Date.UTC(0,0,1,0,0,0,0)):new Date(0,0,1,0,0,0,0);return t.TIMEUNIT_PARTS.forEach(function(t){if(c(e,t))switch(t){case m.DAY:throw new Error("Cannot convert to TimeUnits containing 'day'");case m.QUARTER:var o=u("month",r),a=o.getDateMethod,s=o.setDateMethod;i[s](3*Math.floor(n[a]()/3));break;default:var l=u(t,r),d=l.getDateMethod,f=l.setDateMethod;i[f](n[d]())}}),i}function u(e,t){var n=P[e];return{setDateMethod:t?"setUTC"+n.substr(3):n,getDateMethod:"get"+(t?"UTC":"")+n.substr(3)}}function c(e,t){var n=e.indexOf(t);return n>-1&&(t!==m.SECONDS||0===n||"i"!==e.charAt(n-1))}function d(e,n){function r(e){return e===m.QUARTER?"("+a+"quarter("+i+")-1)":""+a+e+"("+i+")"}var i="datum["+b.stringValue(n)+"]",a=o(e)?"utc":"",s=t.TIMEUNIT_PARTS.reduce(function(t,n){return c(e,n)&&(t[n]=r(n)),t},{});return y.dateTimeExpr(s)}function f(e){if(e)return c(e,m.SECONDS)?"second":c(e,m.MINUTES)?"minute":c(e,m.HOURS)?"hour":c(e,m.DAY)||c(e,m.DATE)?"day":c(e,m.MONTH)?"month":c(e,m.YEAR)?"year":void 0}function p(e,t,n,r){if(e){var i=[],o="",a=c(e,m.YEAR);c(e,m.QUARTER)&&(o="'Q' + quarter("+t+")"),c(e,m.MONTH)&&i.push(!1!==n?"%b":"%B"),c(e,m.DAY)?i.push(n?"%a":"%A"):c(e,m.DATE)&&i.push("%d"+(a?",":"")),a&&i.push(n?"%y":"%Y");var s=[];c(e,m.HOURS)&&s.push("%H"),c(e,m.MINUTES)&&s.push("%M"),c(e,m.SECONDS)&&s.push("%S"),c(e,m.MILLISECONDS)&&s.push("%L");var l=[];return i.length>0&&l.push(i.join(" ")),s.length>0&&l.push(s.join(":")),l.length>0&&(o&&(o+=" + ' ' + "),o+=r?"utcFormat("+t+", '"+l.join(" ")+"')":"timeFormat("+t+", '"+l.join(" ")+"')"),o||void 0}}function h(e){return"day"!==e&&e.indexOf("day")>=0?(v.warn(v.message.dayReplacedWithDate(e)),e.replace("day","date")):e}Object.defineProperty(t,"__esModule",{value:!0});var m,g=n(4),y=n(108),v=n(7),b=n(2);!function(e){e.YEAR="year",e.MONTH="month",e.DAY="day",e.DATE="date",e.HOURS="hours",e.MINUTES="minutes",e.SECONDS="seconds",e.MILLISECONDS="milliseconds",e.YEARMONTH="yearmonth",e.YEARMONTHDATE="yearmonthdate",e.YEARMONTHDATEHOURS="yearmonthdatehours",e.YEARMONTHDATEHOURSMINUTES="yearmonthdatehoursminutes",e.YEARMONTHDATEHOURSMINUTESSECONDS="yearmonthdatehoursminutesseconds",e.MONTHDATE="monthdate",e.HOURSMINUTES="hoursminutes",e.HOURSMINUTESSECONDS="hoursminutesseconds",e.MINUTESSECONDS="minutesseconds",e.SECONDSMILLISECONDS="secondsmilliseconds",e.QUARTER="quarter",e.YEARQUARTER="yearquarter",e.QUARTERMONTH="quartermonth",e.YEARQUARTERMONTH="yearquartermonth",e.UTCYEAR="utcyear",e.UTCMONTH="utcmonth",e.UTCDAY="utcday",e.UTCDATE="utcdate",e.UTCHOURS="utchours",e.UTCMINUTES="utcminutes",e.UTCSECONDS="utcseconds",e.UTCMILLISECONDS="utcmilliseconds",e.UTCYEARMONTH="utcyearmonth",e.UTCYEARMONTHDATE="utcyearmonthdate",e.UTCYEARMONTHDATEHOURS="utcyearmonthdatehours",e.UTCYEARMONTHDATEHOURSMINUTES="utcyearmonthdatehoursminutes",e.UTCYEARMONTHDATEHOURSMINUTESSECONDS="utcyearmonthdatehoursminutesseconds",e.UTCMONTHDATE="utcmonthdate",e.UTCHOURSMINUTES="utchoursminutes",e.UTCHOURSMINUTESSECONDS="utchoursminutesseconds",e.UTCMINUTESSECONDS="utcminutesseconds",e.UTCSECONDSMILLISECONDS="utcsecondsmilliseconds",e.UTCQUARTER="utcquarter",e.UTCYEARQUARTER="utcyearquarter",e.UTCQUARTERMONTH="utcquartermonth",e.UTCYEARQUARTERMONTH="utcyearquartermonth"}(m=t.TimeUnit||(t.TimeUnit={}));var _={year:1,quarter:1,month:1,day:1,date:1,hours:1,minutes:1,seconds:1,milliseconds:1};t.TIMEUNIT_PARTS=b.flagKeys(_),t.isLocalSingleTimeUnit=r;var E={utcyear:1,utcquarter:1,utcmonth:1,utcday:1,utcdate:1,utchours:1,utcminutes:1,utcseconds:1,utcmilliseconds:1};t.isUtcSingleTimeUnit=i;var S={yearquarter:1,yearquartermonth:1,yearmonth:1,yearmonthdate:1,yearmonthdatehours:1,yearmonthdatehoursminutes:1,yearmonthdatehoursminutesseconds:1,quartermonth:1,monthdate:1,hoursminutes:1,hoursminutesseconds:1,minutesseconds:1,secondsmilliseconds:1},O={utcyearquarter:1,utcyearquartermonth:1,utcyearmonth:1,utcyearmonthdate:1,utcyearmonthdatehours:1,utcyearmonthdatehoursminutes:1,utcyearmonthdatehoursminutesseconds:1,utcquartermonth:1,utcmonthdate:1,utchoursminutes:1,utchoursminutesseconds:1,utcminutesseconds:1,utcsecondsmilliseconds:1},w=g.__assign({},E,O);t.isUTCTimeUnit=o,t.getLocalTimeUnit=a;var T=g.__assign({},_,E,S,O);t.TIMEUNITS=b.flagKeys(T),t.isTimeUnit=s;var P={year:"setFullYear",month:"setMonth",date:"setDate",hours:"setHours",minutes:"setMinutes",seconds:"setSeconds",milliseconds:"setMilliseconds",quarter:null,day:null};t.convert=l,t.containsTimeUnit=c,t.fieldExpr=d,t.smallestUnit=f,t.formatExpression=p,t.normalizeTimeUnit=h},function(e,t){e.exports=r},function(e,t){var n=e.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},function(e,t,n){"use strict";function r(e,t,n){for(var r=0,i=n;r1?function(e,n){for(var r=0;rt||null==t)&&null!=e?1:(t=t instanceof Date?+t:t,(e=e instanceof Date?+e:e)!==e&&t===t?-1:t!==t&&e===e?1:0)},i.numcmp=function(e,t){return e-t},i.stablesort=function(e,t,n){var r=e.reduce(function(e,t,r){return e[n(t)]=r,e},{});return e.sort(function(e,i){var o=t(e),a=t(i);return oa?1:r[n(e)]-r[n(i)]}),e},i.permute=function(e){for(var t,n,r=e.length;r;)n=Math.floor(Math.random()*r--),t=e[r],e[r]=e[n],e[n]=t},i.pad=function(e,t,r,i){i=i||" ";var o=t-e.length;if(o<=0)return e;switch(r){case"left":return n(o,i)+e;case"middle":case"center":return n(Math.floor(o/2),i)+e+n(Math.ceil(o/2),i);default:return e+n(o,i)}},i.truncate=function(e,t,n,i,o){var a=e.length;if(a<=t)return e;o=void 0!==o?String(o):"…";var s=Math.max(0,t-o.length);switch(n){case"left":return o+(i?r(e,s,1):e.slice(a-s));case"middle":case"center":var l=Math.ceil(s/2),u=Math.floor(s/2);return(i?r(e,l):e.slice(0,l))+o+(i?r(e,u,1):e.slice(a-u));default:return(i?r(e,s):e.slice(0,s))+o}};var a=/([\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF])/}).call(t,n(349).Buffer)},function(e,t,n){"use strict";function r(e){return e&&"unit"===e.type}function i(e){return e&&"facet"===e.type}function o(e){return e&&"repeat"===e.type}function a(e){return e&&"concat"===e.type}function s(e){return e&&"layer"===e.type}Object.defineProperty(t,"__esModule",{value:!0});var l=n(4),u=n(35),c=n(3),d=n(44),f=n(9),p=n(7),h=n(5),m=n(632),g=n(160),y=n(2),v=n(45),b=n(591),_=n(601),E=n(602),S=n(603),O=n(233),w=n(611),T=n(617),P=n(106),A=n(619),x=n(54),C=function(){function e(){this.nameMap={}}return e.prototype.rename=function(e,t){this.nameMap[e]=t},e.prototype.has=function(e){return void 0!==this.nameMap[e]},e.prototype.get=function(e){for(;this.nameMap[e]&&e!==this.nameMap[e];)e=this.nameMap[e];return e},e}();t.NameMap=C,t.isUnitModel=r,t.isFacetModel=i,t.isRepeatModel=o,t.isConcatModel=a,t.isLayerModel=s;var k=function(){function e(e,t,n,r,i){var o=this;this.children=[],this.correctDataNames=function(e){return e.from&&e.from.data&&(e.from.data=o.lookupDataSource(e.from.data)),e.from&&e.from.facet&&e.from.facet.data&&(e.from.facet.data=o.lookupDataSource(e.from.facet.data)),e},this.parent=t,this.config=r,this.name=e.name||n,this.title=u.isString(e.title)?{text:e.title}:e.title,this.scaleNameMap=t?t.scaleNameMap:new C,this.layoutSizeNameMap=t?t.layoutSizeNameMap:new C,this.data=e.data,this.description=e.description,this.transforms=g.normalizeTransform(e.transform||[]),this.component={data:{sources:t?t.component.data.sources:{},outputNodes:t?t.component.data.outputNodes:{},outputNodeRefCounts:t?t.component.data.outputNodeRefCounts:{},ancestorParse:t?l.__assign({},t.component.data.ancestorParse):{}},layoutSize:new x.Split,layoutHeaders:{row:{},column:{}},mark:null,resolve:l.__assign({scale:{},axis:{},legend:{}},i||{}),selection:null,scales:null,axes:{},legends:{}}}return Object.defineProperty(e.prototype,"width",{get:function(){return this.getSizeSignalRef("width")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"height",{get:function(){return this.getSizeSignalRef("height")},enumerable:!0,configurable:!0}),e.prototype.initSize=function(e){var t=e.width,n=e.height;t&&this.component.layoutSize.set("width",t,!0),n&&this.component.layoutSize.set("height",n,!0)},e.prototype.parse=function(){this.parseScale(),this.parseMarkDef(),this.parseLayoutSize(),this.renameTopLevelLayoutSize(),this.parseSelection(),this.parseData(),this.parseAxisAndHeader(),this.parseLegend(),this.parseMarkGroup()},e.prototype.parseScale=function(){A.parseScale(this)},e.prototype.renameTopLevelLayoutSize=function(){"width"!==this.getName("width")&&this.renameLayoutSize(this.getName("width"),"width"),"height"!==this.getName("height")&&this.renameLayoutSize(this.getName("height"),"height")},e.prototype.parseMarkDef=function(){w.parseMarkDef(this)},e.prototype.parseLegend=function(){O.parseLegend(this)},e.prototype.assembleGroupStyle=function(){if("unit"===this.type||"layer"===this.type)return"cell"},e.prototype.assembleLayoutSize=function(){if("unit"===this.type||"layer"===this.type)return{width:this.getSizeSignalRef("width"),height:this.getSizeSignalRef("height")}},e.prototype.assembleHeaderMarks=function(){for(var e=this.component.layoutHeaders,t=[],n=0,r=_.HEADER_CHANNELS;n0?e:void 0},e.prototype.assembleGroup=function(e){void 0===e&&(e=[]);var t={};e=e.concat(this.assembleSelectionSignals()),e.length>0&&(t.signals=e);var n=this.assembleLayout();n&&(t.layout=n),t.marks=[].concat(this.assembleHeaderMarks(),this.assembleMarks());var r=!this.parent||i(this.parent)?T.assembleScales(this):[];r.length>0&&(t.scales=r);var o=this.assembleAxes();o.length>0&&(t.axes=o);var a=this.assembleLegends();return a.length>0&&(t.legends=a),t},e.prototype.hasDescendantWithFieldOnChannel=function(e){for(var t=0,n=this.children;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e){var t=e.value,n=e.readonly,r=e.disabled,o=e.autofocus,s=e.onBlur,u=e.options,c=(e.schema,e.formContext,e.registry,i(e,["value","readonly","disabled","autofocus","onBlur","options","schema","formContext","registry"]));c.type=u.inputType||c.type||"text";var d=function(t){var n=t.target.value;return e.onChange(""===n?u.emptyValue:n)};return l.default.createElement("input",a({className:"form-control",readOnly:n,disabled:r,autoFocus:o,value:null==t?"":t},c,{onChange:d,onBlur:s&&function(e){return s(c.id,e.target.value)}}))}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t=0}Object.defineProperty(t,"__esModule",{value:!0});var h=n(31),m=n(6),g=n(588),y=n(109),v=n(23),b=n(160);t.fromTransforms=r,t.toTransforms=i,t.toPredicateFunction=o,t.createDefaultFilter=a,t.getAllTimeUnits=s,t.getDefaultTimeRange=l,t.getDefaultList=u,t.convertToDateTimeObject=c,t.convertToTimestamp=d,t.filterIndexOf=f,t.filterHasField=p},function(e,t,n){var r,i;!function(){"use strict";function n(){for(var e=[],t=0;t0?t:o<0?n:a(t,n,r,i)}}function a(e,t,n,r){return e.explicit&&t.explicit&&u.warn(u.message.mergeConflictingProperty(n,r,e.value,t.value)),e}function s(e,t,n,r,i){return void 0===i&&(i=a),void 0===e||void 0===e.value?t:e.explicit&&!t.explicit?e:t.explicit&&!e.explicit?t:e.value===t.value?e:i(e,t,n,r)}Object.defineProperty(t,"__esModule",{value:!0});var l=n(4),u=n(7),c=n(2),d=function(){function e(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.explicit=e,this.implicit=t}return e.prototype.clone=function(){return new e(c.duplicate(this.explicit),c.duplicate(this.implicit))},e.prototype.combine=function(){return l.__assign({},this.explicit,this.implicit)},e.prototype.get=function(e){return void 0!==this.explicit[e]?this.explicit[e]:this.implicit[e]},e.prototype.getWithExplicit=function(e){return void 0!==this.explicit[e]?{explicit:!0,value:this.explicit[e]}:void 0!==this.implicit[e]?{explicit:!1,value:this.implicit[e]}:{explicit:!1,value:void 0}},e.prototype.setWithExplicit=function(e,t){void 0!==t.value&&this.set(e,t.value,t.explicit)},e.prototype.set=function(e,t,n){return delete this[n?"implicit":"explicit"][e],this[n?"explicit":"implicit"][e]=t,this},e.prototype.copyKeyFromSplit=function(e,t){void 0!==t.explicit[e]?this.set(e,t.explicit[e],!0):void 0!==t.implicit[e]&&this.set(e,t.implicit[e],!1)},e.prototype.copyKeyFromObject=function(e,t){void 0!==t[e]&&this.set(e,t[e],!0)},e}();t.Split=d,t.makeExplicit=r,t.makeImplicit=i,t.tieBreakByComparing=o,t.defaultTieBreaker=a,t.mergeValuesWithExplicit=s},function(e,t,n){"use strict";function r(e){return!!e.url}function i(e){return!!e.values}function o(e){return!!e.name}Object.defineProperty(t,"__esModule",{value:!0}),t.isUrlData=r,t.isInlineData=i,t.isNamedData=o,t.MAIN="main",t.RAW="raw"},function(e,t,n){"use strict";function r(e){return t.SPEC_ACTION_TYPE_INDEX[e.type]}Object.defineProperty(t,"__esModule",{value:!0}),t.SPEC_CLEAR="SPEC_CLEAR",t.SPEC_MARK_CHANGE_TYPE="SPEC_MARK_CHANGE_TYPE",t.SPEC_FIELD_ADD="SPEC_FIELD_ADD",t.SPEC_FIELD_AUTO_ADD="SPEC_FIELD_AUTO_ADD",t.SPEC_FIELD_REMOVE="SPEC_FIELD_REMOVE",t.SPEC_FIELD_MOVE="SPEC_FIELD_MOVE",t.SPEC_FIELD_PROP_CHANGE="SPEC_FIELD_PROP_CHANGE",t.SPEC_FIELD_NESTED_PROP_CHANGE="SPEC_FIELD_NESTED_PROP_CHANGE",t.SPEC_FUNCTION_CHANGE="SPEC_FUNCTION_CHANGE",t.SPEC_FUNCTION_ADD_WILDCARD="SPEC_FUNCTION_ADD_WILDCARD",t.SPEC_FUNCTION_DISABLE_WILDCARD="SPEC_FUNCTION_DISABLE_WILDCARD",t.SPEC_FUNCTION_ENABLE_WILDCARD="SPEC_FUNCTION_ENABLE_WILDCARD",t.SPEC_FUNCTION_REMOVE_WILDCARD="SPEC_FUNCTION_REMOVE_WILDCARD",t.SPEC_LOAD="SPEC_LOAD",t.SPEC_ACTION_TYPE_INDEX={SPEC_CLEAR:1,SPEC_LOAD:1,SPEC_MARK_CHANGE_TYPE:1,SPEC_FIELD_ADD:1,SPEC_FIELD_AUTO_ADD:1,SPEC_FIELD_MOVE:1,SPEC_FIELD_PROP_CHANGE:1,SPEC_FIELD_NESTED_PROP_CHANGE:1,SPEC_FIELD_REMOVE:1,SPEC_FUNCTION_CHANGE:1,SPEC_FUNCTION_ADD_WILDCARD:1,SPEC_FUNCTION_DISABLE_WILDCARD:1,SPEC_FUNCTION_ENABLE_WILDCARD:1,SPEC_FUNCTION_REMOVE_WILDCARD:1},t.isSpecAction=r},function(e,t,n){"use strict";function r(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}function i(e){return{mark:e.mark,encodings:s(e.encoding).concat(e.anyEncodings.map(function(e){return d.toEncodingQuery(e,"?")})),config:e.config}}function o(e,t){var n=e.mark,r=e.encodings,i=e.config,o=e.transform;if(c.isWildcardDef(n))throw new Error("Voyager 2 does not support custom wildcard mark yet");if(o&&o.length>0)throw new Error("fromSpecQuery should not contain transform");return l({mark:n},d.fromEncodingQueries(r),{config:i||t})}function a(e){for(var t=!1,n=!1,r=!1,i=0,o=e.encodings;it.max.getTime()&&(t.max=new Date(h))}}else i=u.Type.NOMINAL;i===u.Type.NOMINAL&&c/t.count>n.minPercentUniqueForKey&&t.count>n.minCardinalityForKey&&(i=g.ExpandedType.KEY);var m={name:o,originalIndex:r,vlType:i,type:l,stats:t,timeStats:{},binStats:{}},y=s[m.name];return m=v.extend(m,y)}),d=0,h=c;db[t.vlType]?1:e.name.localeCompare(t.name)}),e.fields.forEach(function(e,t){return e.index=t}),this._fieldSchemaIndex=e.fields.reduce(function(e,t){return e[t.name]=t,e},{})}return e.prototype.fieldNames=function(){return this._tableSchema.fields.map(function(e){return e.name})},Object.defineProperty(e.prototype,"fieldSchemas",{get:function(){return this._tableSchema.fields},enumerable:!0,configurable:!0}),e.prototype.fieldSchema=function(e){return this._fieldSchemaIndex[e]},e.prototype.tableSchema=function(){var e=v.duplicate(this._tableSchema);return e.fields.sort(function(e,t){return e.originalIndex-t.originalIndex}),e},e.prototype.primitiveType=function(e){return this._fieldSchemaIndex[e]?this._fieldSchemaIndex[e].type:null},e.prototype.vlType=function(e){return this._fieldSchemaIndex[e]?this._fieldSchemaIndex[e].vlType:null},e.prototype.cardinality=function(e,t,n){void 0===t&&(t=!0),void 0===n&&(n=!1);var r=this._fieldSchemaIndex[e.field];if(e.aggregate||m.isAutoCountQuery(e)&&e.autoCount)return 1;if(e.bin){var a=void 0;a="boolean"==typeof e.bin?{maxbins:c.autoMaxBins(e.channel)}:"?"===e.bin?{enum:[!0,!1]}:e.bin;var u=a.maxbins;return r.binStats[u]||(r.binStats[u]=i(u,r.stats)),r.binStats[u].distinct}if(e.timeUnit){if(t)switch(e.timeUnit){case d.TimeUnit.SECONDS:case d.TimeUnit.MINUTES:return 60;case d.TimeUnit.HOURS:return 24;case d.TimeUnit.DAY:return 7;case d.TimeUnit.DATE:return 31;case d.TimeUnit.MONTH:return 12;case d.TimeUnit.QUARTER:return 4;case d.TimeUnit.MILLISECONDS:return 1e3}var f=e.timeUnit,p=r.timeStats;return p&&p[f]||(p=l({},p,(h={},h[f]=o(e.timeUnit,r.stats),h))),n?p[f].distinct-s(p[f].unique,["Invalid Date",null]):p[f].distinct}return r?n?r.stats.distinct-s(r.stats.unique,[NaN,null]):r.stats.distinct:null;var h},e.prototype.timeUnitHasVariation=function(e){if(e.timeUnit){if(e.timeUnit===d.TimeUnit.DAY){var t=v.extend({},e,{timeUnit:d.TimeUnit.DATE});if(this.cardinality(t,!1,!0)<=1)return!1}for(var n=e.timeUnit,r=0,i=d.TIMEUNIT_PARTS;r=t)throw new Error("Cannot access property/index "+r+" levels up, current level is "+t);return n[t-r]}if(r>t)throw new Error("Cannot access data "+r+" levels up, current level is "+t);if(o="data"+(t-r||""),!i)return o}for(var s=o,u=i.split("/"),c=0;c=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}},function(e,t,n){"use strict";function r(e){return c.extend(e.data?{data:e.data}:{},e.transform?{transform:e.transform}:{},{mark:e.mark,encodings:c.keys(e.encoding).map(function(t){var n={channel:t},r=e.encoding[t];for(var i in r)u.isEncodingTopLevelProperty(i)&&void 0!==r[i]&&(c.contains(["bin","scale","axis","legend"],i)&&null===r[i]?n[i]=!1:n[i]=r[i]);return d.isFieldQuery(n)&&"count"===n.aggregate&&!n.field&&(n.field="*"),n})},e.config?{config:e.config}:{})}function i(e){return c.some(e.encodings,function(e){return d.isFieldQuery(e)&&!l.isWildcard(e.aggregate)&&!!e.aggregate||d.isEnabledAutoCountQuery(e)})}function o(e){var t=e.config,n=t?t.stack:void 0;if(c.contains(["none",null,!1],n))return null;if(!c.contains(["bar","area"],e.mark))return null;if(!i(e))return null;var r=e.encodings.reduce(function(e,t){return c.contains(s.NONSPATIAL_CHANNELS,t.channel)&&(d.isValueQuery(t)||d.isFieldQuery(t)&&!t.aggregate)&&e.push({channel:t.channel,fieldDef:t}),e},[]);if(0===r.length)return null;var o=e.encodings.reduce(function(e,t){return e||(t.channel===s.Channel.X?t:null)},null),a=e.encodings.reduce(function(e,t){return e||(t.channel===s.Channel.Y?t:null)},null),l=d.isFieldQuery(o)&&!!o.aggregate||d.isAutoCountQuery(o)&&!!o.autoCount;return l!==(d.isFieldQuery(a)&&!!a.aggregate||d.isAutoCountQuery(a)&&!!a.autoCount)?{groupbyChannel:l?a?s.Y:null:o?s.X:null,groupByEncQ:l?a:o,fieldChannel:l?s.X:s.Y,fieldEncQ:l?o:a,impute:c.contains(["area","line"],e.mark),stackBy:r,offset:n||"zero"}:null}function a(e,t){void 0===t&&(t={});var n=t.exclude?f.toMap(t.exclude.map(u.toKey)):{};if(l.isWildcard(e.mark)&&!n.mark)return!0;for(var r=0,i=e.encodings;r=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=Object.assign||function(e){for(var t=1;t1?t-1:0),i=1;i2?n-2:0),o=2;o0},e.prototype.stack=function(){return c.stack(this._spec)},e.prototype.getEncodings=function(){return this._spec.encodings.filter(function(e){return!d.isDisabledAutoCountQuery(e)})},e.prototype.getEncodingQueryByChannel=function(e){for(var t=0,n=this._spec.encodings;t0&&i.push("transform:"+JSON.stringify(e.transform)),n.get(w.Property.STACK)){var a=S.stack(e);if(a){var s=n.duplicate().set("type",!1),l=c(a.fieldEncQ,s,r),d=a.groupByEncQ?c(a.groupByEncQ,s,r):void 0;i.push("stack={field:"+l+","+(d?"by:"+d+",":"")+"offset:"+a.offset+"}")}}if(e.encodings){var f=e.encodings.reduce(function(e,t){if(!E.isDisabledAutoCountQuery(t)){var i=u(t,n,r);i&&e.push(i)}return e},[]).sort().join("|");f&&i.push(f)}return i.join("|")}function u(e,n,r){void 0===n&&(n=t.INCLUDE_ALL),void 0===r&&(r=t.REPLACE_NONE);var i=[];if(n.get(w.Property.CHANNEL)&&i.push(o(e.channel,r.get(w.Property.CHANNEL))),E.isFieldQuery(e)){var a=c(e,n,r);a&&i.push(a)}else E.isValueQuery(e)&&i.push(e.value);return i.join(":")}function c(e,n,r){if(void 0===n&&(n=t.INCLUDE_ALL),void 0===r&&(r=t.REPLACE_NONE),n.get(w.Property.AGGREGATE)&&E.isDisabledAutoCountQuery(e))return"-";var i,a=d(e,n,r),s=f(e,n,r);if(E.isFieldQuery(e)){if(i=n.get("field")?o(e.field,r.get("field")):"...",n.get(w.Property.TYPE))if(O.isWildcard(e.type))i+=","+o(e.type,r.get(w.Property.TYPE));else{var l=((e.type||b.Type.QUANTITATIVE)+"").substr(0,1);i+=","+o(l,r.get(w.Property.TYPE))}i+=s.map(function(e){var t=e.value instanceof Array?"["+e.value+"]":e.value;return","+e.key+"="+t}).join("")}else E.isAutoCountQuery(e)&&(i="*,q");if(!i)return null;if(a){return(_.isString(a)?a:O.SHORT_WILDCARD+(P.keys(a).length>0?JSON.stringify(a):""))+"("+i+")"}return i}function d(e,t,n){if(t.get(w.Property.AGGREGATE)&&e.aggregate&&!O.isWildcard(e.aggregate))return a(e.aggregate,n.get(w.Property.AGGREGATE));if(t.get(w.Property.AGGREGATE)&&E.isEnabledAutoCountQuery(e))return a("count",n.get(w.Property.AGGREGATE));if(t.get(w.Property.TIMEUNIT)&&e.timeUnit&&!O.isWildcard(e.timeUnit))return a(e.timeUnit,n.get(w.Property.TIMEUNIT));if(t.get(w.Property.BIN)&&e.bin&&!O.isWildcard(e.bin))return"bin";for(var r=null,i=0,o=[w.Property.AGGREGATE,w.Property.AUTOCOUNT,w.Property.TIMEUNIT,w.Property.BIN];i0){var g=h.sort(function(e,t){return e.key.localeCompare(t.key)}).reduce(function(e,t){return e[t.key]=t.value,e},{});i.push({key:f+"",value:JSON.stringify(g)})}}}}return i}function p(e){for(var t=e.split("|"),n={mark:t[0],encodings:[]},r=1;r : null;}\n B{render(){}\n\nmake sure that you","use:\n\n A{render(){return <.../>}\n B{render(){return <...>{ check ? : null }<...>}}\n\nThat is:","the parent is always responsible for deciding whether or not to render any of its children.","It is not the child's responsibility to decide whether a render instruction from above should","get ignored or not by returning `null`.\n\nWhen any component gets its render() function called,","that is the signal that it should be rendering its part of the UI. It may in turn decide not to","render all of *its* children, but it should never return `null` for itself. It is not responsible","for that decision."].join(" ")));var a=this.__outsideClickHandler=h(o,r,e,this.props.outsideClickIgnoreClass||u,this.props.excludeScrollbar,this.props.preventDefault||!1,this.props.stopPropagation||!1),c=s.length;s.push(this),l[c]=a,this.props.disableOnClickOutside||this.enableOnClickOutside()}},componentWillReceiveProps:function(e){this.props.disableOnClickOutside&&!e.disableOnClickOutside?this.enableOnClickOutside():!this.props.disableOnClickOutside&&e.disableOnClickOutside&&this.disableOnClickOutside()},componentWillUnmount:function(){this.disableOnClickOutside(),this.__outsideClickHandler=!1;var e=s.indexOf(this);e>-1&&(l[e]&&l.splice(e,1),s.splice(e,1))},enableOnClickOutside:function(){var e=this.__outsideClickHandler;if("undefined"!=typeof document){var t=this.props.eventTypes||c;t.forEach||(t=[t]),t.forEach(function(t){document.addEventListener(t,e)})}},disableOnClickOutside:function(){var e=this.__outsideClickHandler;if("undefined"!=typeof document){var t=this.props.eventTypes||c;t.forEach||(t=[t]),t.forEach(function(t){document.removeEventListener(t,e)})}},render:function(){var n=this.props,r={};return Object.keys(this.props).forEach(function(e){"excludeScrollbar"!==e&&(r[e]=n[e])}),e.prototype.isReactComponent&&(r.ref="instance"),r.disableOnClickOutside=this.disableOnClickOutside,r.enableOnClickOutside=this.enableOnClickOutside,t.createElement(e,r)}});return function(e,t){var n=e.displayName||e.name||"Component";t.displayName="OnClickOutside("+n+")"}(e,o),o}}var s=[],l=[],u="ignore-react-onclickoutside",c=["mousedown","touchstart"],d=function(e,t,n){return e===t||(e.correspondingElement?e.correspondingElement.classList.contains(n):e.classList.contains(n))},f=function(e,t,n){if(e===t)return!0;for(;e.parentNode;){if(d(e,t,n))return!0;e=e.parentNode}return e},p=function(e){return document.documentElement.clientWidth<=e.clientX||document.documentElement.clientHeight<=e.clientY},h=function(e,t,n,r,i,o,a){return function(t){o&&t.preventDefault(),a&&t.stopPropagation();var s=t.target;i&&p(t)||f(s,e,r)!==document||n(t)}};!function(o,a){r=[n(0),n(24),n(53)],void 0!==(i=function(e,t,n){return n||(n=e.createClass),a(o,e,t,n)}.apply(t,r))&&(e.exports=i)}(o,a)}(this)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=Object.assign||function(e){for(var t=1;t0){var i=n[0];return n.length>1&&(E.warn(E.message.MORE_THAN_ONE_SORT),i=!0),h.__assign({},r,{sort:i})}return r}var o=n.filter(function(e){return!!w.isBoolean(e)||("count"===e.op||(E.warn(E.message.domainSortDropped(e)),!1))}),a=!0;if(1===o.length)a=o[0];else if(o.length>1){var s=o.filter(function(e){return!1!==e});s.length>1?(E.warn(E.message.MORE_THAN_ONE_SORT),a=!0):a=s[0]}var l=w.unique(e.map(function(e){return T.isDataRefDomain(e)?e.data:null}),function(e){return e});if(1===l.length&&null!==l[0]){var r={data:l[0],fields:t.map(function(e){return e.field}),sort:a};return r}return{fields:t,sort:a}}function f(e){if(T.isDataRefDomain(e)&&m.isString(e.field))return e.field;if(P.isDataRefUnionedDomain(e)){for(var t=void 0,n=0,r=e.fields;n4&&l.warn(l.message.invalidTimeUnit("quarter",e)),e-1+"";throw new Error(l.message.invalidTimeUnit("quarter",e))}function o(e){if(u.isNumber(e))return e-1+"";var n=e.toLowerCase(),r=t.MONTHS.indexOf(n);if(-1!==r)return r+"";var i=n.substr(0,3),o=t.SHORT_MONTHS.indexOf(i);if(-1!==o)return o+"";throw new Error(l.message.invalidTimeUnit("month",e))}function a(e){if(u.isNumber(e))return e%7+"";var n=e.toLowerCase(),r=t.DAYS.indexOf(n);if(-1!==r)return r+"";var i=n.substr(0,3),o=t.SHORT_DAYS.indexOf(i);if(-1!==o)return o+"";throw new Error(l.message.invalidTimeUnit("day",e))}function s(e,t){void 0===t&&(t=!1);var n=[];if(t&&void 0!==e.day&&u.keys(e).length>1&&(l.warn(l.message.droppedDay(e)),e=u.duplicate(e),delete e.day),void 0!==e.year?n.push(e.year):void 0!==e.day?n.push(c):n.push(0),void 0!==e.month){var r=t?o(e.month):e.month;n.push(r)}else if(void 0!==e.quarter){var s=t?i(e.quarter):e.quarter;n.push(s+"*3")}else n.push(0);if(void 0!==e.date)n.push(e.date);else if(void 0!==e.day){var d=t?a(e.day):e.day;n.push(d+"+1")}else n.push(1);for(var f=0,p=["hours","minutes","seconds","milliseconds"];f= "+c(r,e.timeUnit)),null!==s&&l.push(n+" <= "+c(s,e.timeUnit)),l.length>0?l.join(" && "):"true"}throw new Error("Invalid field filter: "+JSON.stringify(e))}function c(e,t){if(h.isDateTime(e)){var n=h.dateTimeExpr(e,!0);return"time("+n+")"}if(g.isLocalSingleTimeUnit(t)){var r={};r[t]=e;var n=h.dateTimeExpr(r,!0);return"time("+n+")"}return g.isUtcSingleTimeUnit(t)?c(e,g.getLocalTimeUnit(t)):JSON.stringify(e)}function d(e){return s(e)&&e.timeUnit?f.__assign({},e,{timeUnit:g.normalizeTimeUnit(e.timeUnit)}):e}Object.defineProperty(t,"__esModule",{value:!0});var f=n(4),p=n(22),h=n(108),m=n(9),g=n(23),y=n(2);t.isSelectionFilter=r,t.isEqualFilter=i,t.isRangeFilter=o,t.isOneOfFilter=a,t.isFieldFilter=s,t.expression=l,t.fieldFilterExpression=u,t.normalizeFilter=d},function(e,t,n){"use strict";var r=n(240);t.a=function(e){function t(){s.push(d+e.substring(i,o)),d="",i=o+1}var i,o,a,s=[],l=null,u=0,c=e.length,d="";for(e+="",i=o=0;oi&&t(),u=i=o+1):"]"===a&&(u||n.i(r.a)("Access path missing open bracket: "+e),u>0&&t(),u=0,i=o+1):o>i?t():i=o+1}return u&&n.i(r.a)("Access path missing closing bracket: "+e),l&&n.i(r.a)("Access path missing closing quote: "+e),o>i&&(o++,t()),s}},function(e,t,n){"use strict";function r(e){return n.i(i.a)(e)?"["+e.map(r)+"]":n.i(o.a)(e)||n.i(a.a)(e)?JSON.stringify(e).replace("\u2028","\\u2028").replace("\u2029","\\u2029"):e}t.a=r;var i=n(162),o=n(244),a=n(245)},function(e,t,n){"use strict";var r=n(247);t.a=function(e){function t(){s.push(d+e.substring(i,o)),d="",i=o+1}var i,o,a,s=[],l=null,u=0,c=e.length,d="";for(e+="",i=o=0;oi&&t(),u=i=o+1):"]"===a&&(u||n.i(r.a)("Access path missing open bracket: "+e),u>0&&t(),u=0,i=o+1):o>i?t():i=o+1}return u&&n.i(r.a)("Access path missing closing bracket: "+e),l&&n.i(r.a)("Access path missing closing quote: "+e),o>i&&(++o,t()),s}},function(e,t,n){"use strict";function r(e){return n.i(i.a)(e)?"["+e.map(r)+"]":n.i(o.a)(e)||n.i(a.a)(e)?JSON.stringify(e).replace("\u2028","\\u2028").replace("\u2029","\\u2029"):e}t.a=r;var i=n(166),o=n(252),a=n(253)},function(e,t,n){"use strict";var r=function(){};r=function(e,t,n){var r=arguments.length;n=new Array(r>2?r-2:0);for(var i=2;i1?"?":u.enum[0]:u;var h=o.createElement("span",{styleName:f?"wildcard-field-pill":a?"field-pill":"field",onDoubleClick:this.onDoubleClick},this.renderCaretTypeSpan(),this.renderFuncSpan(e),o.createElement("span",{styleName:p?"fn-text":"text"},i.isWildcard(c)?d:"*"!==c?c:""),this.renderAddFilterSpan(),this.renderAddSpan(),this.renderRemoveSpan());return s?o.createElement("div",{ref:this.fieldRefHandler},o.createElement(l,{attachment:"top left",targetAttachment:"bottom left"},n?n(h):h,o.createElement("div",{ref:this.popupRefHandler},this.state.popupIsOpened&&s))):n?n(h):h},t.prototype.onFilterToggle=function(){var e=this.props,t=e.filter,n=e.fieldDef;t.onToggle(n)},t.prototype.renderCaretTypeSpan=function(){var e=this.props,t=e.caretShow,n=e.fieldDef,r=e.popupComponent,i=n.type,a=h[i],s=p[i];return o.createElement("span",{styleName:"caret-type",onClick:this.togglePopup},t&&o.createElement("i",{className:(r?"":"hidden ")+"fa fa-caret-down"}),t&&" ",i&&o.createElement("i",{className:"fa "+a,styleName:"type",title:s}))},t.prototype.renderAddSpan=function(){return this.props.onAdd&&o.createElement("span",null,o.createElement("a",{onClick:this.onAdd},o.createElement("i",{className:"fa fa-plus"})))},t.prototype.renderRemoveSpan=function(){var e=this.props.onRemove;return e&&o.createElement("span",null,o.createElement("a",{onClick:e},o.createElement("i",{className:"fa fa-times"})))},t.prototype.renderAddFilterSpan=function(){var e=this.props,t=e.filter,n=e.fieldDef;if(t&&!i.isWildcard(n.field)){var r=t.active?"":"filter-button-unadded";return this.props.filter&&o.createElement("span",{styleName:r},o.createElement("a",{onClick:this.onFilterToggle},o.createElement("i",{className:"fa fa-filter"})))}},t.prototype.renderFuncSpan=function(e){return o.createElement("span",{styleName:"func",title:e},e)},t.prototype.onAdd=function(){this.props.onAdd(this.props.fieldDef)},t.prototype.onDoubleClick=function(){this.props.onDoubleClick&&this.props.onDoubleClick(this.props.fieldDef)},t.prototype.handleClickOutside=function(e){!this.field||this.field.contains(e.target)||this.popup.contains(e.target)||this.closePopup()},t.prototype.closePopup=function(){this.props.popupComponent&&this.setState({popupIsOpened:!1})},t.prototype.togglePopup=function(){this.props.popupComponent&&this.setState({popupIsOpened:!this.state.popupIsOpened})},t}(o.PureComponent),p={nominal:"text",ordinal:"text-ordinal",quantitative:"number",temporal:"time",geographic:"geo"},h={nominal:"fa-font",ordinal:"fa-font",quantitative:"fa-hashtag",temporal:"fa-calendar"},m={beginDrag:function(e){var t,n=e.fieldDef,r=e.parentId,o=e.schema;return i.isWildcard(n.field)||"*"===n.field||(t=o.domain({field:n.field})),{fieldDef:n,parentId:r,filter:c.createDefaultFilter(n,t)}},canDrag:function(e,t){return e.draggable}},g=function(e,t){return{connectDragSource:e.dragSource(),isDragging:t.isDragging()}};t.Field=s.DragSource(u.DraggableType.FIELD,m,g)(a(f,d))},function(e,t){e.exports=o},function(e,t){e.exports=a},function(e,t,n){"use strict";function r(e){this.message="validation failed",this.errors=e,this.ajv=this.validation=!0}function i(e,t,n){this.message=n||i.message(e,t),this.missingRef=a.url(e,t),this.missingSchema=a.normalizeId(a.fullPath(this.missingRef))}function o(e){return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e,e}var a=n(122);e.exports={Validation:o(r),MissingRef:o(i)},i.message=function(e,t){return"can't resolve reference "+t+" from id "+e}},function(e,t,n){"use strict";function r(e,t,n){var o=this._refs[n];if("string"==typeof o){if(!this._refs[o])return r.call(this,e,t,o);o=this._refs[o]}if((o=o||this._schemas[n])instanceof v)return s(o.schema,this._opts.inlineRefs)?o.schema:o.validate||this._compile(o);var a,l,u,c=i.call(this,t,n);return c&&(a=c.schema,t=c.root,u=c.baseId),a instanceof v?l=a.validate||e.call(this,a.schema,t,void 0,u):void 0!==a&&(l=s(a,this._opts.inlineRefs)?a:e.call(this,a,t,void 0,u)),l}function i(e,t){var n=m.parse(t,!1,!0),r=d(n),i=c(this._getId(e.schema));if(r!==i){var s=f(r),l=this._refs[s];if("string"==typeof l)return o.call(this,e,l,n);if(l instanceof v)l.validate||this._compile(l),e=l;else{if(!((l=this._schemas[s])instanceof v))return;if(l.validate||this._compile(l),s==f(t))return{schema:l,root:e,baseId:i};e=l}if(!e.schema)return;i=c(this._getId(e.schema))}return a.call(this,n,i,e.schema,e)}function o(e,t,n){var r=i.call(this,e,t);if(r){var o=r.schema,s=r.baseId;e=r.root;var l=this._getId(o);return l&&(s=p(s,l)),a.call(this,n,s,o,e)}}function a(e,t,n,r){if(e.hash=e.hash||"","#/"==e.hash.slice(0,2)){for(var o=e.hash.split("/"),a=1;a0?i[f-1].duplicate():new l.PropIndex),o.push(f>0?o[f-1].duplicate():new l.PropIndex);var p=t[f].groupBy;if(a.isArray(p)){var h=u.parseGroupBy(p,i[f],o[f]);s.push(h.replacer)}}return e.forEach(function(e){for(var o="",l=n,u=0;udocument.F=Object<\/script>"),e.close(),l=e.F;r--;)delete l.prototype[o[r]];return l()};e.exports=Object.create||function(e,t){var n;return null!==e?(s.prototype=r(e),n=new s,s.prototype=null,n[a]=e):n=l(),void 0===t?n:i(n,t)}},function(e,t,n){var r=n(100),i=n(80),o=n(52),a=n(139),s=n(61),l=n(191),u=Object.getOwnPropertyDescriptor;t.f=n(60)?u:function(e,t){if(e=o(e),t=a(t,!0),l)try{return u(e,t)}catch(e){}if(s(e,t))return i(!r.f.call(e,t),e[t])}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(51).f,i=n(61),o=n(37)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){var r=n(137)("keys"),i=n(102);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){var r=n(50),i=r["__core-js_shared__"]||(r["__core-js_shared__"]={});e.exports=function(e){return i[e]||(i[e]={})}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(77);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){var r=n(50),i=n(25),o=n(131),a=n(141),s=n(51).f;e.exports=function(e){var t=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:a.f(e)})}},function(e,t,n){t.f=n(37)},function(e,t,n){"use strict";e.exports=function e(t,n){if(t===n)return!0;var r,i=Array.isArray(t),o=Array.isArray(n);if(i&&o){if(t.length!=n.length)return!1;for(r=0;r1?t-1:0),r=1;r2?r-2:0),o=2;or}function o(e){return e.touches.length>1||"touchend"===e.type.toLowerCase()&&e.touches.length>0}function a(e,t){var n=t.marks,r=t.step,i=t.min,o=Object.keys(n).map(parseFloat);if(null!==r){var a=Math.round((e-i)/r)*r+i;o.push(a)}var s=o.map(function(t){return Math.abs(e-t)});return o[s.indexOf(Math.min.apply(Math,g()(s)))]}function s(e){var t=e.toString(),n=0;return t.indexOf(".")>=0&&(n=t.length-t.indexOf(".")-1),n}function l(e,t){return e?t.clientY:t.pageX}function u(e,t){return e?t.touches[0].clientY:t.touches[0].pageX}function c(e,t){var n=t.getBoundingClientRect();return e?n.top+.5*n.height:n.left+.5*n.width}function d(e,t){var n=t.max,r=t.min;return e<=r?r:e>=n?n:e}function f(e,t){var n=t.step,r=a(e,t);return null===n?r:parseFloat(r.toFixed(s(n)))}function p(e){e.stopPropagation(),e.preventDefault()}function h(e){switch(e.keyCode){case v.a.UP:case v.a.RIGHT:return function(e,t){return e+t.step};case v.a.DOWN:case v.a.LEFT:return function(e,t){return e-t.step};case v.a.END:return function(e,t){return t.max};case v.a.HOME:return function(e,t){return t.min};case v.a.PAGE_UP:return function(e,t){return e+2*t.step};case v.a.PAGE_DOWN:return function(e,t){return e-2*t.step};default:return}}t.f=r,t.a=i,t.h=o,t.e=l,t.i=u,t.g=c,t.c=d,t.d=f,t.b=p,t.j=h;var m=n(123),g=n.n(m),y=n(24),v=(n.n(y),n(504))},function(e,t,n){e.exports=n(552)},function(e,t,n){var r=n(576),i=n(0);e.exports=function(e,t,n){var i=e[t];if(i){var o=[];if(Object.keys(i).forEach(function(e){-1===r.indexOf(e)&&o.push(e)}),o.length)throw new Error("Prop "+t+" passed to "+n+". Has invalid keys "+o.join(", "))}},e.exports.isRequired=function(t,n,r){if(!t[n])throw new Error("Prop "+n+" passed to "+r+" is required");return e.exports(t,n,r)},e.exports.supportingArrays=i.PropTypes.oneOfType([i.PropTypes.arrayOf(e.exports),e.exports])},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return e.type===d.default||e.type===p.default||e.type===m.default}function o(e,t){return u.Children.map(e,function(e){return null===e?null:i(e)?t(e):e.props&&e.props.children&&"object"===l(e.props.children)?(0,u.cloneElement)(e,s({},e.props,{children:o(e.props.children,t)})):e})}function a(e,t){return u.Children.forEach(e,function(e){null!==e&&(e.type===d.default||e.type===m.default?t(e):e.props&&e.props.children&&"object"===l(e.props.children)&&(e.type===p.default&&t(e),a(e.props.children,t)))})}t.__esModule=!0;var s=Object.assign||function(e){for(var t=1;t",'"',"`"," ","\r","\n","\t"],h=["{","}","|","\\","^","`"].concat(p),m=["'"].concat(h),g=["%","/","?",";","#"].concat(m),y=["/","?","#"],v={javascript:!0,"javascript:":!0},b={javascript:!0,"javascript:":!0},_={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},E=n(483);r.prototype.parse=function(e,t,n){if(!u.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var r=e.indexOf("?"),i=-1!==r&&r127?D+="x":D+=k[M];if(!D.match(/^[+a-z0-9A-Z_-]{0,63}$/)){var I=x.slice(0,O),N=x.slice(O+1),F=k.match(/^([+a-z0-9A-Z_-]{0,63})(.*)$/);F&&(I.push(F[1]),N.unshift(F[2])),N.length&&(a="/"+N.join(".")+a),this.hostname=I.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),A||(this.hostname=l.toASCII(this.hostname));var L=this.port?":"+this.port:"",j=this.hostname||"";this.host=j+L,this.href+=this.host,A&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==a[0]&&(a="/"+a))}if(!v[p])for(var O=0,C=m.length;O0)&&n.host.split("@");T&&(n.auth=T.shift(),n.host=n.hostname=T.shift())}return n.search=e.search,n.query=e.query,u.isNull(n.pathname)&&u.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!O.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var P=O.slice(-1)[0],A=(n.host||e.host||O.length>1)&&("."===P||".."===P)||""===P,x=0,C=O.length;C>=0;C--)P=O[C],"."===P?O.splice(C,1):".."===P?(O.splice(C,1),x++):x&&(O.splice(C,1),x--);if(!E&&!S)for(;x--;x)O.unshift("..");!E||""===O[0]||O[0]&&"/"===O[0].charAt(0)||O.unshift(""),A&&"/"!==O.join("/").substr(-1)&&O.push("");var k=""===O[0]||O[0]&&"/"===O[0].charAt(0);if(w){n.hostname=n.host=k?"":O.length?O.shift():"";var T=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@");T&&(n.auth=T.shift(),n.host=n.hostname=T.shift())}return E=E||n.host&&O.length,E&&!k&&O.unshift(""),O.length?n.pathname=O.join("/"):(n.pathname=null,n.path=null),u.isNull(n.pathname)&&u.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},r.prototype.parseHost=function(){var e=this.host,t=d.exec(e);t&&(t=t[0],":"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(587);n.d(t,"selector",function(){return r.a})},function(e,t,n){"use strict";function r(e){return a.isBoolean(e)?"bin":"bin"+a.keys(e).map(function(t){return"_"+t+"_"+e[t]}).join("")}function i(e){switch(e){case o.ROW:case o.COLUMN:case o.SIZE:case o.COLOR:case o.OPACITY:case o.SHAPE:return 6;default:return 10}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),a=n(2);t.binToString=r,t.autoMaxBins=i},function(e,t,n){"use strict";function r(e,n,r){var o=c.channelSignalName(n,r,"visual"),s=c.channelSignalName(n,r,"data"),f=d.default.has(n),p=e.scaleName(r),h=u.stringValue(p),m=e.getScaleComponent(r),g=m?m.get("type"):void 0,y=e.getSizeSignalRef(r===a.X?"width":"height").signal,v=r+"(unit)",b=i(n,function(e,t){return e.concat({events:t.between[0],update:"["+v+", "+v+"]"},{events:t,update:"["+o+"[0], clamp("+v+", 0, "+y+")]"})});return b.push({events:{signal:n.name+t.SCALE_TRIGGER},update:l.hasContinuousDomain(g)&&!l.isBinScale(g)?"[scale("+h+", "+s+"[0]), scale("+h+", "+s+"[1])]":"[0, 0]"}),f?[{name:s,on:[]}]:[{name:o,value:[],on:b},{name:s,on:[{events:{signal:o},update:o+"[0] === "+o+"[1] ? null : invert("+h+", "+o+")"}]}]}function i(e,t){return e.events.reduce(function(e,n){return n.between?t(e,n):(s.warn(n+" is not an ordered event stream for interval selections"),e)},[])}Object.defineProperty(t,"__esModule",{value:!0});var o=n(4),a=n(3),s=n(7),l=n(5),u=n(2),c=n(22),d=n(107);t.BRUSH="_brush",t.SCALE_TRIGGER="_scale_trigger";var f={predicate:"vlInterval",scaleDomain:"vlIntervalDomain",signals:function(e,n){var o=n.name,f=d.default.has(n),p=[],h=[],m=[],g=[];if(n.translate&&!f){var y="!event.item || event.item.mark.name !== "+u.stringValue(o+t.BRUSH);i(n,function(e,t){var n=t.between[0].filter||(t.between[0].filter=[]);n.indexOf(y)<0&&n.push(y)})}return n.project.forEach(function(t){var i=t.channel;if(i!==a.X&&i!==a.Y)return void s.warn("Interval selections only support x and y encoding channels.");var o=r(e,n,i),d=c.channelSignalName(n,i,"data"),f=c.channelSignalName(n,i,"visual"),y=u.stringValue(e.scaleName(i)),v=e.getScaleComponent(i).get("type"),b=l.hasContinuousDomain(v)?"+":"";p.push.apply(p,o),m.push(d),h.push("{encoding: "+u.stringValue(i)+", field: "+u.stringValue(t.field)+", extent: "+d+"}"),g.push({scaleName:e.scaleName(i),expr:"(!isArray("+d+") || ("+b+"invert("+y+", "+f+")[0] === "+b+d+"[0] && "+b+"invert("+y+", "+f+")[1] === "+b+d+"[1]))"})}),f||p.push({name:o+t.SCALE_TRIGGER,update:g.map(function(e){return e.expr}).join(" && ")+" ? "+(o+t.SCALE_TRIGGER)+" : {}"}),p.concat({name:o+c.TUPLE,on:[{events:m.map(function(e){return{signal:e}}),update:m.join(" && ")+" ? {unit: "+c.unitName(e)+", intervals: ["+h.join(", ")+"]} : null"}]})},modifyExpr:function(e,t){return t.name+c.TUPLE+", "+("global"===t.resolve?"true":"{unit: "+c.unitName(e)+"}")},marks:function(e,n,r){var i=n.name,a=c.spatialProjections(n),s=a.xi,l=a.yi,f="data("+u.stringValue(n.name+c.STORE)+")";if(d.default.has(n))return r;var p={x:null!==s?{signal:i+"_x[0]"}:{value:0},y:null!==l?{signal:i+"_y[0]"}:{value:0},x2:null!==s?{signal:i+"_x[1]"}:{field:{group:"width"}},y2:null!==l?{signal:i+"_y[1]"}:{field:{group:"height"}}};"global"===n.resolve&&u.keys(p).forEach(function(t){p[t]=[o.__assign({test:f+".length && "+f+"[0].unit === "+c.unitName(e)},p[t]),{value:0}]});var h=n.mark,m=h.fill,g=h.fillOpacity,y=o.__rest(h,["fill","fillOpacity"]),v=u.keys(y).reduce(function(e,t){return e[t]={value:y[t]},e},{});return[{name:i+t.BRUSH+"_bg",type:"rect",clip:!0,encode:{enter:{fill:{value:m},fillOpacity:{value:g}},update:p}}].concat(r,{name:i+t.BRUSH,type:"rect",clip:!0,encode:{enter:o.__assign({fill:{value:"transparent"}},v),update:p}})}};t.default=f},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(22),i={has:function(e){return"interval"!==e.type&&e.nearest},marks:function(e,t,n,i){var o=r.spatialProjections(t),a=o.x,s=o.y,l=n[0],u=i.indexOf(l),c=l.name===e.getName("pathgroup"),d=function(e){return e.name&&e.name.indexOf("voronoi")>=0},f={name:e.getName("voronoi"),type:"path",from:{data:e.getName("marks")},encode:{enter:{fill:{value:"transparent"},strokeWidth:{value:.35},stroke:{value:"transparent"},isVoronoi:{value:!0}}},transform:[{type:"voronoi",x:a||!a&&!s?"datum.x":{expr:"0"},y:s||!a&&!s?"datum.y":{expr:"0"},size:[e.getSizeSignalRef("width"),e.getSizeSignalRef("height")]}]};return c&&!l.marks.filter(d).length?(l.marks.push(f),i.splice(u,1,l)):c||i.filter(d).length||i.splice(u+1,0,f),i}};t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultLegendConfig={},t.LEGEND_PROPERTIES=["entryPadding","format","offset","orient","tickCount","title","type","values","zindex"],t.VG_LEGEND_PROPERTIES=[].concat(["fill","stroke","shape","size","opacity","encode"],t.LEGEND_PROPERTIES)},function(e,t,n){"use strict";function r(e){return!!e.or}function i(e){return!!e.and}function o(e){return!!e.not}function a(e,t){if(o(e))a(e.not,t);else if(i(e))for(var n=0,s=e.and;n0?{transform:r}:{})},enumerable:!0,configurable:!0}),t.prototype.renderCopySpecButton=function(){return o.createElement(a,{onCopy:this.copied.bind(this),text:JSON.stringify(this.specWithFilter,null,2)},o.createElement("i",{title:"Copy",className:"fa fa-clipboard"}))},t.prototype.copied=function(){var e=this;this.setState({copiedPopupIsOpened:!0}),window.setTimeout(function(){e.setState({copiedPopupIsOpened:!1})},1e3)},t.prototype.isVerticallyOverFlown=function(e){return e.scrollHeight>e.clientHeight},t}(o.PureComponent);t.PlotBase=_,t.Plot=s(_,b)},function(e,t,n){"use strict";function r(e){return p.isWildcard(e.channel)}function i(e){return e.reduce(function(e,t){return p.isWildcard(t.channel)?e.anyEncodings.push(c({channel:t.channel},o(t))):e.encoding[t.channel]=o(t),e},{encoding:{},anyEncodings:[]})}function o(e){if(f.isFieldQuery(e))return l(e);throw f.isAutoCountQuery(e)?Error("AutoCount Query not yet supported"):Error("Value Query not yet supported")}function a(e,t){return s(e,t)}function s(e,t){var n=e.fn,r=d(e,["fn"]);return c({channel:t},m.toFieldQueryFunctionMixins(n),r)}function l(e){var t=e.aggregate,n=e.bin,r=e.hasFn,i=e.timeUnit,o=e.field,a=e.scale,s=e.axis,l=e.legend,d=e.sort,f=e.description,h=e.type;if(p.isWildcard(h))throw Error("Voyager does not support wildcard type");"ordinal"===h&&(console.warn("Voyager does not support ordinal type yet, converting to nominal"),h="nominal");var g=m.fromFieldQueryFunctionMixins({aggregate:t,bin:n,timeUnit:i,hasFn:r});return c({},g?{fn:g}:{},{field:o,type:h},d?{sort:d}:{},a?{scale:u(e,"scale")}:{},s?{axis:u(e,"axis")}:{},l?{legend:u(e,"legend")}:{},f?{description:f}:{})}function u(e,t){var n=e[t];if(n){if(p.isWildcard(n))throw Error("Voyager does not support wildcard "+t);if(h.isBoolean(n))throw Error("Voyager does not support boolean "+t);return Object.keys(n).forEach(function(e){if(p.isWildcard(n[e]))throw Error("Voyager does not support wildcard "+t+" "+e)}),n}}var c=this&&this.__assign||Object.assign||function(e){for(var t,n=1,r=arguments.length;n0?1:0)+(r.length>0?1:0)+(i?1:0),m=h>1||o,g=m?[void 0]:[],y=!o,v=u({},n.length>0?{aggregate:{enum:[].concat(g,n)}}:{},r.length>0?{timeUnit:{enum:[].concat(g,r)}}:{},i?{bin:{enum:(m?[!1]:[]).concat([!0])}}:{},y?{hasFn:y}:{});return v.aggregate||v.timeUnit||v.bin?v:{bin:{enum:[!1]},timeUnit:{enum:[void 0]},aggregate:{enum:[void 0]}}}return f.isAggregateOp(e)?{aggregate:e}:"bin"===e?{bin:!0}:p.isTimeUnit(e)?{timeUnit:e}:{}}function a(e){return i?void 0!==e&&null!==e:(console.warn("Invalid function "+e+" dropped"),!1)}function s(e){var t,n=c.DEFAULT_QUERY_CONFIG,r=e.aggregate,i=e.bin,o=e.hasFn,s=e.timeUnit,u=[],f=!1;if(i)if(d.isWildcard(i)){var p=d.isShortWildcard(i)?[!0,!1]:i.enum;u=u.concat(h.contains(p,!0)?["bin"]:[]),f=f||h.contains(p,!1)}else i&&(t="bin");if(r)if(d.isWildcard(r)){var m=d.isShortWildcard(r)?n.enum.aggregate:r.enum;u=u.concat(m.filter(a)),f=f||h.contains(m,void 0)}else{if(t)throw Error("Invalid field with function "+t+" and "+r);t=r}if(s)if(d.isWildcard(s)){var g=d.isShortWildcard(s)?n.enum.timeUnit:s.enum;u=u.concat(g.filter(a)),f=f||h.contains(g,void 0)}else{if(t)throw Error("Invalid field with function "+t+" and "+s);t=s}return t||(f&&!o&&u.unshift(void 0),u.length>0?{enum:l(u)}:void 0)}function l(e){return e.map(function(e){return e||null}).sort(function(e,t){return null==e&&(e=void 0),null==t&&(t=void 0),y[e]-y[t]}).map(function(e){return e||void 0})}var u=this&&this.__assign||Object.assign||function(e){for(var t,n=1,r=arguments.length;n0||h.isWildcard(r.field))return c({},e,{anyEncodings:e.anyEncodings.concat([c({channel:h.SHORT_WILDCARD},r)])});var i=_.autoAddFieldQuery(e,r),o=p.recommend(i,n),a=f.getTopSpecQueryItem(o.result).specQuery;return c({},E.fromSpecQuery(a,e.config),h.isWildcard(e.mark)?{mark:e.mark}:{})}function i(e,t){switch(void 0===e&&(e=E.DEFAULT_SHELF_UNIT_SPEC),t.type){case m.SPEC_CLEAR:return E.DEFAULT_SHELF_UNIT_SPEC;case m.SPEC_MARK_CHANGE_TYPE:var n=t.payload;return c({},e,{mark:n});case m.SPEC_FIELD_ADD:var r=t.payload,i=r.shelfId;return o(e,i,r.fieldDef,r.replace);case m.SPEC_FIELD_REMOVE:return s(e,t.payload).shelf;case m.SPEC_FIELD_MOVE:var f=t.payload,p=f.to,v=f.from,_=s(e,v),S=_.fieldDef,O=_.shelf,w=s(O,p),T=w.fieldDef;return o(o(w.shelf,p,S,!1),v,T,!1);case y.SPEC_FIELD_PROP_CHANGE:var P=t.payload,i=P.shelfId,A=P.prop,x=P.value;return a(e,i,function(e){return l(e,A,x)});case y.SPEC_FIELD_NESTED_PROP_CHANGE:var C=t.payload,i=C.shelfId,k=C.prop,D=C.nestedProp,M=C.value;return a(e,i,function(e){return u(e,k,D,M)});case m.SPEC_FUNCTION_CHANGE:var R=t.payload,i=R.shelfId,I=R.fn;return a(e,i,function(e){return c({},e,{fn:I})});case g.SPEC_FUNCTION_ADD_WILDCARD:var N=t.payload,i=N.shelfId,F=N.fn;return a(e,i,function(e){var t=e.fn,n=d(e,["fn"]);return c({},n,{fn:{enum:b.sortFunctions(t.enum.concat(F))}})});case g.SPEC_FUNCTION_DISABLE_WILDCARD:var i=t.payload.shelfId;return a(e,i,function(e){var t=e.fn,n=d(e,["fn"]);if(h.isWildcard(t))return c({},n,t.enum.length>0?{fn:t.enum[0]}:{});throw Error("fn must be a wildcard to disable wildcard")});case m.SPEC_FUNCTION_ENABLE_WILDCARD:var i=t.payload.shelfId;return a(e,i,function(e){var t=e.fn,n=d(e,["fn"]);return c({},n,{fn:{enum:[t]}})});case g.SPEC_FUNCTION_REMOVE_WILDCARD:var L=t.payload,i=L.shelfId,j=L.fn;return a(e,i,function(e){var t=e.fn,n=d(e,["fn"]);if(h.isWildcard(t))return c({},n,{fn:{enum:t.enum.filter(function(e){return e!==j})}});throw Error("fn must be a wildcard to remove a wildcard")})}return e}function o(e,t,n,r){if(n){if(v.isWildcardChannelId(t)){var i=t.index;return r&&e.anyEncodings[i]?c({},e,{anyEncodings:S.modifyItemInArray(e.anyEncodings,i,function(){return c({channel:h.SHORT_WILDCARD},n)})}):c({},e,{anyEncodings:S.insertItemToArray(e.anyEncodings,i,c({channel:h.SHORT_WILDCARD},n))})}return c({},e,{encoding:c({},e.encoding,(o={},o[t.channel]=n,o))})}return e;var o}function a(e,t,n){return v.isWildcardChannelId(t)?c({},e,{anyEncodings:S.modifyItemInArray(e.anyEncodings,t.index,n)}):c({},e,{encoding:c({},e.encoding,(r={},r[t.channel]=n(e.encoding[t.channel]),r))});var r}function s(e,t){if(v.isWildcardChannelId(t)){var n=t.index,r=S.removeItemFromArray(e.anyEncodings,n),i=r.array,o=r.item;if(o){var a=(o.channel,d(o,["channel"]));return{fieldDef:a,shelf:c({},e,{anyEncodings:i})}}return{fieldDef:void 0,shelf:c({},e,{anyEncodings:i})}}var s=e.encoding,l=t.channel,a=s[l],u=d(s,["symbol"==typeof l?l:l+""]);return{fieldDef:a,shelf:c({},e,{encoding:u})}}function l(e,t,n){var r=t,i=(e[r],d(e,["symbol"==typeof r?r:r+""]));return c({},i,void 0!==n?(o={},o[t]=n,o):{});var o}function u(e,t,n,r){var i=t,o=e[i],a=d(e,["symbol"==typeof i?i:i+""]),s=o||{},l=n,u=d(s,["symbol"==typeof l?l:l+""]),f=c({},u,void 0!==r?(p={},p[n]=r,p):{});return c({},a,Object.keys(f).length>0?(h={},h[t]=f,h):{});var p,h}var c=this&&this.__assign||Object.assign||function(e){for(var t,n=1,r=arguments.length;n■ `"#4682b4"`',type:"string"},continuousBandSize:{description:"The default size of the bars on continuous scales.\n\n__Default value:__ `2`",minimum:0,type:"number"},discreteBandSize:{description:"The size of the bars. If unspecified, the default size is `bandSize-1`,\nwhich provides 1 pixel offset between bars.",minimum:0,type:"number"},dx:{description:"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},dy:{description:"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},fill:{description:"Default Fill Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},fillOpacity:{description:"The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},filled:{description:"Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\n\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.",type:"boolean"},font:{description:'The typeface to set the text in (e.g., `"Helvetica Neue"`).',minimum:0,type:"string"},fontSize:{description:"The font size, in pixels.",minimum:0,type:"number"},fontStyle:{$ref:"#/definitions/FontStyle",description:'The font style (e.g., `"italic"`).'},fontWeight:{anyOf:[{$ref:"#/definitions/FontWeight"},{$ref:"#/definitions/FontWeightNumber"}],description:'The font weight (e.g., `"bold"`).'},interpolate:{$ref:"#/definitions/Interpolate",description:'The line interpolation method to use for line and area marks. One of the following:\n- `"linear"`: piecewise linear segments, as in a polyline.\n- `"linear-closed"`: close the linear segments to form a polygon.\n- `"step"`: alternate between horizontal and vertical segments, as in a step function.\n- `"step-before"`: alternate between vertical and horizontal segments, as in a step function.\n- `"step-after"`: alternate between horizontal and vertical segments, as in a step function.\n- `"basis"`: a B-spline, with control point duplication on the ends.\n- `"basis-open"`: an open B-spline; may not intersect the start or end.\n- `"basis-closed"`: a closed B-spline, as in a loop.\n- `"cardinal"`: a Cardinal spline, with control point duplication on the ends.\n- `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `"cardinal-closed"`: a closed Cardinal spline, as in a loop.\n- `"bundle"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `"monotone"`: cubic interpolation that preserves monotonicity in y.'},limit:{description:"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.",type:"number"},opacity:{description:"The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",maximum:1,minimum:0,type:"number"},orient:{$ref:"#/definitions/Orient",description:"The orientation of a non-stacked bar, tick, area, and line charts.\nThe value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick\nshould be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line, this property determines the sort order of the points in the line\nif `config.sortLineBy` is not specified.\nFor stacked charts, this is always determined by the orientation of the stack;\ntherefore explicitly specified value will be ignored."},radius:{description:"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.",minimum:0,type:"number"},shape:{description:'The default symbol shape to use. One of: `"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, or `"triangle-down"`, or a custom SVG path.\n\n__Default value:__ `"circle"`',type:"string"},size:{description:"The pixel area each the point/circle/square.\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\n\n__Default value:__ `30`",minimum:0,type:"number"},stroke:{description:"Default Stroke Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},strokeDash:{description:"An array of alternating stroke, space lengths for creating dashed or dotted lines.",items:{type:"number"},type:"array"},strokeDashOffset:{description:"The offset (in pixels) into which to begin drawing with the stroke dash array.",type:"number"},strokeOpacity:{description:"The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},strokeWidth:{description:"The stroke width, in pixels.",minimum:0,type:"number"},tension:{description:"Depending on the interpolation type, sets the tension parameter (for line and area marks).",maximum:1,minimum:0,type:"number"},text:{description:"Placeholder text if the `text` channel is not specified",type:"string"},theta:{description:'Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating "north".',type:"number"}},type:"object"},BaseBin:{additionalProperties:!1,properties:{base:{description:"The number base to use for automatic bin determination (default is base 10).\n\n__Default value:__ `10`",type:"number"},divide:{description:"Scale factors indicating allowable subdivisions. The default value is [5, 2], which indicates that for base 10 numbers (the default base), the method may consider dividing bin sizes by 5 and/or 2. For example, for an initial step size of 10, the method can check if bin sizes of 2 (= 10/5), 5 (= 10/2), or 1 (= 10/(5*2)) might also satisfy the given constraints.\n\n__Default value:__ `[5, 2]`",items:{type:"number"},minItems:1,type:"array"},maxbins:{description:"Maximum number of bins.\n\n__Default value:__ `6` for `row`, `column` and `shape` channels; `10` for other channels",minimum:2,type:"number"},minstep:{description:"A minimum allowable step size (particularly useful for integer values).",type:"number"},nice:{description:"If true (the default), attempts to make the bin boundaries use human-friendly boundaries, such as multiples of ten.",type:"boolean"},step:{description:"An exact step size to use between bins.\n\n__Note:__ If provided, options such as maxbins will be ignored.",type:"number"},steps:{description:"An array of allowable step sizes to choose from.",items:{type:"number"},minItems:1,type:"array"}},type:"object"},BaseSelectionDef:{additionalProperties:!1,properties:{encodings:{description:"An array of encoding channels. The corresponding data field values\nmust match for a data tuple to fall within the selection.",items:{$ref:"#/definitions/SingleDefChannel"},type:"array"},fields:{description:"An array of field names whose values must match for a data tuple to\nfall within the selection.",items:{type:"string"},type:"array"},on:{$ref:"#/definitions/VgEventStream",description:"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters)."},resolve:{$ref:"#/definitions/SelectionResolution",description:"With layered and multi-view displays, a strategy that determines how\nselections' data queries are resolved when applied in a filter transform,\nconditional encoding rule, or scale domain."}},type:"object"},BaseSpec:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},name:{description:"Name of the visualization for later reference.",type:"string"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"}},type:"object"},BinParams:{additionalProperties:!1,description:"Binning properties or boolean flag for determining whether to bin data or not.",properties:{base:{description:"The number base to use for automatic bin determination (default is base 10).\n\n__Default value:__ `10`",type:"number"},divide:{description:"Scale factors indicating allowable subdivisions. The default value is [5, 2], which indicates that for base 10 numbers (the default base), the method may consider dividing bin sizes by 5 and/or 2. For example, for an initial step size of 10, the method can check if bin sizes of 2 (= 10/5), 5 (= 10/2), or 1 (= 10/(5*2)) might also satisfy the given constraints.\n\n__Default value:__ `[5, 2]`",items:{type:"number"},minItems:1,type:"array"},extent:{description:"A two-element (`[min, max]`) array indicating the range of desired bin values.",items:{type:"number"},maxItems:2,minItems:2,type:"array"},maxbins:{description:"Maximum number of bins.\n\n__Default value:__ `6` for `row`, `column` and `shape` channels; `10` for other channels",minimum:2,type:"number"},minstep:{description:"A minimum allowable step size (particularly useful for integer values).",type:"number"},nice:{description:"If true (the default), attempts to make the bin boundaries use human-friendly boundaries, such as multiples of ten.",type:"boolean"},step:{description:"An exact step size to use between bins.\n\n__Note:__ If provided, options such as maxbins will be ignored.",type:"number"},steps:{description:"An array of allowable step sizes to choose from.",items:{type:"number"},minItems:1,type:"array"}},type:"object"},BinTransform:{additionalProperties:!1,properties:{as:{description:"The output fields at which to write the start and end bin values.",type:"string"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"An object indicating bin properties, or simply `true` for using default bin parameters."},field:{description:"The data field to bin.",type:"string"}},required:["bin","field","as"],type:"object"},BoxPlotConfig:{additionalProperties:!1,properties:{align:{$ref:"#/definitions/HorizontalAlign",description:'The horizontal alignment of the text. One of `"left"`, `"right"`, `"center"`.'},angle:{description:"The rotation angle of the text, in degrees.",maximum:360,minimum:0,type:"number"},baseline:{$ref:"#/definitions/VerticalAlign",description:'The vertical alignment of the text. One of `"top"`, `"middle"`, `"bottom"`.\n\n__Default value:__ `"middle"`'},color:{description:'Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\n\n__Default value:__ `"#4682b4"`',type:"string"},dx:{description:"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},dy:{description:"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},fill:{description:"Default Fill Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},fillOpacity:{description:"The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},filled:{description:"Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\n\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.",type:"boolean"},font:{description:'The typeface to set the text in (e.g., `"Helvetica Neue"`).',minimum:0,type:"string"},fontSize:{description:"The font size, in pixels.",minimum:0,type:"number"},fontStyle:{$ref:"#/definitions/FontStyle",description:'The font style (e.g., `"italic"`).'},fontWeight:{anyOf:[{$ref:"#/definitions/FontWeight"},{$ref:"#/definitions/FontWeightNumber"}],description:'The font weight (e.g., `"bold"`).'},interpolate:{$ref:"#/definitions/Interpolate",description:'The line interpolation method to use for line and area marks. One of the following:\n- `"linear"`: piecewise linear segments, as in a polyline.\n- `"linear-closed"`: close the linear segments to form a polygon.\n- `"step"`: alternate between horizontal and vertical segments, as in a step function.\n- `"step-before"`: alternate between vertical and horizontal segments, as in a step function.\n- `"step-after"`: alternate between horizontal and vertical segments, as in a step function.\n- `"basis"`: a B-spline, with control point duplication on the ends.\n- `"basis-open"`: an open B-spline; may not intersect the start or end.\n- `"basis-closed"`: a closed B-spline, as in a loop.\n- `"cardinal"`: a Cardinal spline, with control point duplication on the ends.\n- `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `"cardinal-closed"`: a closed Cardinal spline, as in a loop.\n- `"bundle"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `"monotone"`: cubic interpolation that preserves monotonicity in y.'},limit:{description:"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.",type:"number"},opacity:{description:"The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",maximum:1,minimum:0,type:"number"},orient:{$ref:"#/definitions/Orient",description:"The orientation of a non-stacked bar, tick, area, and line charts.\nThe value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick\nshould be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line, this property determines the sort order of the points in the line\nif `config.sortLineBy` is not specified.\nFor stacked charts, this is always determined by the orientation of the stack;\ntherefore explicitly specified value will be ignored."},radius:{description:"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.",minimum:0,type:"number"},shape:{description:'The default symbol shape to use. One of: `"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, or `"triangle-down"`, or a custom SVG path.\n\n__Default value:__ `"circle"`',type:"string"},size:{description:"Size of the box and mid tick of a box plot ",type:"number"},stroke:{description:"Default Stroke Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},strokeDash:{description:"An array of alternating stroke, space lengths for creating dashed or dotted lines.",items:{type:"number"},type:"array"},strokeDashOffset:{description:"The offset (in pixels) into which to begin drawing with the stroke dash array.",type:"number"},strokeOpacity:{description:"The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},strokeWidth:{description:"The stroke width, in pixels.",minimum:0,type:"number"},tension:{description:"Depending on the interpolation type, sets the tension parameter (for line and area marks).",maximum:1,minimum:0,type:"number"},text:{description:"Placeholder text if the `text` channel is not specified",type:"string"},theta:{description:'Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating "north".',type:"number"}},type:"object"},BoxPlotConfigMixins:{additionalProperties:!1,properties:{box:{$ref:"#/definitions/BoxPlotConfig",description:"Box Config "},boxMid:{$ref:"#/definitions/MarkConfig"},boxWhisker:{$ref:"#/definitions/MarkConfig"}},type:"object"},BrushConfig:{additionalProperties:!1,properties:{fill:{description:"The fill color of the interval mark.\n\n__Default value:__ `#333333`",type:"string"},fillOpacity:{description:"The fill opacity of the interval mark (a value between 0 and 1).\n\n__Default value:__ `0.125`",type:"number"},stroke:{description:"The stroke color of the interval mark.\n\n__Default value:__ `#ffffff`",type:"string"},strokeDash:{description:"An array of alternating stroke and space lengths,\nfor creating dashed or dotted lines.",items:{type:"number"},type:"array"},strokeDashOffset:{description:"The offset (in pixels) with which to begin drawing the stroke dash array.",type:"number"},strokeOpacity:{description:"The stroke opacity of the interval mark (a value between 0 and 1).",type:"number"},strokeWidth:{description:"The stroke width of the interval mark.",type:"number"}},type:"object"},CalculateTransform:{additionalProperties:!1,properties:{as:{description:"The field for storing the computed formula value.",type:"string"},calculate:{description:"A string containing a Vega Expression. Use the variable `datum` to refer to the current data object.",type:"string"}},required:["calculate","as"],type:"object"},CompositeMarkConfigMixins:{$ref:"#/definitions/BoxPlotConfigMixins"},CompositeUnitSpec:{$ref:"#/definitions/CompositeUnitSpecAlias",description:"Unit spec that can have a composite mark."},ConditionLegendFieldDef:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},legend:{anyOf:[{$ref:"#/definitions/Legend"},{type:"null"}],description:"An object defining properties of the legend.\nIf `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](legend.html) are applied."},scale:{$ref:"#/definitions/Scale",description:"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\n__Default value:__ If undefined, default [scale properties](scale.html) are applied."},selection:{$ref:"#/definitions/SelectionOperand",description:"A [selection name](selection.html), or a series of [composed selections](selection.html#compose)."},sort:{anyOf:[{anyOf:[{$ref:"#/definitions/SortOrder"},{$ref:"#/definitions/SortField"}]},{type:"null"}],description:'Sort order for the encoded field.\nSupported `sort` values include `"ascending"`, `"descending"` and `null` (no sorting).\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\n\n__Default value:__ `"ascending"`'},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["selection","type"],type:"object"},ConditionTextFieldDef:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},format:{description:"The [formatting pattern](format.html) for a text field. If not defined, this will be determined automatically.",type:"string"},selection:{$ref:"#/definitions/SelectionOperand",description:"A [selection name](selection.html), or a series of [composed selections](selection.html#compose)."},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["selection","type"],type:"object"},ConditionValueDef:{additionalProperties:!1,properties:{selection:{$ref:"#/definitions/SelectionOperand",description:"A [selection name](selection.html), or a series of [composed selections](selection.html#compose)."},value:{description:"A constant value in visual domain.",type:["number","string","boolean"]}},required:["selection","value"],type:"object"},ConditionalLegendFieldDef:{additionalProperties:!1,description:"A FieldDef with ConditionValueDef\n{\n condition: {value: ...},\n field: ...,\n ...\n}",properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},condition:{$ref:"#/definitions/ConditionValueDef",description:"A value definition with a selection predicate.\n\n__Note:__ A field definition's `condition` property can only be a [value definition](encoding.html#value)\nsince Vega-Lite only allows at mosty one encoded field per encoding channel."},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},legend:{anyOf:[{$ref:"#/definitions/Legend"},{type:"null"}],description:"An object defining properties of the legend.\nIf `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](legend.html) are applied."},scale:{$ref:"#/definitions/Scale",description:"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\n__Default value:__ If undefined, default [scale properties](scale.html) are applied."},sort:{anyOf:[{anyOf:[{$ref:"#/definitions/SortOrder"},{$ref:"#/definitions/SortField"}]},{type:"null"}],description:'Sort order for the encoded field.\nSupported `sort` values include `"ascending"`, `"descending"` and `null` (no sorting).\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\n\n__Default value:__ `"ascending"`'},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},ConditionalTextFieldDef:{additionalProperties:!1,description:"A FieldDef with ConditionValueDef\n{\n condition: {value: ...},\n field: ...,\n ...\n}",properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},condition:{$ref:"#/definitions/ConditionValueDef",description:"A value definition with a selection predicate.\n\n__Note:__ A field definition's `condition` property can only be a [value definition](encoding.html#value)\nsince Vega-Lite only allows at mosty one encoded field per encoding channel."},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},format:{description:"The [formatting pattern](format.html) for a text field. If not defined, this will be determined automatically.",type:"string"},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},ConditionalLegendValueDef:{additionalProperties:!1,description:"A ValueDef with ConditionValueDef | FieldDef\n{\n condition: {field: ...} | {value: ...},\n value: ...,\n}",properties:{condition:{anyOf:[{$ref:"#/definitions/ConditionLegendFieldDef"},{$ref:"#/definitions/ConditionValueDef"}],description:"A field definition or a value definition with a selection predicate."},value:{description:"A constant value in visual domain.",type:["number","string","boolean"]}},type:"object"},ConditionalTextValueDef:{additionalProperties:!1,description:"A ValueDef with ConditionValueDef | FieldDef\n{\n condition: {field: ...} | {value: ...},\n value: ...,\n}",properties:{condition:{anyOf:[{$ref:"#/definitions/ConditionTextFieldDef"},{$ref:"#/definitions/ConditionValueDef"}],description:"A field definition or a value definition with a selection predicate."},value:{description:"A constant value in visual domain.",type:["number","string","boolean"]}},type:"object"},Config:{additionalProperties:!1,properties:{area:{$ref:"#/definitions/MarkConfig",description:"Area-Specific Config "},autoResize:{description:"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\n\n__Default value__: `false`",type:"boolean"},axis:{$ref:"#/definitions/AxisConfig",description:"Axis configuration, which determines default properties for all `x` and `y` [axes](axis.html). For a full list of axis configuration options, please see the [corresponding section of the axis documentation](axis.html#axis-config)."},axisBand:{$ref:"#/definitions/VgAxisConfig",description:'Specific axis config for axes with "band" scales.'},axisBottom:{$ref:"#/definitions/VgAxisConfig",description:"Specific axis config for x-axis along the bottom edge of the chart."},axisLeft:{$ref:"#/definitions/VgAxisConfig",description:"Specific axis config for y-axis along the left edge of the chart."},axisRight:{$ref:"#/definitions/VgAxisConfig",description:"Specific axis config for y-axis along the right edge of the chart."},axisTop:{$ref:"#/definitions/VgAxisConfig",description:"Specific axis config for x-axis along the top edge of the chart."},axisX:{$ref:"#/definitions/VgAxisConfig",description:"X-axis specific config."},axisY:{$ref:"#/definitions/VgAxisConfig",description:"Y-axis specific config."},background:{description:"CSS color property to use as the background of visualization.\n\n__Default value:__ none (transparent)",type:"string"},bar:{$ref:"#/definitions/BarConfig",description:"Bar-Specific Config "},circle:{$ref:"#/definitions/MarkConfig",description:"Circle-Specific Config "},countTitle:{description:"Default axis and legend title for count fields.\n\n__Default value:__ `'Number of Records'`.",type:"string"},invalidValues:{description:'Defines how Vega-Lite should handle invalid values (`null` and `NaN`).\n- If set to `"filter"` (default), all data items with null values are filtered.\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.',enum:["filter"],type:"string"},legend:{$ref:"#/definitions/LegendConfig",description:"Legend configuration, which determines default properties for all [legends](legend.html). For a full list of legend configuration options, please see the [corresponding section of in the legend documentation](legend.html#config)."},line:{$ref:"#/definitions/MarkConfig",description:"Line-Specific Config "},mark:{$ref:"#/definitions/MarkConfig",description:"Mark Config "},numberFormat:{description:'D3 Number format for axis labels and text tables. For example "s" for SI units. Use [D3\'s number format pattern](https://github.com/d3/d3-format#locale_format).',type:"string"},padding:{$ref:"#/definitions/Padding",description:'The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\nIf an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`'},point:{$ref:"#/definitions/MarkConfig",description:"Point-Specific Config "},range:{$ref:"#/definitions/RangeConfig",description:"An object hash that defines default range arrays or schemes for using with scales.\nFor a full list of scale range configuration options, please see the [corresponding section of the scale documentation](scale.html#config)."},rect:{$ref:"#/definitions/MarkConfig",description:"Rect-Specific Config "},rule:{$ref:"#/definitions/MarkConfig",description:"Rule-Specific Config "},scale:{$ref:"#/definitions/ScaleConfig",description:"Scale configuration determines default properties for all [scales](scale.html). For a full list of scale configuration options, please see the [corresponding section of the scale documentation](scale.html#config)."},selection:{$ref:"#/definitions/SelectionConfig",description:"An object hash for defining default properties for each type of selections. "},square:{$ref:"#/definitions/MarkConfig",description:"Square-Specific Config "},stack:{$ref:"#/definitions/StackOffset",description:"Default stack offset for stackable mark. "},style:{$ref:"#/definitions/StyleConfigIndex",description:"An object hash that defines key-value mappings to determine default properties for marks with a given [style](mark.html#mark-def). The keys represent styles names; the value are valid [mark configuration objects](mark.html#config). "},text:{$ref:"#/definitions/TextConfig",description:"Text-Specific Config "},tick:{$ref:"#/definitions/TickConfig",description:"Tick-Specific Config "},timeFormat:{description:"Default datetime format for axis and legend labels. The format can be set directly on each axis and legend. Use [D3's time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\n__Default value:__ `'%b %d, %Y'`.",type:"string"},title:{$ref:"#/definitions/VgTitleConfig",description:"Title configuration, which determines default properties for all [titles](title.html). For a full list of title configuration options, please see the [corresponding section of the title documentation](title.html#config)."},view:{$ref:"#/definitions/ViewConfig",description:"Default properties for [single view plots](spec.html#single). "}},type:"object"},Data:{anyOf:[{$ref:"#/definitions/UrlData"},{$ref:"#/definitions/InlineData"},{$ref:"#/definitions/NamedData"}]},DataFormat:{additionalProperties:!1,properties:{feature:{description:'The name of the TopoJSON object set to convert to a GeoJSON feature collection.\nFor example, in a map of the world, there may be an object set named `"countries"`.\nUsing the feature property, we can extract this set and generate a GeoJSON feature object for each country.',type:"string"},mesh:{description:"The name of the TopoJSON object set to convert to mesh.\nSimilar to the `feature` option, `mesh` extracts a named TopoJSON object set.\n Unlike the `feature` option, the corresponding geo data is returned as a single, unified mesh instance, not as individual GeoJSON features.\nExtracting a mesh is useful for more efficiently drawing borders or other geographic elements that you do not need to associate with specific regions such as individual countries, states or counties.",type:"string"},parse:{anyOf:[{enum:["auto"],type:"string"},{type:"object"}],description:'If set to auto (the default), perform automatic type inference to determine the desired data types.\nAlternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `"number"`, `"boolean"` or `"date"`).\nFor example, `"parse": {"modified_on": "date"}` parses the `modified_on` field in each input record a Date value.\n\nFor `"date"`, we parse data based using Javascript\'s [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse).\nFor Specific date formats can be provided (e.g., `{foo: \'date:"%m%d%Y"\'}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \'utc:"%m%d%Y"\'}`). See more about [UTC time](timeunit.html#utc)'},property:{description:'The JSON property containing the desired data.\nThis parameter can be used when the loaded JSON file may have surrounding structure or meta-data.\nFor example `"property": "values.features"` is equivalent to retrieving `json.values.features`\nfrom the loaded JSON object.',type:"string"}},type:"object"},DataFormatType:{enum:["json","csv","tsv","topojson"],type:"string"},DataUrlFormat:{additionalProperties:!1,properties:{feature:{description:'The name of the TopoJSON object set to convert to a GeoJSON feature collection.\nFor example, in a map of the world, there may be an object set named `"countries"`.\nUsing the feature property, we can extract this set and generate a GeoJSON feature object for each country.',type:"string"},mesh:{description:"The name of the TopoJSON object set to convert to mesh.\nSimilar to the `feature` option, `mesh` extracts a named TopoJSON object set.\n Unlike the `feature` option, the corresponding geo data is returned as a single, unified mesh instance, not as individual GeoJSON features.\nExtracting a mesh is useful for more efficiently drawing borders or other geographic elements that you do not need to associate with specific regions such as individual countries, states or counties.",type:"string"},parse:{anyOf:[{enum:["auto"],type:"string"},{type:"object"}],description:'If set to auto (the default), perform automatic type inference to determine the desired data types.\nAlternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `"number"`, `"boolean"` or `"date"`).\nFor example, `"parse": {"modified_on": "date"}` parses the `modified_on` field in each input record a Date value.\n\nFor `"date"`, we parse data based using Javascript\'s [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse).\nFor Specific date formats can be provided (e.g., `{foo: \'date:"%m%d%Y"\'}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \'utc:"%m%d%Y"\'}`). See more about [UTC time](timeunit.html#utc)'},property:{description:'The JSON property containing the desired data.\nThis parameter can be used when the loaded JSON file may have surrounding structure or meta-data.\nFor example `"property": "values.features"` is equivalent to retrieving `json.values.features`\nfrom the loaded JSON object.',type:"string"},type:{$ref:"#/definitions/DataFormatType",description:'Type of input data: `"json"`, `"csv"`, `"tsv"`.\nThe default format type is determined by the extension of the file URL.\nIf no extension is detected, `"json"` will be used by default.'}},type:"object"},DateTime:{additionalProperties:!1,description:"Object for defining datetime in Vega-Lite Filter.\nIf both month and quarter are provided, month has higher precedence.\n`day` cannot be combined with other date.\nWe accept string for month and day names.",properties:{date:{description:"Integer value representing the date from 1-31.",maximum:31,minimum:1,type:"number"},day:{anyOf:[{$ref:"#/definitions/Day"},{type:"string"}],description:'Value representing the day of a week. This can be one of: (1) integer value -- `1` represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3) case-insensitive, 3-character short day name (e.g., `"Mon"`).
**Warning:** A DateTime definition object with `day`** should not be combined with `year`, `quarter`, `month`, or `date`.'},hours:{description:"Integer value representing the hour of a day from 0-23.",maximum:23,minimum:0,type:"number"},milliseconds:{description:"Integer value representing the millisecond segment of time.",maximum:999,minimum:0,type:"number"},minutes:{description:"Integer value representing the minute segment of time from 0-59.",maximum:59,minimum:0,type:"number"},month:{anyOf:[{$ref:"#/definitions/Month"},{type:"string"}],description:'One of: (1) integer value representing the month from `1`-`12`. `1` represents January; (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character short month name (e.g., `"Jan"`). '},quarter:{description:"Integer value representing the quarter of the year (from 1-4).",maximum:4,minimum:1,type:"number"},seconds:{description:"Integer value representing the second segment (0-59) of a time value",maximum:59,minimum:0,type:"number"},utc:{description:"A boolean flag indicating if date time is in utc time. If false, the date time is in local time",type:"boolean"},year:{description:"Integer value representing the year.",type:"number"}},type:"object"},Day:{maximum:7,minimum:1,type:"number"},Encoding:{additionalProperties:!1,properties:{color:{anyOf:[{$ref:"#/definitions/ConditionalLegendFieldDef"},{$ref:"#/definitions/ConditionalLegendValueDef"}],description:'Color of the marks – either fill or stroke color based on mark type.\nBy default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`,\n`"text"`, `"circle"`, and `"square"` / stroke color for `"line"` and `"point"`.\n\n__Default value:__ If undefined, the default color depends on [mark config](config.html#mark)\'s `color` property.\n\n_Note:_ See the scale documentation for more information about customizing [color scheme](scale.html#scheme).'},detail:{anyOf:[{$ref:"#/definitions/FieldDef"},{items:{$ref:"#/definitions/FieldDef"},type:"array"}],description:"Additional levels of detail for grouping data in aggregate views and\nin line and area marks without mapping data to a specific visual channel."},opacity:{anyOf:[{$ref:"#/definitions/ConditionalLegendFieldDef"},{$ref:"#/definitions/ConditionalLegendValueDef"}],description:"Opacity of the marks – either can be a value or a range.\n\n__Default value:__ If undefined, the default opacity depends on [mark config](config.html#mark)'s `opacity` property."},order:{anyOf:[{$ref:"#/definitions/OrderFieldDef"},{items:{$ref:"#/definitions/OrderFieldDef"},type:"array"}],description:"Stack order for stacked marks or order of data points in line marks for connected scatter plots.\n\n__Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating additional aggregation grouping."},shape:{anyOf:[{$ref:"#/definitions/ConditionalLegendFieldDef"},{$ref:"#/definitions/ConditionalLegendValueDef"}],description:'The symbol\'s shape (only for `point` marks). The supported values are\n`"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`,\nor `"triangle-down"`, or else a custom SVG path string.\n__Default value:__ If undefined, the default shape depends on [mark config](config.html#point-config)\'s `shape` property.'},size:{anyOf:[{$ref:"#/definitions/ConditionalLegendFieldDef"},{$ref:"#/definitions/ConditionalLegendValueDef"}],description:'Size of the mark.\n- For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel area of the mark.\n- For `"bar"` and `"tick"` – the bar and tick\'s size.\n- For `"text"` – the text\'s font size.\n- Size is currently unsupported for `"line"`, `"area"`, and `"rect"`.'},text:{anyOf:[{$ref:"#/definitions/ConditionalTextFieldDef"},{$ref:"#/definitions/ConditionalTextValueDef"}],description:"Text of the `text` mark."},tooltip:{anyOf:[{$ref:"#/definitions/ConditionalTextFieldDef"},{$ref:"#/definitions/ConditionalTextValueDef"}],description:"The tooltip text to show upon mouse hover."},x:{anyOf:[{$ref:"#/definitions/PositionFieldDef"},{$ref:"#/definitions/ValueDef"}],description:'X coordinates of the marks, or width of horizontal `"bar"` and `"area"`.'},x2:{anyOf:[{$ref:"#/definitions/FieldDef"},{$ref:"#/definitions/ValueDef"}],description:'X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and `"rule"`.'},y:{anyOf:[{$ref:"#/definitions/PositionFieldDef"},{$ref:"#/definitions/ValueDef"}],description:'Y coordinates of the marks, or height of vertical `"bar"` and `"area"`.'},y2:{anyOf:[{$ref:"#/definitions/FieldDef"},{$ref:"#/definitions/ValueDef"}],description:'Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and `"rule"`.'}},type:"object"},EncodingWithFacet:{additionalProperties:!1,properties:{color:{anyOf:[{$ref:"#/definitions/ConditionalLegendFieldDef"},{$ref:"#/definitions/ConditionalLegendValueDef"}],description:'Color of the marks – either fill or stroke color based on mark type.\nBy default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`,\n`"text"`, `"circle"`, and `"square"` / stroke color for `"line"` and `"point"`.\n\n__Default value:__ If undefined, the default color depends on [mark config](config.html#mark)\'s `color` property.\n\n_Note:_ See the scale documentation for more information about customizing [color scheme](scale.html#scheme).'},column:{$ref:"#/definitions/FacetFieldDef",description:"Horizontal facets for trellis plots."},detail:{anyOf:[{$ref:"#/definitions/FieldDef"},{items:{$ref:"#/definitions/FieldDef"},type:"array"}],description:"Additional levels of detail for grouping data in aggregate views and\nin line and area marks without mapping data to a specific visual channel."},opacity:{anyOf:[{$ref:"#/definitions/ConditionalLegendFieldDef"},{$ref:"#/definitions/ConditionalLegendValueDef"}],description:"Opacity of the marks – either can be a value or a range.\n\n__Default value:__ If undefined, the default opacity depends on [mark config](config.html#mark)'s `opacity` property."},order:{anyOf:[{$ref:"#/definitions/OrderFieldDef"},{items:{$ref:"#/definitions/OrderFieldDef"},type:"array"}],description:"Stack order for stacked marks or order of data points in line marks for connected scatter plots.\n\n__Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating additional aggregation grouping."},row:{$ref:"#/definitions/FacetFieldDef",description:"Vertical facets for trellis plots."},shape:{anyOf:[{$ref:"#/definitions/ConditionalLegendFieldDef"},{$ref:"#/definitions/ConditionalLegendValueDef"}],description:'The symbol\'s shape (only for `point` marks). The supported values are\n`"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`,\nor `"triangle-down"`, or else a custom SVG path string.\n__Default value:__ If undefined, the default shape depends on [mark config](config.html#point-config)\'s `shape` property.'},size:{anyOf:[{$ref:"#/definitions/ConditionalLegendFieldDef"},{$ref:"#/definitions/ConditionalLegendValueDef"}],description:'Size of the mark.\n- For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel area of the mark.\n- For `"bar"` and `"tick"` – the bar and tick\'s size.\n- For `"text"` – the text\'s font size.\n- Size is currently unsupported for `"line"`, `"area"`, and `"rect"`.'},text:{anyOf:[{$ref:"#/definitions/ConditionalTextFieldDef"},{$ref:"#/definitions/ConditionalTextValueDef"}],description:"Text of the `text` mark."},tooltip:{anyOf:[{$ref:"#/definitions/ConditionalTextFieldDef"},{$ref:"#/definitions/ConditionalTextValueDef"}],description:"The tooltip text to show upon mouse hover."},x:{anyOf:[{$ref:"#/definitions/PositionFieldDef"},{$ref:"#/definitions/ValueDef"}],description:'X coordinates of the marks, or width of horizontal `"bar"` and `"area"`.'},x2:{anyOf:[{$ref:"#/definitions/FieldDef"},{$ref:"#/definitions/ValueDef"}],description:'X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and `"rule"`.'},y:{anyOf:[{$ref:"#/definitions/PositionFieldDef"},{$ref:"#/definitions/ValueDef"}],description:'Y coordinates of the marks, or height of vertical `"bar"` and `"area"`.'},y2:{anyOf:[{$ref:"#/definitions/FieldDef"},{$ref:"#/definitions/ValueDef"}],description:'Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and `"rule"`.'}},type:"object"},EqualFilter:{additionalProperties:!1,properties:{equal:{anyOf:[{type:"string"},{type:"number"},{type:"boolean"},{$ref:"#/definitions/DateTime"}],description:"The value that the field should be equal to."},field:{description:"Field to be filtered.",type:"string"},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for the field to be filtered."}},required:["field","equal"],type:"object"},Facet:{additionalProperties:!1,properties:{column:{$ref:"#/definitions/FacetFieldDef",description:"Horizontal facets for trellis plots."},row:{$ref:"#/definitions/FacetFieldDef",description:"Vertical facets for trellis plots."}},type:"object"},FacetFieldDef:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},header:{$ref:"#/definitions/Header"},sort:{$ref:"#/definitions/SortOrder",description:'Sort order for a facet field.\nThis can be `"ascending"`, `"descending"`.'},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},FacetedUnitSpec:{$ref:"#/definitions/FacetedCompositeUnitSpecAlias",description:"Unit spec that can have a composite mark and row or column channels."},Field:{anyOf:[{type:"string"},{$ref:"#/definitions/RepeatRef"}]},FieldDef:{additionalProperties:!1,description:"Definition object for a data field, its type and transformation of an encoding channel.",properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},FieldDefBase:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"}},type:"object"},Filter:{anyOf:[{$ref:"#/definitions/EqualFilter"},{$ref:"#/definitions/RangeFilter"},{$ref:"#/definitions/OneOfFilter"},{$ref:"#/definitions/SelectionFilter"},{type:"string"}]},FilterTransform:{additionalProperties:!1,properties:{filter:{$ref:"#/definitions/FilterOperand",description:"The `filter` property must be either (1) a filter object for [equal-filters](filter.html#equalfilter),\n[range-filters](filter.html#rangefilter), [one-of filters](filter.html#oneoffilter), or [selection filters](filter.html#selectionfilter);\n(2) a [Vega Expression](filter.html#expression) string,\nwhere `datum` can be used to refer to the current data object; or (3) an array of filters (either objects or expression strings) that must all be true for a datum to pass the filter and be included."}},required:["filter"],type:"object"},FontStyle:{enum:["normal","italic"],type:"string"},FontWeight:{enum:["normal","bold"],type:"string"},FontWeightNumber:{maximum:900,minimum:100,type:"number"},FacetedSpec:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},facet:{$ref:"#/definitions/Facet"},name:{description:"Name of the visualization for later reference.",type:"string"},resolve:{$ref:"#/definitions/Resolve"},spec:{anyOf:[{$ref:"#/definitions/LayerSpec"},{$ref:"#/definitions/CompositeUnitSpec"}]},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"}},required:["facet","spec"],type:"object"},HConcatSpec:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},hconcat:{items:{$ref:"#/definitions/Spec"},type:"array"},name:{description:"Name of the visualization for later reference.",type:"string"},resolve:{$ref:"#/definitions/Resolve"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"}},required:["hconcat"],type:"object"},LayerSpec:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},height:{description:"The height of a visualization.\n\n__Default value:__\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\n\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"},layer:{description:"Layer or single view specifications to be layered.\n\n__Note__: Specifications inside `layer` cannot use `row` and `column` channels as layering facet specifications is not allowed.",items:{anyOf:[{$ref:"#/definitions/LayerSpec"},{$ref:"#/definitions/CompositeUnitSpec"}]},type:"array"},name:{description:"Name of the visualization for later reference.",type:"string"},resolve:{$ref:"#/definitions/Resolve"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"},width:{description:"The width of a visualization.\n\n__Default value:__ This will be determined by the following rules:\n\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\n\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"}},required:["layer"],type:"object"},RepeatSpec:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},name:{description:"Name of the visualization for later reference.",type:"string"},repeat:{$ref:"#/definitions/Repeat"},resolve:{$ref:"#/definitions/Resolve"},spec:{$ref:"#/definitions/Spec"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"}},required:["repeat","spec"],type:"object"},Spec:{anyOf:[{$ref:"#/definitions/CompositeUnitSpec"},{$ref:"#/definitions/LayerSpec"},{$ref:"#/definitions/FacetedSpec"},{$ref:"#/definitions/RepeatSpec"},{$ref:"#/definitions/VConcatSpec"},{$ref:"#/definitions/HConcatSpec"}]},CompositeUnitSpecAlias:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},encoding:{$ref:"#/definitions/Encoding",description:"A key-value mapping between encoding channels and definition of fields."},height:{description:"The height of a visualization.\n\n__Default value:__\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\n\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"},mark:{$ref:"#/definitions/AnyMark",description:'A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`, `"line"`,\n`"area"`, `"point"`, `"rule"`, and `"text"`) or a [mark definition object](mark.html#mark-def).'},name:{description:"Name of the visualization for later reference.",type:"string"},selection:{additionalProperties:{$ref:"#/definitions/SelectionDef"},description:"A key-value mapping between selection names and definitions.",type:"object"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"},width:{description:"The width of a visualization.\n\n__Default value:__ This will be determined by the following rules:\n\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\n\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"}},required:["mark","encoding"],type:"object"},FacetedCompositeUnitSpecAlias:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},encoding:{$ref:"#/definitions/EncodingWithFacet",description:"A key-value mapping between encoding channels and definition of fields."},height:{description:"The height of a visualization.\n\n__Default value:__\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\n\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"},mark:{$ref:"#/definitions/AnyMark",description:'A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`, `"line"`,\n`"area"`, `"point"`, `"rule"`, and `"text"`) or a [mark definition object](mark.html#mark-def).'},name:{description:"Name of the visualization for later reference.",type:"string"},selection:{additionalProperties:{$ref:"#/definitions/SelectionDef"},description:"A key-value mapping between selection names and definitions.",type:"object"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"},width:{description:"The width of a visualization.\n\n__Default value:__ This will be determined by the following rules:\n\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\n\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"}},required:["mark","encoding"],type:"object"},VConcatSpec:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},name:{description:"Name of the visualization for later reference.",type:"string"},resolve:{$ref:"#/definitions/Resolve"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"},vconcat:{items:{$ref:"#/definitions/Spec"},type:"array"}},required:["vconcat"],type:"object"},Guide:{additionalProperties:!1,properties:{format:{description:"The formatting pattern for labels. This is D3's [number format pattern](https://github.com/d3/d3-format#locale_format) for quantitative fields and D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format) for time field.\n\nSee the [format documentation](format.html) for more information.\n\n__Default value:__ derived from [numberFormat](config.html#format) config for quantitative fields and from [timeFormat](config.html#format) config for temporal fields.",type:"string"},title:{description:'A title for the field.\n\n__Default value:__ derived from the field\'s name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has a function, the function is displayed as an all capped text with parentheses wrapping the field name (e.g., `"SUM(field_name)"`, `"BIN(field_name)"`, `"YEAR(field_name)"`). Otherwise, the title is simply the field name.',type:"string"}},type:"object"},Header:{additionalProperties:!1,description:"Headers of row / column channels for faceted plots.",properties:{format:{description:"The formatting pattern for labels. This is D3's [number format pattern](https://github.com/d3/d3-format#locale_format) for quantitative fields and D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format) for time field.\n\n__Default value:__ derived from [numberFormat](config.html#format) config for quantitative fields and from [timeFormat](config.html#format) config for temporal fields.",type:"string"},title:{description:'A title for the axis. Shows field name and its function by default.\n\n__Default value:__ derived from the field\'s name and transformation function applied e.g, "field_name", "SUM(field_name)", "BIN(field_name)", "YEAR(field_name)".',type:"string"}},type:"object"},HorizontalAlign:{enum:["left","right","center"],type:"string"},InlineData:{additionalProperties:!1,properties:{format:{$ref:"#/definitions/DataFormat",description:"An object that specifies the format for parsing the data values."},values:{description:"The full data set, included inline. This can be an array of objects or primitive values.\nArrays of primitive values are ingested as objects with a `data` property.",items:{},type:"array"}},required:["values"],type:"object"},Interpolate:{enum:["linear","linear-closed","step","step-before","step-after","basis","basis-open","basis-closed","cardinal","cardinal-open","cardinal-closed","bundle","monotone"],type:"string"},InterpolateParams:{additionalProperties:!1,properties:{gamma:{type:"number"},type:{enum:["rgb","cubehelix","cubehelix-long"],type:"string"}},required:["type"],type:"object"},IntervalSelection:{additionalProperties:!1,properties:{bind:{description:"Establishes a two-way binding between the interval selection and the scales\nused within the same view. This allows a user to interactively pan and\nzoom the view.",enum:["scales"],type:"string"},encodings:{description:"An array of encoding channels. The corresponding data field values\nmust match for a data tuple to fall within the selection.",items:{$ref:"#/definitions/SingleDefChannel"},type:"array"},fields:{description:"An array of field names whose values must match for a data tuple to\nfall within the selection.",items:{type:"string"},type:"array"},mark:{$ref:"#/definitions/BrushConfig",description:"An interval selection also adds a rectangle mark to depict the\nextents of the interval. The `mark` property can be used to customize the\nappearance of the mark."},on:{$ref:"#/definitions/VgEventStream",description:"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters)."},resolve:{$ref:"#/definitions/SelectionResolution",description:"With layered and multi-view displays, a strategy that determines how\nselections' data queries are resolved when applied in a filter transform,\nconditional encoding rule, or scale domain."},translate:{description:"When truthy, allows a user to interactively move an interval selection\nback-and-forth. Can be `true`, `false` (to disable panning), or a\n[Vega event stream definition](https://vega.github.io/vega/docs/event-streams/)\nwhich must include a start and end event to trigger continuous panning.\n\n__Default value:__ `true`, which corresponds to\n`[mousedown, window:mouseup] > window:mousemove!` which corresponds to\nclicks and dragging within an interval selection to reposition it.",type:["string","boolean"]},type:{enum:["interval"],type:"string"},zoom:{description:"When truthy, allows a user to interactively resize an interval selection.\nCan be `true`, `false` (to disable zooming), or a [Vega event stream\ndefinition](https://vega.github.io/vega/docs/event-streams/). Currently,\nonly `wheel` events are supported.\n\n\n__Default value:__ `true`, which corresponds to `wheel!`.",type:["string","boolean"]}},required:["type"],type:"object"},IntervalSelectionConfig:{additionalProperties:!1,properties:{bind:{description:"Establishes a two-way binding between the interval selection and the scales\nused within the same view. This allows a user to interactively pan and\nzoom the view.",enum:["scales"],type:"string"},encodings:{description:"An array of encoding channels. The corresponding data field values\nmust match for a data tuple to fall within the selection.",items:{$ref:"#/definitions/SingleDefChannel"},type:"array"},fields:{description:"An array of field names whose values must match for a data tuple to\nfall within the selection.",items:{type:"string"},type:"array"},mark:{$ref:"#/definitions/BrushConfig",description:"An interval selection also adds a rectangle mark to depict the\nextents of the interval. The `mark` property can be used to customize the\nappearance of the mark."},on:{$ref:"#/definitions/VgEventStream",description:"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters)."},resolve:{$ref:"#/definitions/SelectionResolution",description:"With layered and multi-view displays, a strategy that determines how\nselections' data queries are resolved when applied in a filter transform,\nconditional encoding rule, or scale domain."},translate:{description:"When truthy, allows a user to interactively move an interval selection\nback-and-forth. Can be `true`, `false` (to disable panning), or a\n[Vega event stream definition](https://vega.github.io/vega/docs/event-streams/)\nwhich must include a start and end event to trigger continuous panning.\n\n__Default value:__ `true`, which corresponds to\n`[mousedown, window:mouseup] > window:mousemove!` which corresponds to\nclicks and dragging within an interval selection to reposition it.",type:["string","boolean"]},zoom:{description:"When truthy, allows a user to interactively resize an interval selection.\nCan be `true`, `false` (to disable zooming), or a [Vega event stream\ndefinition](https://vega.github.io/vega/docs/event-streams/). Currently,\nonly `wheel` events are supported.\n\n\n__Default value:__ `true`, which corresponds to `wheel!`.",type:["string","boolean"]}},type:"object"},LayoutSizeMixins:{additionalProperties:!1,properties:{height:{description:"The height of a visualization.\n\n__Default value:__\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\n\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"},width:{description:"The width of a visualization.\n\n__Default value:__ This will be determined by the following rules:\n\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\n\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"}},type:"object"},Legend:{additionalProperties:!1,description:"Properties of a legend or boolean flag for determining whether to show it.",properties:{entryPadding:{description:"Padding (in pixels) between legend entries in a symbol legend.",type:"number"},fillColor:{description:"Background fill color for the full legend.",type:"string"},format:{description:"The formatting pattern for labels. This is D3's [number format pattern](https://github.com/d3/d3-format#locale_format) for quantitative fields and D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format) for time field.\n\nSee the [format documentation](format.html) for more information.\n\n__Default value:__ derived from [numberFormat](config.html#format) config for quantitative fields and from [timeFormat](config.html#format) config for temporal fields.",type:"string"},offset:{description:"The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle.\n\n__Default value:__ `0`",type:"number"},orient:{$ref:"#/definitions/LegendOrient",description:'The orientation of the legend, which determines how the legend is positioned within the scene. One of "left", "right", "top-left", "top-right", "bottom-left", "bottom-right", "none".\n\n__Default value:__ `"right"`'},padding:{description:"The padding, in pixels, between the legend and axis.",type:"number"},tickCount:{description:"The desired number of tick values for quantitative legends.",type:"number"},title:{description:'A title for the field.\n\n__Default value:__ derived from the field\'s name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has a function, the function is displayed as an all capped text with parentheses wrapping the field name (e.g., `"SUM(field_name)"`, `"BIN(field_name)"`, `"YEAR(field_name)"`). Otherwise, the title is simply the field name.',type:"string"},titleAlign:{description:"Horizontal text alignment for legend titles.",type:"string"},type:{description:'The type of the legend. Use `"symbol"` to create a discrete legend and `"gradient"` for a continuous color gradient.\n\n__Default value:__ `"gradient"` for non-binned quantitative fields and temporal fields; `"symbol"` otherwise.',enum:["symbol","gradient"],type:"string"},values:{anyOf:[{items:{type:"number"},type:"array"},{items:{type:"string"},type:"array"},{items:{$ref:"#/definitions/DateTime"},type:"array"}],description:"Explicitly set the visible legend values."},zindex:{description:"A non-positive integer indicating z-index of the legend.\nIf zindex is 0, legend should be drawn behind all chart elements.\nTo put them in front, use zindex = 1.",minimum:0,type:"number"}},type:"object"},LegendConfig:{additionalProperties:!1,properties:{cornerRadius:{description:"Corner radius for the full legend.",type:"number"},entryPadding:{description:"Padding (in pixels) between legend entries in a symbol legend.",type:"number"},fillColor:{description:"Background fill color for the full legend.",type:"string"},gradientHeight:{description:"The height of the gradient, in pixels.",minimum:0,type:"number"},gradientLabelBaseline:{description:"Text baseline for color ramp gradient labels.",type:"string"},gradientLabelLimit:{description:"The maximum allowed length in pixels of color ramp gradient labels.",type:"number"},gradientLabelOffset:{description:"Vertical offset in pixels for color ramp gradient labels.",type:"number"},gradientStrokeColor:{description:"The color of the gradient stroke, can be in hex color code or regular color name.",type:"string"},gradientStrokeWidth:{description:"The width of the gradient stroke, in pixels.",minimum:0,type:"number"},gradientWidth:{description:"The width of the gradient, in pixels.",minimum:0,type:"number"},labelAlign:{description:"The alignment of the legend label, can be left, middle or right.",type:"string"},labelBaseline:{description:"The position of the baseline of legend label, can be top, middle or bottom.",type:"string"},labelColor:{description:"The color of the legend label, can be in hex color code or regular color name.",type:"string"},labelFont:{description:"The font of the legend label.",type:"string"},labelFontSize:{description:"The font size of legend label.\n\n__Default value:__ `10`.",minimum:0,type:"number"},labelLimit:{description:"Maximum allowed pixel width of axis tick labels.",type:"number"},labelOffset:{description:"The offset of the legend label.",minimum:0,type:"number"},offset:{description:"The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle.\n\n__Default value:__ `0`",type:"number"},orient:{$ref:"#/definitions/LegendOrient",description:'The orientation of the legend, which determines how the legend is positioned within the scene. One of "left", "right", "top-left", "top-right", "bottom-left", "bottom-right", "none".\n\n__Default value:__ `"right"`'},padding:{description:"The padding, in pixels, between the legend and axis.",type:"number"},shortTimeLabels:{description:"Whether month names and weekday names should be abbreviated.\n\n__Default value:__ `false`",type:"boolean"},strokeColor:{description:"Border stroke color for the full legend.",type:"string"},strokeDash:{description:"Border stroke dash pattern for the full legend.",items:{type:"number"},type:"array"},strokeWidth:{description:"Border stroke width for the full legend.",type:"number"},symbolColor:{description:"The color of the legend symbol,",type:"string"},symbolSize:{description:"The size of the legend symbol, in pixels.",minimum:0,type:"number"},symbolStrokeWidth:{description:"The width of the symbol's stroke.",minimum:0,type:"number"},symbolType:{description:'Default shape type (such as "circle") for legend symbols.',type:"string"},titleAlign:{description:"Horizontal text alignment for legend titles.",type:"string"},titleBaseline:{description:"Optional mark property definitions for custom legend styling. \n Vertical text baseline for legend titles.",type:"string"},titleColor:{description:"The color of the legend title, can be in hex color code or regular color name.",type:"string"},titleFont:{description:"The font of the legend title.",type:"string"},titleFontSize:{description:"The font size of the legend title.",type:"number"},titleFontWeight:{description:"The font weight of the legend title.",type:["string","number"]},titleLimit:{description:"Maximum allowed pixel width of axis titles.",type:"number"},titlePadding:{description:"The padding, in pixels, between title and legend.",type:"number"}},type:"object"},LegendFieldDef:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},legend:{anyOf:[{$ref:"#/definitions/Legend"},{type:"null"}],description:"An object defining properties of the legend.\nIf `null`, the legend for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [legend properties](legend.html) are applied."},scale:{$ref:"#/definitions/Scale",description:"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\n__Default value:__ If undefined, default [scale properties](scale.html) are applied."},sort:{anyOf:[{anyOf:[{$ref:"#/definitions/SortOrder"},{$ref:"#/definitions/SortField"}]},{type:"null"}],description:'Sort order for the encoded field.\nSupported `sort` values include `"ascending"`, `"descending"` and `null` (no sorting).\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\n\n__Default value:__ `"ascending"`'},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},LegendOrient:{enum:["left","right","top-left","top-right","bottom-left","bottom-right","none"],type:"string"},LegendResolveMap:{additionalProperties:!1,properties:{color:{$ref:"#/definitions/ResolveMode"},opacity:{$ref:"#/definitions/ResolveMode"},shape:{$ref:"#/definitions/ResolveMode"},size:{$ref:"#/definitions/ResolveMode"}},type:"object"},LocalMultiTimeUnit:{enum:["yearquarter","yearquartermonth","yearmonth","yearmonthdate","yearmonthdatehours","yearmonthdatehoursminutes","yearmonthdatehoursminutesseconds","quartermonth","monthdate","hoursminutes","hoursminutesseconds","minutesseconds","secondsmilliseconds"],type:"string"},LocalSingleTimeUnit:{enum:["year","quarter","month","day","date","hours","minutes","seconds","milliseconds"],type:"string"},AndFilter:{additionalProperties:!1,properties:{and:{items:{$ref:"#/definitions/FilterOperand"},type:"array"}},required:["and"],type:"object"},SelectionAnd:{additionalProperties:!1,properties:{and:{items:{$ref:"#/definitions/SelectionOperand"},type:"array"}},required:["and"],type:"object"},NotFilter:{additionalProperties:!1,properties:{not:{$ref:"#/definitions/FilterOperand"}},required:["not"],type:"object"},SelectionNot:{additionalProperties:!1,properties:{not:{$ref:"#/definitions/SelectionOperand"}},required:["not"],type:"object"},FilterOperand:{anyOf:[{$ref:"#/definitions/NotFilter"},{$ref:"#/definitions/AndFilter"},{$ref:"#/definitions/OrFilter"},{$ref:"#/definitions/Filter"}]},SelectionOperand:{anyOf:[{$ref:"#/definitions/SelectionNot"},{$ref:"#/definitions/SelectionAnd"},{$ref:"#/definitions/SelectionOr"},{type:"string"}]},OrFilter:{additionalProperties:!1,properties:{or:{items:{$ref:"#/definitions/FilterOperand"},type:"array"}},required:["or"],type:"object"},SelectionOr:{additionalProperties:!1,properties:{or:{items:{$ref:"#/definitions/SelectionOperand"},type:"array"}},required:["or"],type:"object"},LookupData:{additionalProperties:!1,properties:{data:{$ref:"#/definitions/Data",description:"secondary data source to lookup in"},fields:{description:"(Optional) fields in foreign data to lookup\nif not specificied, the entire object is queried",items:{type:"string"},type:"array"},key:{description:"key in data to lookup",type:"string"}},required:["data","key"],type:"object"},LookupTransform:{additionalProperties:!1,properties:{as:{anyOf:[{type:"string"},{items:{type:"string"},type:"array"}],description:"(Optional) The field or fields for storing the computed formula value.\nIf `from.fields` is not specified, `as` has to be a string and we put the whole object into the data"},default:{description:"(Optional) The default value to use if lookup fails",type:"string"},from:{$ref:"#/definitions/LookupData",description:"secondary data reference"},lookup:{description:"key in primary data source",type:"string"}},required:["lookup","from"],type:"object"},Mark:{description:"All types of primitive marks.",enum:["area","bar","line","point","text","tick","rect","rule","circle","square"],type:"string"},MarkConfig:{additionalProperties:!1,properties:{align:{$ref:"#/definitions/HorizontalAlign",description:'The horizontal alignment of the text. One of `"left"`, `"right"`, `"center"`.'},angle:{description:"The rotation angle of the text, in degrees.",maximum:360,minimum:0,type:"number"},baseline:{$ref:"#/definitions/VerticalAlign",description:'The vertical alignment of the text. One of `"top"`, `"middle"`, `"bottom"`.\n\n__Default value:__ `"middle"`'},color:{description:'Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\n\n__Default value:__ `"#4682b4"`',type:"string"},dx:{description:"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},dy:{description:"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},fill:{description:"Default Fill Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},fillOpacity:{description:"The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},filled:{description:"Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\n\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.",type:"boolean"},font:{description:'The typeface to set the text in (e.g., `"Helvetica Neue"`).',minimum:0,type:"string"},fontSize:{description:"The font size, in pixels.",minimum:0,type:"number"},fontStyle:{$ref:"#/definitions/FontStyle",description:'The font style (e.g., `"italic"`).'},fontWeight:{anyOf:[{$ref:"#/definitions/FontWeight"},{$ref:"#/definitions/FontWeightNumber"}],description:'The font weight (e.g., `"bold"`).'},interpolate:{$ref:"#/definitions/Interpolate",description:'The line interpolation method to use for line and area marks. One of the following:\n- `"linear"`: piecewise linear segments, as in a polyline.\n- `"linear-closed"`: close the linear segments to form a polygon.\n- `"step"`: alternate between horizontal and vertical segments, as in a step function.\n- `"step-before"`: alternate between vertical and horizontal segments, as in a step function.\n- `"step-after"`: alternate between horizontal and vertical segments, as in a step function.\n- `"basis"`: a B-spline, with control point duplication on the ends.\n- `"basis-open"`: an open B-spline; may not intersect the start or end.\n- `"basis-closed"`: a closed B-spline, as in a loop.\n- `"cardinal"`: a Cardinal spline, with control point duplication on the ends.\n- `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `"cardinal-closed"`: a closed Cardinal spline, as in a loop.\n- `"bundle"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `"monotone"`: cubic interpolation that preserves monotonicity in y.'},limit:{description:"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.",type:"number"},opacity:{description:"The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",maximum:1,minimum:0,type:"number"},orient:{$ref:"#/definitions/Orient",description:"The orientation of a non-stacked bar, tick, area, and line charts.\nThe value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick\nshould be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line, this property determines the sort order of the points in the line\nif `config.sortLineBy` is not specified.\nFor stacked charts, this is always determined by the orientation of the stack;\ntherefore explicitly specified value will be ignored."},radius:{description:"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.",minimum:0,type:"number"},shape:{description:'The default symbol shape to use. One of: `"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, or `"triangle-down"`, or a custom SVG path.\n\n__Default value:__ `"circle"`',type:"string"},size:{description:"The pixel area each the point/circle/square.\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\n\n__Default value:__ `30`",minimum:0,type:"number"},stroke:{description:"Default Stroke Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},strokeDash:{description:"An array of alternating stroke, space lengths for creating dashed or dotted lines.",items:{type:"number"},type:"array"},strokeDashOffset:{description:"The offset (in pixels) into which to begin drawing with the stroke dash array.",type:"number"},strokeOpacity:{description:"The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},strokeWidth:{description:"The stroke width, in pixels.",minimum:0,type:"number"},tension:{description:"Depending on the interpolation type, sets the tension parameter (for line and area marks).",maximum:1,minimum:0,type:"number"},text:{description:"Placeholder text if the `text` channel is not specified",type:"string"},theta:{description:'Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating "north".',type:"number"}},type:"object"},MarkConfigMixins:{additionalProperties:!1,properties:{area:{$ref:"#/definitions/MarkConfig",description:"Area-Specific Config "},bar:{$ref:"#/definitions/BarConfig",description:"Bar-Specific Config "},circle:{$ref:"#/definitions/MarkConfig",description:"Circle-Specific Config "},line:{$ref:"#/definitions/MarkConfig",description:"Line-Specific Config "},mark:{$ref:"#/definitions/MarkConfig",description:"Mark Config "},point:{$ref:"#/definitions/MarkConfig",description:"Point-Specific Config "},rect:{$ref:"#/definitions/MarkConfig",description:"Rect-Specific Config "},rule:{$ref:"#/definitions/MarkConfig",description:"Rule-Specific Config "},square:{$ref:"#/definitions/MarkConfig",description:"Square-Specific Config "},text:{$ref:"#/definitions/TextConfig",description:"Text-Specific Config "},tick:{$ref:"#/definitions/TickConfig",description:"Tick-Specific Config "}},type:"object"},MarkDef:{additionalProperties:!1,properties:{clip:{description:"Whether a mark be clipped to the enclosing group’s width and height.",type:"boolean"},filled:{description:'Whether the mark\'s color should be used as fill color instead of stroke color.\n\n__Default value:__ All marks except `"point"`, `"line"`, and `"rule"` are filled by default.',type:"boolean"},interpolate:{$ref:"#/definitions/Interpolate",description:'The line interpolation method to use for line and area marks. One of the following:\n- `"linear"`: piecewise linear segments, as in a polyline.\n- `"linear-closed"`: close the linear segments to form a polygon.\n- `"step"`: alternate between horizontal and vertical segments, as in a step function.\n- `"step-before"`: alternate between vertical and horizontal segments, as in a step function.\n- `"step-after"`: alternate between horizontal and vertical segments, as in a step function.\n- `"basis"`: a B-spline, with control point duplication on the ends.\n- `"basis-open"`: an open B-spline; may not intersect the start or end.\n- `"basis-closed"`: a closed B-spline, as in a loop.\n- `"cardinal"`: a Cardinal spline, with control point duplication on the ends.\n- `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `"cardinal-closed"`: a closed Cardinal spline, as in a loop.\n- `"bundle"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `"monotone"`: cubic interpolation that preserves monotonicity in y.\n\nFor more information about each interpolation method, please see [Vega\'s line interpolation docs](https://vega.github.io/vega/docs/marks/line/).'},orient:{$ref:"#/definitions/Orient",description:"Orientation of the marks."},style:{anyOf:[{type:"string"},{items:{type:"string"},type:"array"}],description:'A string or array of strings indicating the name of custom styles to apply to the mark. A style is a named collection of mark property defaults defined within the [configuration](config.html). If style is an array, later styles will override earlier styles. Any [mark properties](encoding.html#mark-prop) explicitly defined within the `encoding` will override a style default.\n\n__Default value:__ The mark\'s name. For example, a bar mark will have style `"bar"` by default.'},tension:{description:"Depending on the interpolation type, sets the tension parameter (for line and area marks).\n\nTODO: provide the link to D3 docs.",maximum:1,minimum:0,type:"number"},type:{$ref:"#/definitions/Mark",description:'The mark type.\nOne of `"bar"`, `"circle"`, `"square"`, `"tick"`, `"line"`,\n`"area"`, `"point"`, `"rule"`, and `"text"`.'}},required:["type"],type:"object"},Month:{maximum:12,minimum:1,type:"number"},MultiSelection:{additionalProperties:!1,properties:{encodings:{description:"An array of encoding channels. The corresponding data field values\nmust match for a data tuple to fall within the selection.",items:{$ref:"#/definitions/SingleDefChannel"},type:"array"},fields:{description:"An array of field names whose values must match for a data tuple to\nfall within the selection.",items:{type:"string"},type:"array"},nearest:{description:"When true, an invisible voronoi diagram is computed to accelerate discrete\nselection. The data value _nearest_ the mouse cursor is added to the selection.\n\nSee the [nearest transform](nearest.html) documentation for more information.",type:"boolean"},on:{$ref:"#/definitions/VgEventStream",description:"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters)."},resolve:{$ref:"#/definitions/SelectionResolution",description:"With layered and multi-view displays, a strategy that determines how\nselections' data queries are resolved when applied in a filter transform,\nconditional encoding rule, or scale domain."},toggle:{description:"Controls whether data values should be toggled or only ever inserted into\nmulti selections. Can be `true`, `false` (for insertion only), or a\n[Vega expression](https://vega.github.io/vega/docs/expressions/).\n\n__Default value:__ `true`, which corresponds to `event.shiftKey` (i.e.,\ndata values are toggled when a user interacts with the shift-key pressed).\n\nSee the [toggle transform](toggle.html) documentation for more information.",type:["string","boolean"]},type:{enum:["multi"],type:"string"}},required:["type"],type:"object"},MultiSelectionConfig:{additionalProperties:!1,properties:{encodings:{description:"An array of encoding channels. The corresponding data field values\nmust match for a data tuple to fall within the selection.",items:{$ref:"#/definitions/SingleDefChannel"},type:"array"},fields:{description:"An array of field names whose values must match for a data tuple to\nfall within the selection.",items:{type:"string"},type:"array"},nearest:{description:"When true, an invisible voronoi diagram is computed to accelerate discrete\nselection. The data value _nearest_ the mouse cursor is added to the selection.\n\nSee the [nearest transform](nearest.html) documentation for more information.",type:"boolean"},on:{$ref:"#/definitions/VgEventStream",description:"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters)."},resolve:{$ref:"#/definitions/SelectionResolution",description:"With layered and multi-view displays, a strategy that determines how\nselections' data queries are resolved when applied in a filter transform,\nconditional encoding rule, or scale domain."},toggle:{description:"Controls whether data values should be toggled or only ever inserted into\nmulti selections. Can be `true`, `false` (for insertion only), or a\n[Vega expression](https://vega.github.io/vega/docs/expressions/).\n\n__Default value:__ `true`, which corresponds to `event.shiftKey` (i.e.,\ndata values are toggled when a user interacts with the shift-key pressed).\n\nSee the [toggle transform](toggle.html) documentation for more information.",type:["string","boolean"]}},type:"object"},MultiTimeUnit:{anyOf:[{$ref:"#/definitions/LocalMultiTimeUnit"},{$ref:"#/definitions/UtcMultiTimeUnit"}]},NamedData:{additionalProperties:!1,properties:{format:{$ref:"#/definitions/DataFormat",description:"An object that specifies the format for parsing the data."},name:{description:"Provide a placeholder name and bind data at runtime.",type:"string"}},required:["name"],type:"object"},NiceTime:{enum:["second","minute","hour","day","week","month","year"],type:"string"},OneOfFilter:{additionalProperties:!1,properties:{field:{description:"Field to be filtered",type:"string"},oneOf:{anyOf:[{items:{type:"string"},type:"array"},{items:{type:"number"},type:"array"},{items:{type:"boolean"},type:"array"},{items:{$ref:"#/definitions/DateTime"},type:"array"}],description:"A set of values that the `field`'s value should be a member of,\nfor a data item included in the filtered data."},timeUnit:{$ref:"#/definitions/TimeUnit",description:"time unit for the field to be filtered."}},required:["field","oneOf"],type:"object"},OrderFieldDef:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},sort:{$ref:"#/definitions/SortOrder",description:'The sort order. One of `"ascending"` (default) or `"descending"`.'},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},Orient:{enum:["horizontal","vertical"],type:"string"},Padding:{anyOf:[{type:"number"},{additionalProperties:!1,properties:{bottom:{type:"number"},left:{type:"number"},right:{type:"number"},top:{type:"number"}},type:"object"}],minimum:0},PositionFieldDef:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},axis:{anyOf:[{$ref:"#/definitions/Axis"},{type:"null"}],description:"An object defining properties of axis's gridlines, ticks and labels.\nIf `null`, the axis for the encoding channel will be removed.\n\n__Default value:__ If undefined, default [axis properties](axis.html) are applied."},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},scale:{$ref:"#/definitions/Scale",description:"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\n__Default value:__ If undefined, default [scale properties](scale.html) are applied."},sort:{anyOf:[{anyOf:[{$ref:"#/definitions/SortOrder"},{$ref:"#/definitions/SortField"}]},{type:"null"}],description:'Sort order for the encoded field.\nSupported `sort` values include `"ascending"`, `"descending"` and `null` (no sorting).\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\n\n__Default value:__ `"ascending"`'},stack:{$ref:"#/definitions/StackOffset",description:'Type of stacking offset if the field should be stacked.\n`stack` is only applicable for `x` and `y` channels with continuous domains.\nFor example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\n\n`stack` can be one of the following values:\n- `"zero"`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](stack.html#bar) and [area](stack.html#area) chart).\n- `"normalize"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](stack.html#normalized).
\n-`"center"` - stacking with center baseline (for [streamgraph](stack.html#streamgraph)).\n- `"none"` - No-stacking. This will produce layered [bar](stack.html#layered-bar-chart) and area chart.\n\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) `bar` or `area` marks (2) At least one of `color`, `opacity`, `size`, or `detail` channel mapped to a group-by field (3) one position channel has a linear scale and summative aggregation function (e.g., `sum`, `count`) and (4) the other position channel either has discrete domain or unmapped. Otherwise `"none"` by default.'},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},RangeConfig:{additionalProperties:{$ref:"#/definitions/RangeConfigValue"},properties:{category:{anyOf:[{items:{type:"string"},type:"array"},{$ref:"#/definitions/VgScheme"}],description:"Default range for _nominal_ (categorical) fields."},diverging:{anyOf:[{items:{type:"string"},type:"array"},{$ref:"#/definitions/VgScheme"}],description:"Default range for diverging _quantitative_ fields."},heatmap:{anyOf:[{items:{type:"string"},type:"array"},{$ref:"#/definitions/VgScheme"}],description:"Default range for _quantitative_ heatmaps."},ordinal:{anyOf:[{items:{type:"string"},type:"array"},{$ref:"#/definitions/VgScheme"}],description:"Default range for _ordinal_ fields."},ramp:{anyOf:[{items:{type:"string"},type:"array"},{$ref:"#/definitions/VgScheme"}],description:"Default range for _quantitative_ and _temporal_ fields."},symbol:{description:"Default range palette for the `shape` channel.",items:{type:"string"},type:"array"}},type:"object"},RangeConfigValue:{anyOf:[{items:{type:["number","string"]},type:"array"},{$ref:"#/definitions/VgScheme"},{additionalProperties:!1,properties:{step:{type:"number"}},required:["step"],type:"object"}]},RangeFilter:{additionalProperties:!1,properties:{field:{description:"Field to be filtered",type:"string"},range:{description:"An array of inclusive minimum and maximum values\nfor a field value of a data item to be included in the filtered data.",items:{anyOf:[{type:"number"},{$ref:"#/definitions/DateTime"}]},maxItems:2,minItems:2,type:"array"},timeUnit:{$ref:"#/definitions/TimeUnit",description:"time unit for the field to be filtered."}},required:["field","range"],type:"object"},Repeat:{additionalProperties:!1,properties:{column:{description:"Horizontal repeated views.",items:{type:"string"},type:"array"},row:{description:"Vertical repeated views.",items:{type:"string"},type:"array"}},type:"object"},RepeatRef:{additionalProperties:!1,description:"Reference to a repeated value.",properties:{repeat:{enum:["row","column"],type:"string"}},required:["repeat"],type:"object"},Resolve:{additionalProperties:!1,properties:{axis:{$ref:"#/definitions/AxisResolveMap"},legend:{$ref:"#/definitions/LegendResolveMap"},scale:{$ref:"#/definitions/ScaleResolveMap"}},type:"object"},ResolveMode:{enum:["independent","shared"],type:"string"},Scale:{additionalProperties:!1,properties:{base:{description:"The logarithm base of the `log` scale (default `10`).",type:"number"},clamp:{description:"If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n\n__Default value:__ derived from the [scale config](config.html#scale-config)'s `clamp` (`true` by default).",type:"boolean"},domain:{anyOf:[{items:{type:"number"},type:"array"},{items:{type:"string"},type:"array"},{items:{$ref:"#/definitions/DateTime"},type:"array"},{enum:["unaggregated"],type:"string"},{$ref:"#/definitions/SelectionDomain"}],description:'Customized domain values.\n\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values. [Piecewise scales](scale.html#piecewise) can be created by providing a `domain` with more than two entries.\nIf the input field is aggregated, `domain` can also be a string value `"unaggregated"`, indicating that the domain should include the raw data values prior to the aggregation.\n\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](types.html#datetime).\n\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values.\n\nThe `selection` property can be used to [interactively determine](selection.html#scale-domains) the scale domain.'},exponent:{description:"The exponent of the `pow` scale.",type:"number"},interpolate:{anyOf:[{$ref:"#/definitions/Interpolate"},{$ref:"#/definitions/InterpolateParams"}],description:"The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in RGB space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate)."},nice:{anyOf:[{type:"boolean"},{type:"number"},{$ref:"#/definitions/NiceTime"},{additionalProperties:!1,properties:{interval:{type:"string"},step:{type:"number"}},required:["interval","step"],type:"object"}],description:'Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n\nFor temporal fields with time and utc scales, the `nice` value can be a string indicating the desired time interval. Legal values are `"millisecond"`, `"second"`, `"minute"`, `"hour"`, `"day"`, `"week"`, `"month"`, and `"year"`. Alternatively, `time` and `utc` scales can accept an object-valued interval specifier of the form `{"interval": "month", "step": 3}`, which includes a desired number of interval steps. Here, the domain would snap to quarter (Jan, Apr, Jul, Oct) boundaries.\n\n__Default value:__ `true` for unbinned _quantitative_ fields; automatically determined based on the time unit for _temporal_ fields.'},padding:{description:"Shortcut for setting `paddingInner` and `paddingOuter` to the same value. For point scales, this property only affects `paddingOuter`.\n\n__Default value:__ see `paddingInner` and `paddingOuter`.",maximum:1,minimum:0,type:"number"},paddingInner:{description:"The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\n\n__Default value:__ derived from the [scale config](scale.html#config)'s `bandPaddingInner`.",maximum:1,minimum:0,type:"number"},paddingOuter:{description:"The outer padding (spacing) at the ends of the range of band and point scales,\nas a fraction of the step size. This value must lie in the range [0,1].\n\n__Default value:__ derived from the [scale config](scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales.",maximum:1,minimum:0,type:"number"},range:{anyOf:[{items:{type:"number"},type:"array"},{items:{type:"string"},type:"array"},{type:"string"}],description:'The range of the scale. One of:\n\n- A string indicating a [pre-defined named scale range](scale.html#range-config) (e.g., example, `"symbol"`, or `"diverging"`).\n\n- For [continuous scales](scale.html#continuous), two-element array indicating minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](scale.html#piecewise).\n\n- For [discrete](scale.html#discrete) and [discretizing](scale.html#discretizing) scales, an array of desired output values.\n\n__Notes:__\n\n1) For [sequential](scale.html#sequential), [ordinal](scale.html#ordinal), and discretizing color scales, you can also specify a color [`scheme`](scale.html#scheme) instead of `range`.\n\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view\'s corresponding [size](size.html) (`width` and `height`) or via [range steps and paddings properties](#range-step) for [band](#band) and [point](#point) scales.'},rangeStep:{description:"The distance between the starts of adjacent bands or points in [band](scale.html#band) and [point](scale.html#point) scales.\n\nIf `rangeStep` is `null` or if the view contains the scale's corresponding [size](size.html) (`width` for `x` scales and `height` for `y` scales), `rangeStep` will be automatically determined to fit the size of the view.\n\n__Default value:__ derived the [scale config](config.html#scale-config)'s `textXRangeStep` (`90` by default) for x-scales of `text` marks and `rangeStep` (`21` by default) for x-scales of other marks and y-scales.\n\n__Warning__: If `rangeStep` is `null` and the cardinality of the scale's domain is higher than `width` or `height`, the rangeStep might become less than one pixel and the mark might not appear correctly.",minimum:0,type:["number","null"]},round:{description:"If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n\n__Default value:__ `false`.",type:"boolean"},scheme:{anyOf:[{type:"string"},{$ref:"#/definitions/SchemeParams"}],description:'A string indicating a color [scheme](scale.html#scheme) name (e.g., `"category10"` or `"viridis"`) or a [scheme parameter object](scale.html#scheme-params).\n\nDiscrete color schemes may be used with [discrete](scale.html#discrete) or [discretizing](scale.html#discretizing) scales. Continuous color schemes are intended for use with [sequential](scales.html#sequential) scales.\n\nFor the full list of supported scheme, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.'},type:{$ref:"#/definitions/ScaleType",description:'The type of scale. Vega-Lite supports the following categories of scale types:\n\n1) [**Continuous Scales**](scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`"linear"`](scale.html#linear), [`"pow"`](scale.html#pow), [`"sqrt"`](scale.html#sqrt), [`"log"`](scale.html#log), [`"time"`](scale.html#time), [`"utc"`](scale.html#utc), [`"sequential"`](scale.html#sequential)).\n\n2) [**Discrete Scales**](scale.html#discrete) -- mapping discrete domains to discrete ([`"ordinal"`](scale.html#ordinal)) or continuous ([`"band"`](scale.html#band) and [`"point"`](scale.html#point)) output ranges.\n\n3) [**Discretizing Scales**](scale.html#discretizing) -- mapping continuous domains to discrete output ranges ([`"bin-linear"`](scale.html#bin-linear) and [`"bin-ordinal"`](scale.html#bin-ordinal)).\n\n__Default value:__ please see the [scale type table](scale.html#type).'},zero:{description:"If `true`, ensures that a zero baseline value is included in the scale domain.\n\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\n\n__Note:__ Log, time, and utc scales do not support `zero`.",type:"boolean"}},type:"object"},ScaleConfig:{additionalProperties:!1,properties:{bandPaddingInner:{description:"Default inner padding for `x` and `y` band-ordinal scales.\n\n__Default value:__ `0.1`",maximum:1,minimum:0,type:"number"},bandPaddingOuter:{description:"Default outer padding for `x` and `y` band-ordinal scales.\nIf not specified, by default, band scale's paddingOuter is paddingInner/2.",maximum:1,minimum:0,type:"number"},clamp:{description:"If true, values that exceed the data domain are clamped to either the minimum or maximum range value",type:"boolean"},maxBandSize:{description:"The default max value for mapping quantitative fields to bar's size/bandSize.\n\nIf undefined (default), we will use the scale's `rangeStep` - 1.",minimum:0,type:"number"},maxFontSize:{description:"The default max value for mapping quantitative fields to text's size/fontSize.\n\n__Default value:__ `40`",minimum:0,type:"number"},maxOpacity:{description:"Default max opacity for mapping a field to opacity.\n\n__Default value:__ `0.8`",maximum:1,minimum:0,type:"number"},maxSize:{description:"Default max value for point size scale.",minimum:0,type:"number"},maxStrokeWidth:{description:"Default max strokeWidth for strokeWidth (or rule/line's size) scale.\n\n__Default value:__ `4`",minimum:0,type:"number"},minBandSize:{description:"The default min value for mapping quantitative fields to bar and tick's size/bandSize scale with zero=false.\n\n__Default value:__ `2`",minimum:0,type:"number"},minFontSize:{description:"The default min value for mapping quantitative fields to tick's size/fontSize scale with zero=false\n\n__Default value:__ `8`",minimum:0,type:"number"},minOpacity:{description:"Default minimum opacity for mapping a field to opacity.\n\n__Default value:__ `0.3`",maximum:1,minimum:0,type:"number"},minSize:{description:"Default minimum value for point size scale with zero=false.\n\n__Default value:__ `9`",minimum:0,type:"number"},minStrokeWidth:{description:"Default minimum strokeWidth for strokeWidth (or rule/line's size) scale with zero=false.\n\n__Default value:__ `1`",minimum:0,type:"number"},pointPadding:{description:"Default outer padding for `x` and `y` point-ordinal scales.\n\n__Default value:__ `0.5`",maximum:1,minimum:0,type:"number"},rangeStep:{description:"Default range step for band and point scales of (1) the `y` channel\nand (2) the `x` channel when the mark is not `text`.\n\n__Default value:__ `21`",minimum:0,type:["number","null"]},round:{description:"If true, rounds numeric output values to integers.\nThis can be helpful for snapping to the pixel grid.\n(Only available for `x`, `y`, and `size` scales.)",type:"boolean"},textXRangeStep:{description:"Default range step for `x` band and point scales of text marks.\n\n__Default value:__ `90`",minimum:0,type:"number"},useUnaggregatedDomain:{description:'Use the source data range before aggregation as scale domain instead of aggregated data for aggregate axis.\n\nThis is equivalent to setting `domain` to `"unaggregate"` for aggregated _quantitative_ fields by default.\n\nThis property only works with aggregate functions that produce values within the raw data domain (`"mean"`, `"average"`, `"median"`, `"q1"`, `"q3"`, `"min"`, `"max"`). For other aggregations that produce values outside of the raw data domain (e.g. `"count"`, `"sum"`), this property is ignored.\n\n__Default value:__ `false`',type:"boolean"}},type:"object"},ScaleFieldDef:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},scale:{$ref:"#/definitions/Scale",description:"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\n\n__Default value:__ If undefined, default [scale properties](scale.html) are applied."},sort:{anyOf:[{anyOf:[{$ref:"#/definitions/SortOrder"},{$ref:"#/definitions/SortField"}]},{type:"null"}],description:'Sort order for the encoded field.\nSupported `sort` values include `"ascending"`, `"descending"` and `null` (no sorting).\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\n\n__Default value:__ `"ascending"`'},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},ScaleResolveMap:{additionalProperties:!1,properties:{color:{$ref:"#/definitions/ResolveMode"},opacity:{$ref:"#/definitions/ResolveMode"},shape:{$ref:"#/definitions/ResolveMode"},size:{$ref:"#/definitions/ResolveMode"},x:{$ref:"#/definitions/ResolveMode"},y:{$ref:"#/definitions/ResolveMode"}},type:"object"},ScaleType:{enum:["linear","bin-linear","log","pow","sqrt","time","utc","sequential","ordinal","bin-ordinal","point","band"],type:"string"},SchemeParams:{additionalProperties:!1,properties:{extent:{description:"For sequential and diverging schemes only, determines the extent of the color range to use. For example `[0.2, 1]` will rescale the color scheme such that color values in the range _[0, 0.2)_ are excluded from the scheme.",items:{type:"number"},type:"array"},name:{description:'A color scheme name for sequential/ordinal scales (e.g., `"category10"` or `"viridis"`).\n\nFor the full list of supported scheme, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.',type:"string"}},required:["name"],type:"object"},SelectionConfig:{additionalProperties:!1,properties:{interval:{$ref:"#/definitions/IntervalSelectionConfig",description:'The default definition for an [`interval`](selection.html#type) selection. All properties and transformations\nfor an interval selection definition (except `type`) may be specified here.\n\nFor instance, setting `interval` to `{"translate": false}` disables the ability to move\ninterval selections by default.'},multi:{$ref:"#/definitions/MultiSelectionConfig",description:'The default definition for a [`multi`](selection.html#type) selection. All properties and transformations\nfor a multi selection definition (except `type`) may be specified here.\n\nFor instance, setting `multi` to `{"toggle": "event.altKey"}` adds additional values to\nmulti selections when clicking with the alt-key pressed by default.'},single:{$ref:"#/definitions/SingleSelectionConfig",description:'The default definition for a [`single`](selection.html#type) selection. All properties and transformations\n for a single selection definition (except `type`) may be specified here.\n\nFor instance, setting `single` to `{"on": "dblclick"}` populates single selections on double-click by default.'}},type:"object"},SelectionDef:{anyOf:[{$ref:"#/definitions/SingleSelection"},{$ref:"#/definitions/MultiSelection"},{$ref:"#/definitions/IntervalSelection"}]},SelectionDomain:{anyOf:[{additionalProperties:!1,properties:{field:{description:"The field name to extract selected values for, when a selection is [projected](project.html)\nover multiple fields or encodings.",type:"string"},selection:{description:"The name of a selection.",type:"string"}},required:["selection"],type:"object"},{additionalProperties:!1,properties:{encoding:{description:"The encoding channel to extract selected values for, when a selection is [projected](project.html)\nover multiple fields or encodings.",type:"string"},selection:{description:"The name of a selection.",type:"string"}},required:["selection"],type:"object"}]},SelectionFilter:{additionalProperties:!1,properties:{selection:{$ref:"#/definitions/SelectionOperand",description:"Filter using a selection name."}},required:["selection"],type:"object"},SelectionResolution:{enum:["global","union","intersect"],type:"string"},SingleDefChannel:{enum:["x","y","x2","y2","row","column","size","shape","color","opacity","text","tooltip"],type:"string"},SingleSelection:{additionalProperties:!1,properties:{bind:{anyOf:[{$ref:"#/definitions/VgBinding"},{additionalProperties:{$ref:"#/definitions/VgBinding"},type:"object"}],description:"Establish a two-way binding between a single selection and input elements\n(also known as dynamic query widgets). A binding takes the form of\nVega's [input element binding definition](https://vega.github.io/vega/docs/signals/#bind)\nor can be a mapping between projected field/encodings and binding definitions.\n\nSee the [bind transform](bind.html) documentation for more information."},encodings:{description:"An array of encoding channels. The corresponding data field values\nmust match for a data tuple to fall within the selection.",items:{$ref:"#/definitions/SingleDefChannel"},type:"array"},fields:{description:"An array of field names whose values must match for a data tuple to\nfall within the selection.",items:{type:"string"},type:"array"},nearest:{description:"When true, an invisible voronoi diagram is computed to accelerate discrete\nselection. The data value _nearest_ the mouse cursor is added to the selection.\n\nSee the [nearest transform](nearest.html) documentation for more information.",type:"boolean"},on:{$ref:"#/definitions/VgEventStream",description:"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters)."},resolve:{$ref:"#/definitions/SelectionResolution",description:"With layered and multi-view displays, a strategy that determines how\nselections' data queries are resolved when applied in a filter transform,\nconditional encoding rule, or scale domain."},type:{enum:["single"],type:"string"}},required:["type"],type:"object"},SingleSelectionConfig:{additionalProperties:!1,properties:{bind:{anyOf:[{$ref:"#/definitions/VgBinding"},{additionalProperties:{$ref:"#/definitions/VgBinding"},type:"object"}],description:"Establish a two-way binding between a single selection and input elements\n(also known as dynamic query widgets). A binding takes the form of\nVega's [input element binding definition](https://vega.github.io/vega/docs/signals/#bind)\nor can be a mapping between projected field/encodings and binding definitions.\n\nSee the [bind transform](bind.html) documentation for more information."},encodings:{description:"An array of encoding channels. The corresponding data field values\nmust match for a data tuple to fall within the selection.",items:{$ref:"#/definitions/SingleDefChannel"},type:"array"},fields:{description:"An array of field names whose values must match for a data tuple to\nfall within the selection.",items:{type:"string"},type:"array"},nearest:{description:"When true, an invisible voronoi diagram is computed to accelerate discrete\nselection. The data value _nearest_ the mouse cursor is added to the selection.\n\nSee the [nearest transform](nearest.html) documentation for more information.",type:"boolean"},on:{$ref:"#/definitions/VgEventStream",description:"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters)."},resolve:{$ref:"#/definitions/SelectionResolution",description:"With layered and multi-view displays, a strategy that determines how\nselections' data queries are resolved when applied in a filter transform,\nconditional encoding rule, or scale domain."}},type:"object"},SingleTimeUnit:{anyOf:[{$ref:"#/definitions/LocalSingleTimeUnit"},{$ref:"#/definitions/UtcSingleTimeUnit"}]},SortField:{additionalProperties:!1,properties:{field:{description:"The data field to sort by.\n\n__Default value:__ If unspecified, defaults to the field specified in the outer data reference.",type:"string"},op:{$ref:"#/definitions/AggregateOp",description:'An [aggregate operation](aggregate.html#ops) to perform on the field prior to sorting (e.g., `"count"`, `"mean"` and `"median"`).\nThis property is required in cases where the sort field and the data reference field do not match.\nThe input data objects will be aggregated, grouped by the encoded data field.\n\nFor a full list of operations, please see the documentation for [aggregate](aggregate.html#ops).'},order:{$ref:"#/definitions/SortOrder",description:'The sort order. One of `"ascending"` (default) or `"descending"`.'}},required:["op"],type:"object"},SortOrder:{anyOf:[{enum:["ascending"],type:"string"},{enum:["descending"],type:"string"},{type:"null"}]},StackOffset:{enum:["zero","center","normalize","none"],type:"string"},StyleConfigIndex:{additionalProperties:{$ref:"#/definitions/VgMarkConfig"},type:"object"},Summarize:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/AggregateOp",description:"The aggregation operations to apply to the fields, such as sum, average or count.\nSee the [full list of supported aggregation operations](https://vega.github.io/vega-lite/docs/aggregate.html#supported-aggregation-operations)\nfor more information."},as:{description:"The output field names to use for each aggregated field.",type:"string"},field:{description:"The data field for which to compute aggregate function.",type:"string"}},required:["aggregate","field","as"],type:"object"},SummarizeTransform:{additionalProperties:!1,properties:{groupby:{description:"The data fields to group by. If not specified, a single group containing all data objects will be used.",items:{type:"string"},type:"array"},summarize:{description:"Array of objects that define aggregate fields.",items:{$ref:"#/definitions/Summarize"},type:"array"}},required:["summarize"],type:"object"},TextConfig:{additionalProperties:!1,properties:{align:{description:"The horizontal text alignment.",enum:["left","center","right"],type:"string"},angle:{description:"The rotation angle of the text, in degrees.",maximum:360,minimum:0,type:"number"},baseline:{$ref:"#/definitions/VerticalAlign",description:'The vertical alignment of the text. One of `"top"`, `"middle"`, `"bottom"`.\n\n__Default value:__ `"middle"`'},color:{description:'Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\n\n__Default value:__ `"#4682b4"`',type:"string"},dx:{description:"The horizontal offset in pixels (before rotation), between the text and anchor point.",type:"number"},dy:{description:"The vertical offset in pixels (before rotation), between the text and anchor point.",type:"number"},fill:{description:"Default Fill Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},fillOpacity:{description:"The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},filled:{description:"Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\n\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.",type:"boolean"},font:{description:'The typeface to set the text in (e.g., `"Helvetica Neue"`).',minimum:0,type:"string"},fontSize:{description:"The font size, in pixels.",minimum:0,type:"number"},fontStyle:{$ref:"#/definitions/FontStyle",description:'The font style (e.g., `"italic"`).'},fontWeight:{anyOf:[{$ref:"#/definitions/FontWeight"},{$ref:"#/definitions/FontWeightNumber"}],description:'The font weight (e.g., `"bold"`).'},interpolate:{$ref:"#/definitions/Interpolate",description:'The line interpolation method to use for line and area marks. One of the following:\n- `"linear"`: piecewise linear segments, as in a polyline.\n- `"linear-closed"`: close the linear segments to form a polygon.\n- `"step"`: alternate between horizontal and vertical segments, as in a step function.\n- `"step-before"`: alternate between vertical and horizontal segments, as in a step function.\n- `"step-after"`: alternate between horizontal and vertical segments, as in a step function.\n- `"basis"`: a B-spline, with control point duplication on the ends.\n- `"basis-open"`: an open B-spline; may not intersect the start or end.\n- `"basis-closed"`: a closed B-spline, as in a loop.\n- `"cardinal"`: a Cardinal spline, with control point duplication on the ends.\n- `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `"cardinal-closed"`: a closed Cardinal spline, as in a loop.\n- `"bundle"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `"monotone"`: cubic interpolation that preserves monotonicity in y.'},limit:{description:"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.",type:"number"},opacity:{description:"The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",maximum:1,minimum:0,type:"number"},orient:{$ref:"#/definitions/Orient",description:"The orientation of a non-stacked bar, tick, area, and line charts.\nThe value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick\nshould be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line, this property determines the sort order of the points in the line\nif `config.sortLineBy` is not specified.\nFor stacked charts, this is always determined by the orientation of the stack;\ntherefore explicitly specified value will be ignored."},radius:{description:"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.",minimum:0,type:"number"},shape:{description:'The default symbol shape to use. One of: `"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, or `"triangle-down"`, or a custom SVG path.\n\n__Default value:__ `"circle"`',type:"string"},shortTimeLabels:{description:"Whether month names and weekday names should be abbreviated.",type:"boolean"},size:{description:"The pixel area each the point/circle/square.\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\n\n__Default value:__ `30`",minimum:0,type:"number"},stroke:{description:"Default Stroke Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},strokeDash:{description:"An array of alternating stroke, space lengths for creating dashed or dotted lines.",items:{type:"number"},type:"array"},strokeDashOffset:{description:"The offset (in pixels) into which to begin drawing with the stroke dash array.",type:"number"},strokeOpacity:{description:"The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},strokeWidth:{description:"The stroke width, in pixels.",minimum:0,type:"number"},tension:{description:"Depending on the interpolation type, sets the tension parameter (for line and area marks).",maximum:1,minimum:0,type:"number"},text:{description:"Placeholder text if the `text` channel is not specified",type:"string"},theta:{description:'Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating "north".',type:"number"}},type:"object"},TextFieldDef:{additionalProperties:!1,properties:{aggregate:{$ref:"#/definitions/Aggregate",description:"Aggregation function for the field\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\n\n__Default value:__ `undefined` (None)"},bin:{anyOf:[{type:"boolean"},{$ref:"#/definitions/BinParams"}],description:"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\nIf `true`, default [binning parameters](bin.html) will be applied.\n\n__Default value:__ `false`"},field:{$ref:"#/definitions/Field",description:"__Required.__ A string defining the name of the field from which to pull a data value\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\n\n__Note:__ `field` is not required if `aggregate` is `count`."},format:{description:"The [formatting pattern](format.html) for a text field. If not defined, this will be determined automatically.",type:"string"},timeUnit:{$ref:"#/definitions/TimeUnit",description:"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\n\n__Default value:__ `undefined` (None)"},type:{$ref:"#/definitions/Type",description:'The encoded field\'s type of measurement. This can be either a full type\nname (`"quantitative"`, `"temporal"`, `"ordinal"`, and `"nominal"`).'}},required:["type"],type:"object"},TickConfig:{additionalProperties:!1,properties:{align:{$ref:"#/definitions/HorizontalAlign",description:'The horizontal alignment of the text. One of `"left"`, `"right"`, `"center"`.'},angle:{description:"The rotation angle of the text, in degrees.",maximum:360,minimum:0,type:"number"},bandSize:{description:"The width of the ticks.\n\n__Default value:__ 2/3 of rangeStep.",minimum:0,type:"number"},baseline:{$ref:"#/definitions/VerticalAlign",description:'The vertical alignment of the text. One of `"top"`, `"middle"`, `"bottom"`.\n\n__Default value:__ `"middle"`'},color:{description:'Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\n\n__Default value:__ `"#4682b4"`',type:"string"},dx:{description:"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},dy:{description:"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},fill:{description:"Default Fill Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},fillOpacity:{description:"The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},filled:{description:"Whether the mark's color should be used as fill color instead of stroke color.\n\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\n\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.",type:"boolean"},font:{description:'The typeface to set the text in (e.g., `"Helvetica Neue"`).',minimum:0,type:"string"},fontSize:{description:"The font size, in pixels.",minimum:0,type:"number"},fontStyle:{$ref:"#/definitions/FontStyle",description:'The font style (e.g., `"italic"`).'},fontWeight:{anyOf:[{$ref:"#/definitions/FontWeight"},{$ref:"#/definitions/FontWeightNumber"}],description:'The font weight (e.g., `"bold"`).'},interpolate:{$ref:"#/definitions/Interpolate",description:'The line interpolation method to use for line and area marks. One of the following:\n- `"linear"`: piecewise linear segments, as in a polyline.\n- `"linear-closed"`: close the linear segments to form a polygon.\n- `"step"`: alternate between horizontal and vertical segments, as in a step function.\n- `"step-before"`: alternate between vertical and horizontal segments, as in a step function.\n- `"step-after"`: alternate between horizontal and vertical segments, as in a step function.\n- `"basis"`: a B-spline, with control point duplication on the ends.\n- `"basis-open"`: an open B-spline; may not intersect the start or end.\n- `"basis-closed"`: a closed B-spline, as in a loop.\n- `"cardinal"`: a Cardinal spline, with control point duplication on the ends.\n- `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `"cardinal-closed"`: a closed Cardinal spline, as in a loop.\n- `"bundle"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `"monotone"`: cubic interpolation that preserves monotonicity in y.'},limit:{description:"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.",type:"number"},opacity:{description:"The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",maximum:1,minimum:0,type:"number"},orient:{$ref:"#/definitions/Orient",description:"The orientation of a non-stacked bar, tick, area, and line charts.\nThe value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick\nshould be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line, this property determines the sort order of the points in the line\nif `config.sortLineBy` is not specified.\nFor stacked charts, this is always determined by the orientation of the stack;\ntherefore explicitly specified value will be ignored."},radius:{description:"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.",minimum:0,type:"number"},shape:{description:'The default symbol shape to use. One of: `"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, or `"triangle-down"`, or a custom SVG path.\n\n__Default value:__ `"circle"`',type:"string"},size:{description:"The pixel area each the point/circle/square.\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\n\n__Default value:__ `30`",minimum:0,type:"number"},stroke:{description:"Default Stroke Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},strokeDash:{description:"An array of alternating stroke, space lengths for creating dashed or dotted lines.",items:{type:"number"},type:"array"},strokeDashOffset:{description:"The offset (in pixels) into which to begin drawing with the stroke dash array.",type:"number"},strokeOpacity:{description:"The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},strokeWidth:{description:"The stroke width, in pixels.",minimum:0,type:"number"},tension:{description:"Depending on the interpolation type, sets the tension parameter (for line and area marks).",maximum:1,minimum:0,type:"number"},text:{description:"Placeholder text if the `text` channel is not specified",type:"string"},theta:{description:'Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating "north".',type:"number"},thickness:{description:"Thickness of the tick mark.\n\n__Default value:__ `1`",minimum:0,type:"number"}},type:"object"},TimeUnit:{anyOf:[{$ref:"#/definitions/SingleTimeUnit"},{$ref:"#/definitions/MultiTimeUnit"}]},TimeUnitTransform:{additionalProperties:!1,properties:{as:{description:"The output field to write the timeUnit value.",type:"string"},field:{description:"The data field to apply time unit.",type:"string"},timeUnit:{$ref:"#/definitions/TimeUnit",description:"The timeUnit."}},required:["timeUnit","field","as"],type:"object"},TitleBase:{additionalProperties:!1,properties:{anchor:{$ref:"#/definitions/Anchor",description:'The anchor position for placing the title. One of `"start"`, `"middle"`, or `"end"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title.\n\n__Default value:__ `"middle"` for [single](spec.html) and [layered](layer.html) views.\n`"start"` for other composite views.\n\n__Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](spec.html) and [layered](layer.html) views. For other composite views, `anchor` is always `"start"`.'},offset:{description:"The orthogonal offset in pixels by which to displace the title from its position along the edge of the chart.",type:"number"},orient:{$ref:"#/definitions/TitleOrient",description:'The orientation of the title relative to the chart. One of `"top"` (the default), `"bottom"`, `"left"`, or `"right"`.'},style:{anyOf:[{type:"string"},{items:{type:"string"},type:"array"}],description:'A [mark style property](config.html#style) to apply to the title text mark.\n\n__Default value:__ `"group-title"`.'}},type:"object"},TitleOrient:{enum:["top","bottom","left","right"],type:"string"},TitleParams:{additionalProperties:!1,properties:{anchor:{$ref:"#/definitions/Anchor",description:'The anchor position for placing the title. One of `"start"`, `"middle"`, or `"end"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title.\n\n__Default value:__ `"middle"` for [single](spec.html) and [layered](layer.html) views.\n`"start"` for other composite views.\n\n__Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](spec.html) and [layered](layer.html) views. For other composite views, `anchor` is always `"start"`.'},offset:{description:"The orthogonal offset in pixels by which to displace the title from its position along the edge of the chart.",type:"number"},orient:{$ref:"#/definitions/TitleOrient",description:'The orientation of the title relative to the chart. One of `"top"` (the default), `"bottom"`, `"left"`, or `"right"`.'},style:{anyOf:[{type:"string"},{items:{type:"string"},type:"array"}],description:'A [mark style property](config.html#style) to apply to the title text mark.\n\n__Default value:__ `"group-title"`.'},text:{description:"The title text.",type:"string"}},required:["text"],type:"object"},TopLevelFacetedUnitSpec:{additionalProperties:!1,properties:{$schema:{description:"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",format:"uri",type:"string"},autoResize:{description:"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\n\n__Default value__: `false`",type:"boolean"},background:{description:"CSS color property to use as the background of visualization.\n\n__Default value:__ none (transparent)",type:"string"},config:{$ref:"#/definitions/Config",description:"Vega-Lite configuration object. This property can only be defined at the top-level of a specification."},data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},encoding:{$ref:"#/definitions/EncodingWithFacet",description:"A key-value mapping between encoding channels and definition of fields."},height:{description:"The height of a visualization.\n\n__Default value:__\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\n\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"},mark:{$ref:"#/definitions/AnyMark",description:'A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`, `"line"`,\n`"area"`, `"point"`, `"rule"`, and `"text"`) or a [mark definition object](mark.html#mark-def).'},name:{description:"Name of the visualization for later reference.",type:"string"},padding:{$ref:"#/definitions/Padding",description:'The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\nIf an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`'},selection:{additionalProperties:{$ref:"#/definitions/SelectionDef"},description:"A key-value mapping between selection names and definitions.",type:"object"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"},width:{description:"The width of a visualization.\n\n__Default value:__ This will be determined by the following rules:\n\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\n\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"}},required:["encoding","mark"],type:"object"},TopLevelFacetedSpec:{additionalProperties:!1,properties:{$schema:{description:"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",format:"uri",type:"string"},autoResize:{description:"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\n\n__Default value__: `false`",type:"boolean"},background:{description:"CSS color property to use as the background of visualization.\n\n__Default value:__ none (transparent)",type:"string"},config:{$ref:"#/definitions/Config",description:"Vega-Lite configuration object. This property can only be defined at the top-level of a specification."},data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},facet:{$ref:"#/definitions/Facet"},name:{description:"Name of the visualization for later reference.",type:"string"},padding:{$ref:"#/definitions/Padding",description:'The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\nIf an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`'},resolve:{$ref:"#/definitions/Resolve"},spec:{anyOf:[{$ref:"#/definitions/LayerSpec"},{$ref:"#/definitions/CompositeUnitSpec"}]},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"}},required:["facet","spec"],type:"object"},TopLevelHConcatSpec:{additionalProperties:!1,properties:{$schema:{description:"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",format:"uri",type:"string"},autoResize:{description:"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\n\n__Default value__: `false`",type:"boolean"},background:{description:"CSS color property to use as the background of visualization.\n\n__Default value:__ none (transparent)",type:"string"},config:{$ref:"#/definitions/Config",description:"Vega-Lite configuration object. This property can only be defined at the top-level of a specification."},data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},hconcat:{items:{$ref:"#/definitions/Spec"},type:"array"},name:{description:"Name of the visualization for later reference.",type:"string"},padding:{$ref:"#/definitions/Padding",description:'The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\nIf an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`'},resolve:{$ref:"#/definitions/Resolve"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"}},required:["hconcat"],type:"object"},TopLevelLayerSpec:{additionalProperties:!1,properties:{$schema:{description:"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",format:"uri",type:"string"},autoResize:{description:"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\n\n__Default value__: `false`",type:"boolean"},background:{description:"CSS color property to use as the background of visualization.\n\n__Default value:__ none (transparent)",type:"string"},config:{$ref:"#/definitions/Config",description:"Vega-Lite configuration object. This property can only be defined at the top-level of a specification."},data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},height:{description:"The height of a visualization.\n\n__Default value:__\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\n\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"},layer:{description:"Layer or single view specifications to be layered.\n\n__Note__: Specifications inside `layer` cannot use `row` and `column` channels as layering facet specifications is not allowed.",items:{anyOf:[{$ref:"#/definitions/LayerSpec"},{$ref:"#/definitions/CompositeUnitSpec"}]},type:"array"},name:{description:"Name of the visualization for later reference.",type:"string"},padding:{$ref:"#/definitions/Padding",description:'The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\nIf an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`'},resolve:{$ref:"#/definitions/Resolve"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"},width:{description:"The width of a visualization.\n\n__Default value:__ This will be determined by the following rules:\n\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\n\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\n\n__See also:__ The documentation for [width and height](size.html) contains more examples.",type:"number"}},required:["layer"],type:"object"},TopLevelRepeatSpec:{additionalProperties:!1,properties:{$schema:{description:"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",format:"uri",type:"string"},autoResize:{description:"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\n\n__Default value__: `false`",type:"boolean"},background:{description:"CSS color property to use as the background of visualization.\n\n__Default value:__ none (transparent)",type:"string"},config:{$ref:"#/definitions/Config",description:"Vega-Lite configuration object. This property can only be defined at the top-level of a specification."},data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},name:{description:"Name of the visualization for later reference.",type:"string"},padding:{$ref:"#/definitions/Padding",description:'The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\nIf an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`'},repeat:{$ref:"#/definitions/Repeat"},resolve:{$ref:"#/definitions/Resolve"},spec:{$ref:"#/definitions/Spec"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"}},required:["repeat","spec"],type:"object"},TopLevelVConcatSpec:{additionalProperties:!1,properties:{$schema:{description:"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.",format:"uri",type:"string"},autoResize:{description:"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\n\n__Default value__: `false`",type:"boolean"},background:{description:"CSS color property to use as the background of visualization.\n\n__Default value:__ none (transparent)",type:"string"},config:{$ref:"#/definitions/Config",description:"Vega-Lite configuration object. This property can only be defined at the top-level of a specification."},data:{$ref:"#/definitions/Data",description:"An object describing the data source"},description:{description:"An optional description of this mark for commenting purpose.",type:"string"},name:{description:"Name of the visualization for later reference.",type:"string"},padding:{$ref:"#/definitions/Padding",description:'The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\nIf an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`'},resolve:{$ref:"#/definitions/Resolve"},title:{anyOf:[{type:"string"},{$ref:"#/definitions/TitleParams"}],description:"Title for the plot."},transform:{description:"An array of data transformations such as filter and new field calculation.",items:{$ref:"#/definitions/Transform"},type:"array"},vconcat:{items:{$ref:"#/definitions/Spec"},type:"array"}},required:["vconcat"],type:"object"},TopLevelExtendedSpec:{anyOf:[{$ref:"#/definitions/TopLevelFacetedUnitSpec"},{$ref:"#/definitions/TopLevelLayerSpec"},{$ref:"#/definitions/TopLevelFacetedSpec"},{$ref:"#/definitions/TopLevelRepeatSpec"},{$ref:"#/definitions/TopLevelVConcatSpec"},{$ref:"#/definitions/TopLevelHConcatSpec"}]},TopLevelProperties:{additionalProperties:!1,properties:{autoResize:{description:"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\n\n__Default value__: `false`",type:"boolean"},background:{description:"CSS color property to use as the background of visualization.\n\n__Default value:__ none (transparent)",type:"string"},padding:{$ref:"#/definitions/Padding",description:'The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\nIf an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization.\n\n__Default value__: `5`'}},type:"object"},Transform:{anyOf:[{$ref:"#/definitions/FilterTransform"},{$ref:"#/definitions/CalculateTransform"},{$ref:"#/definitions/LookupTransform"},{$ref:"#/definitions/BinTransform"},{$ref:"#/definitions/TimeUnitTransform"},{$ref:"#/definitions/SummarizeTransform"}]},Type:{description:"Constants and utilities for data type \n Data type based on level of measurement ",enum:["quantitative","ordinal","temporal","nominal"],type:"string"},UrlData:{additionalProperties:!1,properties:{format:{$ref:"#/definitions/DataUrlFormat",description:"An object that specifies the format for parsing the data file."},url:{description:"An URL from which to load the data set. Use the `format.type` property\nto ensure the loaded data is correctly parsed.",type:"string"}},required:["url"],type:"object"},UtcMultiTimeUnit:{enum:["utcyearquarter","utcyearquartermonth","utcyearmonth","utcyearmonthdate","utcyearmonthdatehours","utcyearmonthdatehoursminutes","utcyearmonthdatehoursminutesseconds","utcquartermonth","utcmonthdate","utchoursminutes","utchoursminutesseconds","utcminutesseconds","utcsecondsmilliseconds"],type:"string"},UtcSingleTimeUnit:{enum:["utcyear","utcquarter","utcmonth","utcday","utcdate","utchours","utcminutes","utcseconds","utcmilliseconds"],type:"string"},VLOnlyConfig:{additionalProperties:!1,properties:{countTitle:{description:"Default axis and legend title for count fields.\n\n__Default value:__ `'Number of Records'`.",type:"string"},invalidValues:{description:'Defines how Vega-Lite should handle invalid values (`null` and `NaN`).\n- If set to `"filter"` (default), all data items with null values are filtered.\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.',enum:["filter"],type:"string"},numberFormat:{description:'D3 Number format for axis labels and text tables. For example "s" for SI units. Use [D3\'s number format pattern](https://github.com/d3/d3-format#locale_format).',type:"string"},scale:{$ref:"#/definitions/ScaleConfig",description:"Scale configuration determines default properties for all [scales](scale.html). For a full list of scale configuration options, please see the [corresponding section of the scale documentation](scale.html#config)."},selection:{$ref:"#/definitions/SelectionConfig",description:"An object hash for defining default properties for each type of selections. "},stack:{$ref:"#/definitions/StackOffset",description:"Default stack offset for stackable mark. "},timeFormat:{description:"Default datetime format for axis and legend labels. The format can be set directly on each axis and legend. Use [D3's time format pattern](https://github.com/d3/d3-time-format#locale_format).\n\n__Default value:__ `'%b %d, %Y'`.",type:"string"},view:{$ref:"#/definitions/ViewConfig",description:"Default properties for [single view plots](spec.html#single). "}},type:"object"},ValueDef:{additionalProperties:!1,description:"Definition object for a constant value of an encoding channel.",properties:{value:{description:"A constant value in visual domain.",type:["number","string","boolean"]}},required:["value"],type:"object"},VerticalAlign:{enum:["top","middle","bottom"],type:"string"},VgAxisBase:{additionalProperties:!1,description:"Base object for Vega's Axis and Axis Config.\nAll of these properties are both properties of Vega's Axis and Axis Config.",properties:{domain:{description:"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\n\n__Default value:__ `true`",type:"boolean"},grid:{description:"A boolean flag indicating if grid lines should be included as part of the axis\n\n__Default value:__ `true` for [continuous scales](scale.html#continuous) that are not binned; otherwise, `false`.",type:"boolean"},labelAngle:{description:"The rotation angle of the axis labels.\n\n__Default value:__ `-90` for nominal, ordinal, temporal, and binned fields; `0` otherwise.",maximum:360,minimum:-360,type:"number"},labelOverlap:{anyOf:[{type:"boolean"},{enum:["parity"],type:"string"},{enum:["greedy"],type:"string"}],description:'The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `"greedy"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes).\n\n__Default value:__ `true` for non-nominal fields with non-log scales; `"greedy"` for log scales; otherwise `false`.'},labelPadding:{description:"The padding, in pixels, between axis and text labels.",type:"number"},labels:{description:"A boolean flag indicating if labels should be included as part of the axis.\n\n__Default value:__ `true`.",type:"boolean"},maxExtent:{description:"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\n\n__Default value:__ `undefined`.",type:"number"},minExtent:{description:"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\n\n__Default value:__ `30` for y-axis; `undefined` for x-axis.",type:"number"},tickSize:{description:"The size in pixels of axis ticks.",minimum:0,type:"number"},ticks:{description:"Boolean value that determines whether the axis should include ticks.",type:"boolean"},titleAlign:{description:"Horizontal text alignment of axis titles.",type:"string"},titleAngle:{description:"Angle in degrees of axis titles.",type:"number"},titleMaxLength:{description:"Max length for axis title if the title is automatically generated from the field's description.",type:"number"},titlePadding:{description:"The padding, in pixels, between title and axis.",type:"number"}},type:"object"},VgAxisConfig:{additionalProperties:!1,properties:{bandPosition:{description:"An interpolation fraction indicating where, for `band` scales, axis ticks should be positioned. A value of `0` places ticks at the left edge of their bands. A value of `0.5` places ticks in the middle of their bands.",type:"number"},domain:{description:"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\n\n__Default value:__ `true`",type:"boolean"},domainColor:{description:"Color of axis domain line.\n\n__Default value:__ (none, using Vega default).",type:"string"},domainWidth:{description:"Stroke width of axis domain line\n\n__Default value:__ (none, using Vega default).",type:"number"},grid:{description:"A boolean flag indicating if grid lines should be included as part of the axis\n\n__Default value:__ `true` for [continuous scales](scale.html#continuous) that are not binned; otherwise, `false`.",type:"boolean"},gridColor:{description:"Color of gridlines.",type:"string"},gridDash:{description:"The offset (in pixels) into which to begin drawing with the grid dash array.",items:{type:"number"},minimum:0,type:"array"},gridOpacity:{description:"The stroke opacity of grid (value between [0,1])\n\n__Default value:__ (`1` by default)",maximum:1,minimum:0,type:"number"},gridWidth:{description:"The grid width, in pixels.",minimum:0,type:"number"},labelAngle:{description:"The rotation angle of the axis labels.\n\n__Default value:__ `-90` for nominal, ordinal, temporal, and binned fields; `0` otherwise.",maximum:360,minimum:-360,type:"number"},labelColor:{description:"The color of the tick label, can be in hex color code or regular color name.",type:"string"},labelFont:{description:"The font of the tick label.",type:"string"},labelFontSize:{description:"The font size of the label, in pixels.",minimum:0,type:"number"},labelLimit:{description:"Maximum allowed pixel width of axis tick labels.",type:"number"},labelOverlap:{anyOf:[{type:"boolean"},{enum:["parity"],type:"string"},{enum:["greedy"],type:"string"}],description:'The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `"greedy"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes).\n\n__Default value:__ `true` for non-nominal fields with non-log scales; `"greedy"` for log scales; otherwise `false`.'},labelPadding:{description:"The padding, in pixels, between axis and text labels.",type:"number"},labels:{description:"A boolean flag indicating if labels should be included as part of the axis.\n\n__Default value:__ `true`.",type:"boolean"},maxExtent:{description:"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\n\n__Default value:__ `undefined`.",type:"number"},minExtent:{description:"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\n\n__Default value:__ `30` for y-axis; `undefined` for x-axis.",type:"number"},tickColor:{description:"The color of the axis's tick.",type:"string"},tickRound:{description:"Boolean flag indicating if pixel position values should be rounded to the nearest integer.",type:"boolean"},tickSize:{description:"The size in pixels of axis ticks.",minimum:0,type:"number"},tickWidth:{description:"The width, in pixels, of ticks.",minimum:0,type:"number"},ticks:{description:"Boolean value that determines whether the axis should include ticks.",type:"boolean"},titleAlign:{description:"Horizontal text alignment of axis titles.",type:"string"},titleAngle:{description:"Angle in degrees of axis titles.",type:"number"},titleBaseline:{description:"Vertical text baseline for axis titles.",type:"string"},titleColor:{description:"Color of the title, can be in hex color code or regular color name.",type:"string"},titleFont:{description:'Font of the title. (e.g., `"Helvetica Neue"`).',type:"string"},titleFontSize:{description:"Font size of the title.",minimum:0,type:"number"},titleFontWeight:{description:'Font weight of the title. (e.g., `"bold"`).',type:["string","number"]},titleLimit:{description:"Maximum allowed pixel width of axis titles.",type:"number"},titleMaxLength:{description:"Max length for axis title if the title is automatically generated from the field's description.",type:"number"},titlePadding:{description:"The padding, in pixels, between title and axis.",type:"number"},titleX:{description:"X-coordinate of the axis title relative to the axis group.",type:"number"},titleY:{description:"Y-coordinate of the axis title relative to the axis group.",type:"number"}},type:"object"},VgBinding:{anyOf:[{$ref:"#/definitions/VgCheckboxBinding"},{$ref:"#/definitions/VgRadioBinding"},{$ref:"#/definitions/VgSelectBinding"},{$ref:"#/definitions/VgRangeBinding"},{$ref:"#/definitions/VgGenericBinding"}]},VgCheckboxBinding:{additionalProperties:!1,properties:{element:{type:"string"},input:{enum:["checkbox"],type:"string"}},required:["input"],type:"object"},VgEventStream:{},VgGenericBinding:{additionalProperties:!1,properties:{element:{type:"string"},input:{type:"string"}},required:["input"],type:"object"},VgLegendBase:{additionalProperties:!1,properties:{entryPadding:{description:"Padding (in pixels) between legend entries in a symbol legend.",type:"number"},fillColor:{description:"Background fill color for the full legend.",type:"string"},offset:{description:"The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle.\n\n__Default value:__ `0`",type:"number"},orient:{$ref:"#/definitions/LegendOrient",description:'The orientation of the legend, which determines how the legend is positioned within the scene. One of "left", "right", "top-left", "top-right", "bottom-left", "bottom-right", "none".\n\n__Default value:__ `"right"`'},padding:{description:"The padding, in pixels, between the legend and axis.",type:"number"},titleAlign:{description:"Horizontal text alignment for legend titles.",type:"string"}},type:"object"},VgLegendConfig:{additionalProperties:!1,properties:{cornerRadius:{description:"Corner radius for the full legend.",type:"number"},entryPadding:{description:"Padding (in pixels) between legend entries in a symbol legend.",type:"number"},fillColor:{description:"Background fill color for the full legend.",type:"string"},gradientHeight:{description:"The height of the gradient, in pixels.",minimum:0,type:"number"},gradientLabelBaseline:{description:"Text baseline for color ramp gradient labels.",type:"string"},gradientLabelLimit:{description:"The maximum allowed length in pixels of color ramp gradient labels.",type:"number"},gradientLabelOffset:{description:"Vertical offset in pixels for color ramp gradient labels.",type:"number"},gradientStrokeColor:{description:"The color of the gradient stroke, can be in hex color code or regular color name.",type:"string"},gradientStrokeWidth:{description:"The width of the gradient stroke, in pixels.",minimum:0,type:"number"},gradientWidth:{description:"The width of the gradient, in pixels.",minimum:0,type:"number"},labelAlign:{description:"The alignment of the legend label, can be left, middle or right.",type:"string"},labelBaseline:{description:"The position of the baseline of legend label, can be top, middle or bottom.",type:"string"},labelColor:{description:"The color of the legend label, can be in hex color code or regular color name.",type:"string"},labelFont:{description:"The font of the legend label.",type:"string"},labelFontSize:{description:"The font size of legend label.\n\n__Default value:__ `10`.",minimum:0,type:"number"},labelLimit:{description:"Maximum allowed pixel width of axis tick labels.",type:"number"},labelOffset:{description:"The offset of the legend label.",minimum:0,type:"number"},offset:{description:"The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle.\n\n__Default value:__ `0`",type:"number"},orient:{$ref:"#/definitions/LegendOrient",description:'The orientation of the legend, which determines how the legend is positioned within the scene. One of "left", "right", "top-left", "top-right", "bottom-left", "bottom-right", "none".\n\n__Default value:__ `"right"`'},padding:{description:"The padding, in pixels, between the legend and axis.",type:"number"},strokeColor:{description:"Border stroke color for the full legend.",type:"string"},strokeDash:{description:"Border stroke dash pattern for the full legend.",items:{type:"number"},type:"array"},strokeWidth:{description:"Border stroke width for the full legend.",type:"number"},symbolColor:{description:"The color of the legend symbol,",type:"string"},symbolSize:{description:"The size of the legend symbol, in pixels.",minimum:0,type:"number"},symbolStrokeWidth:{description:"The width of the symbol's stroke.",minimum:0,type:"number"},symbolType:{description:'Default shape type (such as "circle") for legend symbols.',type:"string"},titleAlign:{description:"Horizontal text alignment for legend titles.",type:"string"},titleBaseline:{description:"Optional mark property definitions for custom legend styling. \n Vertical text baseline for legend titles.",type:"string"},titleColor:{description:"The color of the legend title, can be in hex color code or regular color name.",type:"string"},titleFont:{description:"The font of the legend title.",type:"string"},titleFontSize:{description:"The font size of the legend title.",type:"number"},titleFontWeight:{description:"The font weight of the legend title.",type:["string","number"]},titleLimit:{description:"Maximum allowed pixel width of axis titles.",type:"number"},titlePadding:{description:"The padding, in pixels, between title and legend.",type:"number"}},type:"object"},VgMarkConfig:{additionalProperties:!1,properties:{align:{$ref:"#/definitions/HorizontalAlign",description:'The horizontal alignment of the text. One of `"left"`, `"right"`, `"center"`.'},angle:{description:"The rotation angle of the text, in degrees.",maximum:360,minimum:0,type:"number"},baseline:{$ref:"#/definitions/VerticalAlign",description:'The vertical alignment of the text. One of `"top"`, `"middle"`, `"bottom"`.\n\n__Default value:__ `"middle"`'},dx:{description:"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},dy:{description:"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.",type:"number"},fill:{description:"Default Fill Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},fillOpacity:{description:"The fill opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},font:{description:'The typeface to set the text in (e.g., `"Helvetica Neue"`).',minimum:0,type:"string"},fontSize:{description:"The font size, in pixels.",minimum:0,type:"number"},fontStyle:{$ref:"#/definitions/FontStyle",description:'The font style (e.g., `"italic"`).'},fontWeight:{anyOf:[{$ref:"#/definitions/FontWeight"},{$ref:"#/definitions/FontWeightNumber"}],description:'The font weight (e.g., `"bold"`).'},interpolate:{$ref:"#/definitions/Interpolate",description:'The line interpolation method to use for line and area marks. One of the following:\n- `"linear"`: piecewise linear segments, as in a polyline.\n- `"linear-closed"`: close the linear segments to form a polygon.\n- `"step"`: alternate between horizontal and vertical segments, as in a step function.\n- `"step-before"`: alternate between vertical and horizontal segments, as in a step function.\n- `"step-after"`: alternate between horizontal and vertical segments, as in a step function.\n- `"basis"`: a B-spline, with control point duplication on the ends.\n- `"basis-open"`: an open B-spline; may not intersect the start or end.\n- `"basis-closed"`: a closed B-spline, as in a loop.\n- `"cardinal"`: a Cardinal spline, with control point duplication on the ends.\n- `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\n- `"cardinal-closed"`: a closed Cardinal spline, as in a loop.\n- `"bundle"`: equivalent to basis, except the tension parameter is used to straighten the spline.\n- `"monotone"`: cubic interpolation that preserves monotonicity in y.'},limit:{description:"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.",type:"number"},opacity:{description:"The overall opacity (value between [0,1]).\n\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.",maximum:1,minimum:0,type:"number"},orient:{$ref:"#/definitions/Orient",description:"The orientation of a non-stacked bar, tick, area, and line charts.\nThe value is either horizontal (default) or vertical.\n- For bar, rule and tick, this determines whether the size of the bar and tick\nshould be applied to x or y dimension.\n- For area, this property determines the orient property of the Vega output.\n- For line, this property determines the sort order of the points in the line\nif `config.sortLineBy` is not specified.\nFor stacked charts, this is always determined by the orientation of the stack;\ntherefore explicitly specified value will be ignored."},radius:{description:"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.",minimum:0,type:"number"},shape:{description:'The default symbol shape to use. One of: `"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, or `"triangle-down"`, or a custom SVG path.\n\n__Default value:__ `"circle"`',type:"string"},size:{description:"The pixel area each the point/circle/square.\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\n\n__Default value:__ `30`",minimum:0,type:"number"},stroke:{description:"Default Stroke Color. This has higher precedence than config.color\n\n__Default value:__ (None)",type:"string"},strokeDash:{description:"An array of alternating stroke, space lengths for creating dashed or dotted lines.",items:{type:"number"},type:"array"},strokeDashOffset:{description:"The offset (in pixels) into which to begin drawing with the stroke dash array.",type:"number"},strokeOpacity:{description:"The stroke opacity (value between [0,1]).\n\n__Default value:__ `1`",maximum:1,minimum:0,type:"number"},strokeWidth:{description:"The stroke width, in pixels.",minimum:0,type:"number"},tension:{description:"Depending on the interpolation type, sets the tension parameter (for line and area marks).",maximum:1,minimum:0,type:"number"},text:{description:"Placeholder text if the `text` channel is not specified",type:"string"},theta:{description:'Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating "north".',type:"number"}},type:"object"},VgRadioBinding:{additionalProperties:!1,properties:{element:{type:"string"},input:{enum:["radio"],type:"string"},options:{items:{type:"string"},type:"array"}},required:["input","options"],type:"object"},VgRangeBinding:{additionalProperties:!1,properties:{element:{type:"string"},input:{enum:["range"],type:"string"},max:{type:"number"},min:{type:"number"},step:{type:"number"}},required:["input"],type:"object"},VgScheme:{additionalProperties:!1,properties:{count:{type:"number"},extent:{items:{type:"number"},type:"array"},scheme:{type:"string"}},required:["scheme"],type:"object"},VgSelectBinding:{additionalProperties:!1,properties:{element:{type:"string"},input:{enum:["select"],type:"string"},options:{items:{type:"string"},type:"array"}},required:["input","options"],type:"object"},VgTitleConfig:{additionalProperties:!1,properties:{anchor:{$ref:"#/definitions/Anchor",description:'The anchor position for placing the title. One of `"start"`, `"middle"`, or `"end"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title.\n\n__Default value:__ `"middle"` for [single](spec.html) and [layered](layer.html) views.\n`"start"` for other composite views.\n\n__Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](spec.html) and [layered](layer.html) views. For other composite views, `anchor` is always `"start"`.'},angle:{description:"Angle in degrees of title text.",type:"number"},baseline:{$ref:"#/definitions/VerticalAlign",description:"Vertical text baseline for title text."},color:{description:"Text color for title text.",type:"string"},font:{description:"Font name for title text.",type:"string"},fontSize:{description:"Font size in pixels for title text.\n\n__Default value:__ `10`.",minimum:0,type:"number"},fontWeight:{anyOf:[{$ref:"#/definitions/FontWeight"},{$ref:"#/definitions/FontWeightNumber"}],description:"Font weight for title text."},limit:{description:"The maximum allowed length in pixels of legend labels.",minimum:0,type:"number"},offset:{description:"Offset in pixels of the title from the chart body and axes.",type:"number"},orient:{$ref:"#/definitions/TitleOrient",description:'Default title orientation ("top", "bottom", "left", or "right")'}},type:"object"},ViewConfig:{additionalProperties:!1,properties:{clip:{description:"Whether the view should be clipped.",type:"boolean"},fill:{description:"The fill color.\n\n__Default value:__ (none)",type:"string"},fillOpacity:{description:"The fill opacity (value between [0,1]).\n\n__Default value:__ (none)",type:"number"},height:{description:"The default height of the single plot or each plot in a trellis plot when the visualization has a continuous (non-ordinal) y-scale with `rangeStep` = `null`.\n\n__Default value:__ `200`",type:"number"},stroke:{description:"The stroke color.\n\n__Default value:__ (none)",type:"string"},strokeDash:{description:"An array of alternating stroke, space lengths for creating dashed or dotted lines.\n\n__Default value:__ (none)",items:{type:"number"},type:"array"},strokeDashOffset:{description:"The offset (in pixels) into which to begin drawing with the stroke dash array.\n\n__Default value:__ (none)",type:"number"},strokeOpacity:{description:"The stroke opacity (value between [0,1]).\n\n__Default value:__ (none)",type:"number"},strokeWidth:{description:"The stroke width, in pixels.\n\n__Default value:__ (none)",type:"number"},width:{description:"The default width of the single plot or each plot in a trellis plot when the visualization has a continuous (non-ordinal) x-scale or ordinal x-scale with `rangeStep` = `null`.\n\n__Default value:__ `200`",type:"number"}},type:"object"},VlOnlyGuideConfig:{additionalProperties:!1,properties:{shortTimeLabels:{description:"Whether month names and weekday names should be abbreviated.\n\n__Default value:__ `false`",type:"boolean"}},type:"object"}}}},function(e,t,n){"use strict";function r(e,t,n){function r(t){var r=new o.default(t);n.call(e,r)}return e.addEventListener?(e.addEventListener(t,r,!1),{remove:function(){e.removeEventListener(t,r,!1)}}):e.attachEvent?(e.attachEvent("on"+t,r),{remove:function(){e.detachEvent("on"+t,r)}}):void 0}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(309),o=function(e){return e&&e.__esModule?e:{default:e}}(i);e.exports=t.default},function(e,t,n){"use strict";function r(e){i.copy(e,this)}var i=n(67);e.exports=r},function(e,t,n){"use strict";e.exports=function(e,t,n){var r,i,o=" ",a=e.level,s=e.dataLevel,l=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,d=!e.opts.allErrors,f="data"+(s||""),p=e.opts.$data&&l&&l.$data;p?(o+=" var schema"+a+" = "+e.util.getData(l.$data,s,e.dataPathArr)+"; ",i="schema"+a):i=l;var h="maximum"==t,m=h?"exclusiveMaximum":"exclusiveMinimum",g=e.schema[m],y=e.opts.$data&&g&&g.$data,v=h?"<":">",b=h?">":"<",r=void 0;if(y){var _=e.util.getData(g.$data,s,e.dataPathArr),E="exclusive"+a,S="exclType"+a,O="exclIsNumber"+a,w="op"+a,T="' + "+w+" + '";o+=" var schemaExcl"+a+" = "+_+"; ",_="schemaExcl"+a,o+=" var "+E+"; var "+S+" = typeof "+_+"; if ("+S+" != 'boolean' && "+S+" != 'undefined' && "+S+" != 'number') { ";var r=m,P=P||[];P.push(o),o="",!1!==e.createErrors?(o+=" { keyword: '"+(r||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: {} ",!1!==e.opts.messages&&(o+=" , message: '"+m+" should be boolean' "),e.opts.verbose&&(o+=" , schema: validate.schema"+u+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),o+=" } "):o+=" {} ";var A=o;o=P.pop(),!e.compositeRule&&d?e.async?o+=" throw new ValidationError(["+A+"]); ":o+=" validate.errors = ["+A+"]; return false; ":o+=" var err = "+A+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",o+=" } else if ( ",p&&(o+=" ("+i+" !== undefined && typeof "+i+" != 'number') || "),o+=" "+S+" == 'number' ? ( ("+E+" = "+i+" === undefined || "+_+" "+v+"= "+i+") ? "+f+" "+b+"= "+_+" : "+f+" "+b+" "+i+" ) : ( ("+E+" = "+_+" === true) ? "+f+" "+b+"= "+i+" : "+f+" "+b+" "+i+" ) || "+f+" !== "+f+") { var op"+a+" = "+E+" ? '"+v+"' : '"+v+"=';"}else{var O="number"==typeof g,T=v;if(O&&p){var w="'"+T+"'";o+=" if ( ",p&&(o+=" ("+i+" !== undefined && typeof "+i+" != 'number') || "),o+=" ( "+i+" === undefined || "+g+" "+v+"= "+i+" ? "+f+" "+b+"= "+g+" : "+f+" "+b+" "+i+" ) || "+f+" !== "+f+") { "}else{O&&void 0===l?(E=!0,r=m,c=e.errSchemaPath+"/"+m,i=g,b+="="):(O&&(i=Math[h?"min":"max"](g,l)),g===(!O||i)?(E=!0,r=m,c=e.errSchemaPath+"/"+m,b+="="):(E=!1,T+="="));var w="'"+T+"'";o+=" if ( ",p&&(o+=" ("+i+" !== undefined && typeof "+i+" != 'number') || "),o+=" "+f+" "+b+" "+i+" || "+f+" !== "+f+") { "}}r=r||t;var P=P||[];P.push(o),o="",!1!==e.createErrors?(o+=" { keyword: '"+(r||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { comparison: "+w+", limit: "+i+", exclusive: "+E+" } ",!1!==e.opts.messages&&(o+=" , message: 'should be "+T+" ",o+=p?"' + "+i:i+"'"),e.opts.verbose&&(o+=" , schema: ",o+=p?"validate.schema"+u:""+l,o+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),o+=" } "):o+=" {} ";var A=o;return o=P.pop(),!e.compositeRule&&d?e.async?o+=" throw new ValidationError(["+A+"]); ":o+=" validate.errors = ["+A+"]; return false; ":o+=" var err = "+A+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",o+=" } ",d&&(o+=" else { "),o}},function(e,t,n){"use strict";e.exports=function(e,t,n){var r,i,o=" ",a=e.level,s=e.dataLevel,l=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,d=!e.opts.allErrors,f="data"+(s||""),p=e.opts.$data&&l&&l.$data;p?(o+=" var schema"+a+" = "+e.util.getData(l.$data,s,e.dataPathArr)+"; ",i="schema"+a):i=l;var h="maxItems"==t?">":"<";o+="if ( ",p&&(o+=" ("+i+" !== undefined && typeof "+i+" != 'number') || "),o+=" "+f+".length "+h+" "+i+") { ";var r=t,m=m||[];m.push(o),o="",!1!==e.createErrors?(o+=" { keyword: '"+(r||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+i+" } ",!1!==e.opts.messages&&(o+=" , message: 'should NOT have ",o+="maxItems"==t?"more":"less",o+=" than ",o+=p?"' + "+i+" + '":""+l,o+=" items' "),e.opts.verbose&&(o+=" , schema: ",o+=p?"validate.schema"+u:""+l,o+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),o+=" } "):o+=" {} ";var g=o;return o=m.pop(),!e.compositeRule&&d?e.async?o+=" throw new ValidationError(["+g+"]); ":o+=" validate.errors = ["+g+"]; return false; ":o+=" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",o+="} ",d&&(o+=" else { "),o}},function(e,t,n){"use strict";e.exports=function(e,t,n){var r,i,o=" ",a=e.level,s=e.dataLevel,l=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,d=!e.opts.allErrors,f="data"+(s||""),p=e.opts.$data&&l&&l.$data;p?(o+=" var schema"+a+" = "+e.util.getData(l.$data,s,e.dataPathArr)+"; ",i="schema"+a):i=l;var h="maxLength"==t?">":"<";o+="if ( ",p&&(o+=" ("+i+" !== undefined && typeof "+i+" != 'number') || "),!1===e.opts.unicode?o+=" "+f+".length ":o+=" ucs2length("+f+") ",o+=" "+h+" "+i+") { ";var r=t,m=m||[];m.push(o),o="",!1!==e.createErrors?(o+=" { keyword: '"+(r||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+i+" } ",!1!==e.opts.messages&&(o+=" , message: 'should NOT be ",o+="maxLength"==t?"longer":"shorter",o+=" than ",o+=p?"' + "+i+" + '":""+l,o+=" characters' "),e.opts.verbose&&(o+=" , schema: ",o+=p?"validate.schema"+u:""+l,o+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),o+=" } "):o+=" {} ";var g=o;return o=m.pop(),!e.compositeRule&&d?e.async?o+=" throw new ValidationError(["+g+"]); ":o+=" validate.errors = ["+g+"]; return false; ":o+=" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",o+="} ",d&&(o+=" else { "),o}},function(e,t,n){"use strict";e.exports=function(e,t,n){var r,i,o=" ",a=e.level,s=e.dataLevel,l=e.schema[t],u=e.schemaPath+e.util.getProperty(t),c=e.errSchemaPath+"/"+t,d=!e.opts.allErrors,f="data"+(s||""),p=e.opts.$data&&l&&l.$data;p?(o+=" var schema"+a+" = "+e.util.getData(l.$data,s,e.dataPathArr)+"; ",i="schema"+a):i=l;var h="maxProperties"==t?">":"<";o+="if ( ",p&&(o+=" ("+i+" !== undefined && typeof "+i+" != 'number') || "),o+=" Object.keys("+f+").length "+h+" "+i+") { ";var r=t,m=m||[];m.push(o),o="",!1!==e.createErrors?(o+=" { keyword: '"+(r||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(c)+" , params: { limit: "+i+" } ",!1!==e.opts.messages&&(o+=" , message: 'should NOT have ",o+="maxProperties"==t?"more":"less",o+=" than ",o+=p?"' + "+i+" + '":""+l,o+=" properties' "),e.opts.verbose&&(o+=" , schema: ",o+=p?"validate.schema"+u:""+l,o+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+f+" "),o+=" } "):o+=" {} ";var g=o;return o=m.pop(),!e.compositeRule&&d?e.async?o+=" throw new ValidationError(["+g+"]); ":o+=" validate.errors = ["+g+"]; return false; ":o+=" var err = "+g+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",o+="} ",d&&(o+=" else { "),o}},function(e,t,n){"use strict";e.exports=function(e,t,n){function r(e){for(var t=e.rules,n=0;n2&&(t=d.call(arguments,1)),n(t)})})}function o(e){return Promise.all(e.map(r,this))}function a(e){for(var t=new e.constructor,n=Object.keys(e),i=[],o=0;o"+e}).join(";")+"]"}return e.property}return e}).join(","):e}Object.defineProperty(t,"__esModule",{value:!0});var a=n(32),s=n(99),l=n(18),u=n(48),c=n(13);t.REPLACE_BLANK_FIELDS={"*":""},t.REPLACE_XY_CHANNELS={x:"xy",y:"xy"},t.REPLACE_FACET_CHANNELS={row:"facet",column:"facet"},t.REPLACE_MARK_STYLE_CHANNELS={color:"style",opacity:"style",shape:"style",size:"style"},t.isExtendedGroupBy=r,t.parseGroupBy=i,t.toString=o,t.GROUP_BY_FIELD_TRANSFORM=[l.Property.FIELD,l.Property.TYPE,l.Property.AGGREGATE,l.Property.BIN,l.Property.TIMEUNIT,l.Property.STACK],t.GROUP_BY_ENCODING=t.GROUP_BY_FIELD_TRANSFORM.concat([{property:l.Property.CHANNEL,replace:{x:"xy",y:"xy",color:"style",size:"style",shape:"style",opacity:"style",row:"facet",column:"facet"}}])},function(e,t,n){"use strict";function r(e,t,n){var r=c.reduce(function(r,i){var o=i.getScore(e,t,n);return r.concat(o)},[]);return{score:r.reduce(function(e,t){return e+t.score},0),features:r}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(360),o=n(361),a=n(362),s=n(364),l=n(365),u=n(363),c=[new i.AxisScorer,new o.DimensionScorer,new a.FacetScorer,new u.MarkScorer,new s.SizeChannelScorer,new l.TypeChannelScorer];t.effectiveness=r},function(e,t,n){"use strict";function r(e,t,n){e=i({},l.normalize(e),{config:i({},o.DEFAULT_QUERY_CONFIG,n,e.config)});var r=a.generate(e.spec,t,e.config),c=s.nest(r,e.nest);return{query:e,result:u.rank(c,e,t,0)}}var i=this&&this.__assign||Object.assign||function(e){for(var t,n=1,r=arguments.length;nl;)r(s,n=t[l++])&&(~o(u,n)||u.push(n));return u}},function(e,t,n){var r=n(49),i=n(25),o=n(72);e.exports=function(e,t){var n=(i.Object||{})[e]||Object[e],a={};a[e]=t(n),r(r.S+r.F*o(function(){n(1)}),"Object",a)}},function(e,t,n){e.exports=n(73)},function(e,t,n){var r=n(138),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},function(e,t,n){"use strict";var r=n(400)(!0);n(193)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){"use strict";function r(e){return(0,o.default)(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(437),o=function(e){return e&&e.__esModule?e:{default:e}}(i);e.exports=t.default},function(e,t,n){function r(e,t){if(!t)return e&&e[d]||null;e[d]=t}function i(e){return c.keys(e)}function o(e){return"["+e+"]"}function a(e,t){e=c.array(e),t=c.$(t);var n,r,i;if(e[d]&&(n=t(e[d]),c.isString(n)))return n;for(r=0,i=e.length;!c.isValid(n)&&r1?(!n&&t&&(r.className+=" "+t),h.a.createElement("div",r)):h.a.Children.only(r.children)}}]),t}(p.Component);y.propTypes={children:g.a.any,className:g.a.string,visible:g.a.bool,hiddenClassName:g.a.string},t.a=y},function(e,t,n){"use strict";function r(e,t){return e[0]===t[0]&&e[1]===t[1]}function i(e,t,n){var r=e[t]||{};return l()({},r,n)}function o(e,t,n){var i=n.points;for(var o in e)if(e.hasOwnProperty(o)&&r(e[o].points,i))return t+"-placement-"+o;return""}function a(e,t){this[e]=t}t.b=i,t.a=o,t.c=a;var s=n(17),l=n.n(s)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var r=l.default.unstable_batchedUpdates?function(e){l.default.unstable_batchedUpdates(n,e)}:n;return(0,a.default)(e,t,r)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(177),a=r(o),s=n(24),l=r(s);e.exports=t.default},function(e,t,n){"use strict";function r(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function i(e){var t=Object.getOwnPropertyNames(e);return Object.getOwnPropertySymbols&&(t=t.concat(Object.getOwnPropertySymbols(e))),t.filter(function(t){return o.call(e,t)})}var o=Object.prototype.propertyIsEnumerable;e.exports=Object.assign||function(e,t){for(var n,o,a=r(e),s=1;s=0)&&o(e,!n)}function s(e){return[].slice.call(e.querySelectorAll("*"),0).filter(a)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=s;var l=/input|select|textarea|button|object/},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(546),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=i.default},function(e,t,n){var r,i,o;!function(n,a){i=[t],r=a,void 0!==(o="function"==typeof r?r.apply(t,i):r)&&(e.exports=o)}(0,function(e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.calculateRgba=function(e,t){if("#"===e[0]&&(e=e.slice(1)),3===e.length){var n="";e.split("").forEach(function(e){n+=e,n+=e}),e=n}return"rgba("+e.match(/.{2}/g).map(function(e){return parseInt(e,16)}).join(", ")+", "+t+")"}})},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=0;return(0,a.deepForEach)(e,function(e){e.type===l.default&&t++}),t}function o(e){var t=0;return(0,a.deepForEach)(e,function(e){e.type===c.default&&t++}),t}t.__esModule=!0,t.getTabsCount=i,t.getPanelsCount=o;var a=n(152),s=n(84),l=r(s),u=n(85),c=r(u)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var r=void 0,i=0,o=0,a=!1,u=[],d=e[t];return(0,l.deepForEach)(d,function(e){e.type===f.default&&(e.props&&e.props.children&&"object"===s(e.props.children)&&(0,l.deepForEach)(e.props.children,function(e){return u.push(e)}),a&&(r=new Error("Found multiple 'TabList' components inside 'Tabs'. Only one is allowed.")),a=!0),e.type===c.default?(a&&-1!==u.indexOf(e)||(r=new Error("Found a 'Tab' component outside of the 'TabList' component. 'Tab' components have to be inside the 'TabList' component.")),i++):e.type===h.default&&o++}),r||i===o||(r=new Error("There should be an equal number of 'Tab' and 'TabPanel' in `"+n+"`.Received "+i+" 'Tab' and "+o+" 'TabPanel'.")),r}function o(e,t,n,r,i){var o=e[t],a=i||t,l=null;return o&&"function"!=typeof o?l=new Error("Invalid "+r+" `"+a+"` of type `"+(void 0===o?"undefined":s(o))+"` supplied to `"+n+"`, expected `function`."):null!=e.selectedIndex&&null==o&&(l=new Error("The "+r+" `"+a+"` is marked as required in `"+n+"`, but its value is `undefined` or `null`.\n`onSelect` is required when `selectedIndex` is also set. Not doing so will make the tabs not do anything, as `selectedIndex` indicates that you want to handle the selected tab yourself.\nIf you only want to set the inital tab replace `selectedIndex` with `defaultIndex`.")),l}function a(e,t,n,r,i){var o=e[t],a=i||t,l=null;if(null!=o&&"number"!=typeof o)l=new Error("Invalid "+r+" `"+a+"` of type `"+(void 0===o?"undefined":s(o))+"` supplied to `"+n+"`, expected `number`.");else if(null!=e.defaultIndex&&null!=o)return new Error("The "+r+" `"+a+"` cannot be used together with `defaultIndex` in `"+n+"`.\nEither remove `"+a+"` to let `"+n+"` handle the selected tab internally or remove `defaultIndex` to handle it yourself.");return l}t.__esModule=!0;var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.childrenPropType=i,t.onSelectPropType=o,t.selectedIndexPropType=a;var l=n(152),u=n(84),c=r(u),d=n(105),f=r(d),p=n(85),h=r(p)},function(e,t,n){"use strict";function r(){return"react-tabs-"+o++}function i(){o=0}t.__esModule=!0,t.default=r,t.reset=i;var o=0},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.resetIdCounter=t.Tabs=t.TabPanel=t.TabList=t.Tab=void 0;var i=n(577),o=r(i),a=n(105),s=r(a),l=n(84),u=r(l),c=n(85),d=r(c),f=n(224);t.Tab=u.default,t.TabList=s.default,t.TabPanel=d.default,t.Tabs=o.default,t.resetIdCounter=f.reset},function(e,t,n){(function(e,t){!function(e,n){"use strict";function r(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;ne?i():!0!==t&&(o=setTimeout(r?s:i,void 0===r?e-u:e))}var o,a=0;return"boolean"!=typeof t&&(r=n,n=t,t=void 0),i}},function(e,t,n){"use strict";function r(e){this.type=e}function i(e){switch(e.type){case"ArrayExpression":return e.elements;case"BinaryExpression":case"LogicalExpression":return[e.left,e.right];case"CallExpression":var t=e.arguments.slice();return t.unshift(e.callee),t;case"ConditionalExpression":return[e.test,e.consequent,e.alternate];case"MemberExpression":return[e.object,e.property];case"ObjectExpression":return e.properties;case"Property":return[e.key,e.value];case"UnaryExpression":return[e.argument];case"Identifier":case"Literal":case"RawCode":default:return[]}}t.a=r,r.prototype.visit=function(e){var t,n,r,o=this;if(e(o))return 1;for(t=i(o),n=0,r=t.length;n3&&n.i(r.error)("Too many arguments to clamp function.");var i=t.map(e);return"Math.max("+i[1]+", Math.min("+i[2]+","+i[0]+"))"},now:"Date.now",utc:"Date.UTC",datetime:o,date:i("getDate",o,0),day:i("getDay",o,0),year:i("getFullYear",o,0),month:i("getMonth",o,0),hours:i("getHours",o,0),minutes:i("getMinutes",o,0),seconds:i("getSeconds",o,0),milliseconds:i("getMilliseconds",o,0),time:i("getTime",o,0),timezoneoffset:i("getTimezoneOffset",o,0),utcdate:i("getUTCDate",o,0),utcday:i("getUTCDay",o,0),utcyear:i("getUTCFullYear",o,0),utcmonth:i("getUTCMonth",o,0),utchours:i("getUTCHours",o,0),utcminutes:i("getUTCMinutes",o,0),utcseconds:i("getUTCSeconds",o,0),utcmilliseconds:i("getUTCMilliseconds",o,0),length:i("length",null,-1),indexof:i("indexOf",null),lastindexof:i("lastIndexOf",null),slice:i("slice",null),parseFloat:"parseFloat",parseInt:"parseInt",upper:i("toUpperCase","String",0),lower:i("toLowerCase","String",0),substring:i("substring","String"),replace:i("replace","String"),regexp:"RegExp",test:i("test","RegExp"),if:function(t){t.length<3&&n.i(r.error)("Missing arguments to if function."),t.length>3&&n.i(r.error)("Too many arguments to if function.");var i=t.map(e);return"("+i[0]+"?"+i[1]+":"+i[2]+")"}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AXIS_PROPERTY_TYPE={grid:"grid",labelOverlap:"main",offset:"main",title:"main"},t.AXIS_PROPERTIES=["domain","format","grid","labelPadding","labels","labelOverlap","maxExtent","minExtent","offset","orient","position","tickCount","ticks","tickSize","title","titlePadding","values","zindex"],t.VG_AXIS_PROPERTIES=[].concat(t.AXIS_PROPERTIES,["gridScale"])},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),i=n(9),o=n(23),a=n(2),s=n(38),l=function(e){function t(t){var n=e.call(this)||this;return n.formula=t,n}return r.__extends(t,e),t.prototype.clone=function(){return new t(a.duplicate(this.formula))},t.makeFromEncoding=function(e){var n=e.reduceFieldDef(function(e,t){if(t.timeUnit){var n=i.field(t);e[n]={as:n,timeUnit:t.timeUnit,field:t.field}}return e},{});return 0===a.keys(n).length?null:new t(n)},t.makeFromTransform=function(e){return new t((n={},n[e.field]={as:e.as,timeUnit:e.timeUnit,field:e.field},n));var n},t.prototype.merge=function(e){this.formula=r.__assign({},this.formula,e.formula),e.remove()},t.prototype.producedFields=function(){var e={};return a.vals(this.formula).forEach(function(t){e[t.as]=!0}),e},t.prototype.dependentFields=function(){var e={};return a.vals(this.formula).forEach(function(t){e[t.field]=!0}),e},t.prototype.assemble=function(){return a.vals(this.formula).map(function(e){return{type:"formula",as:e.as,expr:o.fieldExpr(e.timeUnit,e.field)}})},t}(s.DataFlowNode);t.TimeUnitNode=l},function(e,t,n){"use strict";function r(e){m.isUnitModel(e)?e.component.legends=i(e):e.component.legends=l(e)}function i(e){return[c.COLOR,c.SIZE,c.SHAPE,c.OPACITY].reduce(function(t,n){return e.legend(n)&&(t[n]=a(e,n)),t},{})}function o(e,t){switch(t){case c.COLOR:var n=e.scaleName(c.COLOR);return e.markDef.filled?{fill:n}:{stroke:n};case c.SIZE:return{size:e.scaleName(c.SIZE)};case c.SHAPE:return{shape:e.scaleName(c.SHAPE)};case c.OPACITY:return{opacity:e.scaleName(c.OPACITY)}}return null}function a(e,t){var n=e.fieldDef(t),r=e.legend(t),i=new b.LegendComponent({},o(e,t));f.LEGEND_PROPERTIES.forEach(function(n){var o=s(n,r,t,e);if(void 0!==o){var a="values"===n?!!r.values:o===r[n];i.set(n,o,a)}});var a=r.encoding||{},l=["labels","legend","title","symbols","gradient"].reduce(function(r,o){var s=_[o]?_[o](n,a[o],e,t,i):a[o];return void 0!==s&&p.keys(s).length>0&&(r[o]={update:s}),r},{});return p.keys(l).length>0&&i.set("encode",l,!!r.encoding),i}function s(e,t,n,r){var i=r.fieldDef(n);switch(e){case"format":return h.numberFormat(i,t.format,r.config);case"title":return h.getSpecifiedOrDefaultValue(t.title,d.title(i,r.config));case"values":return E.values(t);case"type":return h.getSpecifiedOrDefaultValue(t.type,E.type(i.type,n,r.getScaleComponent(n).get("type")))}return t[e]}function l(e){for(var t=e.component,n=t.legends,i=t.resolve,o=0,a=e.children;o0?Math.min.apply(null,e):t.rangeStep?t.rangeStep:21}Object.defineProperty(t,"__esModule",{value:!0});var f=n(35),p=n(3),h=n(7),m=n(5),g=n(2),y=n(45),v=n(33),b=n(54),_=n(235);t.RANGE_PROPERTIES=["range","rangeStep","scheme"],t.parseScaleRange=r,t.parseRangeForChannel=a,t.defaultRange=l},function(e,t,n){"use strict";function r(e,t,n,r,u){var c=i(t,n,r,u);return a.isScaleChannel(t)?void 0!==e?l.channelSupportScaleType(t,e)?o(e,n)?e:(s.warn(s.message.scaleTypeNotWorkWithFieldDef(e,c)),c):(s.warn(s.message.scaleTypeNotWorkWithChannel(t,e,c)),c):c:null}function i(e,t,n,r){switch(t.type){case"nominal":case"ordinal":if("color"===e||"discrete"===a.rangeType(e))return"shape"===e&&"ordinal"===t.type&&s.warn(s.message.discreteChannelCannotEncode(e,"ordinal")),"ordinal";if(d.contains(["x","y"],e)){if("rect"===n)return"band";if("bar"===n)return"band"}return"point";case"temporal":return"color"===e?"sequential":"discrete"===a.rangeType(e)?(s.warn(s.message.discreteChannelCannotEncode(e,"temporal")),"ordinal"):"time";case"quantitative":return"color"===e?t.bin?"bin-ordinal":"sequential":"discrete"===a.rangeType(e)?(s.warn(s.message.discreteChannelCannotEncode(e,"quantitative")),"ordinal"):t.bin&&"x"!==e&&"y"!==e?"bin-linear":"linear"}throw new Error(s.message.invalidFieldType(t.type))}function o(e,t){var n=t.type;return f.contains([c.Type.ORDINAL,c.Type.NOMINAL],n)?void 0===e||u.hasDiscreteDomain(e):n===c.Type.TEMPORAL?f.contains([l.ScaleType.TIME,l.ScaleType.UTC,l.ScaleType.SEQUENTIAL,void 0],e):n!==c.Type.QUANTITATIVE||(t.bin?f.contains([l.ScaleType.BIN_LINEAR,l.ScaleType.BIN_ORDINAL,l.ScaleType.LINEAR],e):f.contains([l.ScaleType.LOG,l.ScaleType.POW,l.ScaleType.SQRT,l.ScaleType.QUANTILE,l.ScaleType.QUANTIZE,l.ScaleType.LINEAR,l.ScaleType.SEQUENTIAL,void 0],e))}Object.defineProperty(t,"__esModule",{value:!0});var a=n(3),s=n(7),l=n(5),u=n(5),c=n(16),d=n(2),f=n(2);t.scaleType=r,t.fieldDefMatchScaleType=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2),i=n(22),o=n(157),a={predicate:"vlMulti",scaleDomain:"vlMultiDomain",signals:function(e,t){var n=t.project,a=o.default.has(t)?"(item().isVoronoi ? datum.datum : datum)":"datum",s=[],l=n.map(function(e){return r.stringValue(e.channel)}).filter(function(e){return e}).join(", "),u=n.map(function(e){return r.stringValue(e.field)}).join(", "),c=n.map(function(t){var n=t.channel,i=e.fieldDef(n);return i&&i.bin?(s.push(t.field),"["+a+"["+r.stringValue(e.field(n,{}))+"], "+a+"["+r.stringValue(e.field(n,{binSuffix:"end"}))+"]]"):a+"["+r.stringValue(t.field)+"]"}).join(", ");return[{name:t.name+i.TUPLE,value:{},on:[{events:t.events,update:"datum && item().mark.marktype !== 'group' ? {unit: "+i.unitName(e)+", encodings: ["+l+"], fields: ["+u+"], values: ["+c+"]"+(s.length?", "+s.map(function(e){return r.stringValue("bin_"+e)+": 1"}).join(", "):"")+"} : null",force:!0}]}]},modifyExpr:function(e,t){return t.name+i.TUPLE+", "+("global"===t.resolve?"null":"{unit: "+i.unitName(e)+"}")}};t.default=a},function(e,t,n){"use strict";function r(e){return!(!e||"count"!==e.op&&!e.field||!e.op)}Object.defineProperty(t,"__esModule",{value:!0}),t.isSortField=r},function(e,t,n){"use strict";t.a=function(e){throw Error(e)}},function(e,t,n){"use strict";var r=n(87),i=n(110),o=n(111);t.a=function(e,t){var a=n.i(i.a)(e),s="return _["+a.map(o.a).join("][")+"];";return n.i(r.a)(Function("_",s),[e=1===a.length?a[0]:e],t||e)}},function(e,t,n){"use strict";t.a=function(e){return"[object Date]"===Object.prototype.toString.call(e)}},function(e,t,n){"use strict";t.a=function(e){return"number"==typeof e}},function(e,t,n){"use strict";t.a=function(e){return e===Object(e)}},function(e,t,n){"use strict";t.a=function(e){return"string"==typeof e}},function(e,t,n){"use strict";t.a=function(e,t){for(var n="";--t>=0;)n+=e;return n}},function(e,t,n){"use strict";t.a=function(e){throw Error(e)}},function(e,t,n){"use strict";var r=n(88),i=n(112),o=n(113);t.a=function(e,t){var a=n.i(i.a)(e),s="return _["+a.map(o.a).join("][")+"];";return n.i(r.a)(Function("_",s),[e=1===a.length?a[0]:e],t||e)}},function(e,t,n){"use strict";t.a=function(e){return"[object Date]"===Object.prototype.toString.call(e)}},function(e,t,n){"use strict";t.a=function(e){return"function"==typeof e}},function(e,t,n){"use strict";t.a=function(e){return"number"==typeof e}},function(e,t,n){"use strict";t.a=function(e){return e===Object(e)}},function(e,t,n){"use strict";t.a=function(e){return"string"==typeof e}},function(e,t,n){"use strict";t.a=function(e,t){for(var n="";--t>=0;)n+=e;return n}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SET_CONFIG="SET_CONFIG"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FILTER_ADD="FILTER_ADD",t.FILTER_TOGGLE="FILTER_TOGGLE",t.FILTER_REMOVE="FILTER_REMOVE",t.FILTER_CLEAR="FILTER_CLEAR",t.FILTER_MODIFY_EXTENT="FILTER_MODIFY_EXTENT",t.FILTER_MODIFY_MIN_BOUND="FILTER_MODIFY_MIN_BOUND",t.FILTER_MODIFY_MAX_BOUND="FILTER_MODIFY_MAX_BOUND",t.FILTER_MODIFY_ONE_OF="FILTER_MODIFY_ONE_OF",t.FILTER_MODIFY_TIME_UNIT="FILTER_MODIFY_TIME_UNIT"},function(e,t,n){"use strict";function r(e){return t.TAB_ACTION_TYPE_INDEX[e.type]}Object.defineProperty(t,"__esModule",{value:!0}),t.TAB_ACTION_TYPE_INDEX={TAB_ADD:1,TAB_REMOVE:1,TAB_SWITCH:1,TAB_TITLE_UPDATE:1},t.isTabAction=r,t.TAB_ADD="TAB_ADD",t.TAB_REMOVE="TAB_REMOVE",t.TAB_SWITCH="TAB_SWITCH",t.TAB_TITLE_UPDATE="TAB_TITLE_UPDATE"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UNDO="UNDO",t.REDO="REDO"},function(e,t,n){"use strict";function r(e,t,n,r){if(r&&r.serverUrl){return fetch(r.serverUrl+"/recommend",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({query:e,schema:t.fieldSchemas,data:n})}).then(function(e){return e.json()})}return new Promise(function(n){var r=a.recommend(e,t).result;n(u.fromSpecQueryModelGroup(r,{name:"source"}))})}function i(e,t){if(t&&t.serverUrl){return fetch(t.serverUrl+"/build",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"same-origin",body:JSON.stringify({data:e})}).then(function(e){return e.json()}).then(function(e){return new s.Schema({fields:e.fields})})}return new Promise(function(t){t(s.build(e))})}Object.defineProperty(t,"__esModule",{value:!0});var o=n(358);t.Query=o.Query;var a=n(188),s=n(59);t.Schema=s.Schema,n(208);var l=n(55);t.Data=l.Data;var u=n(93);t.fetchCompassQLRecommend=r,t.fetchCompassQLBuildSchema=i},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(19),s=n(220),l=n(225),u=n(273),c=n(286),d=n(15),f=n(39),p=n(12),h=function(e){function t(t){var n=e.call(this,t)||this;return n.state={modalIsOpen:!1,dataText:"",dataName:"",dataUrl:"",fileType:void 0},n.onDatasetChange=n.onDatasetChange.bind(n),n.openModal=n.openModal.bind(n),n.closeModal=n.closeModal.bind(n),n.renderDataset=n.renderDataset.bind(n),n.onFileChange=n.onFileChange.bind(n),n.onDataTextSubmit=n.onDataTextSubmit.bind(n),n.handleTextChange=n.handleTextChange.bind(n),n.handleFileTypeChange=n.handleFileTypeChange.bind(n),n.onDataUrlSubmit=n.onDataUrlSubmit.bind(n),n}return r(t,e),t.prototype.render=function(){var e=this.props.title;return i.createElement("span",{styleName:"data-selector"},i.createElement("button",{onClick:this.openModal},e),i.createElement(s.default,{isOpen:this.state.modalIsOpen,onRequestClose:this.closeModal,contentLabel:"Data Selector",styleName:"modal",className:"voyager"},i.createElement("div",{className:"modal-header"},i.createElement("a",{styleName:"modal-close",onClick:this.closeModal},"close"),i.createElement("h3",null,"Add Dataset")),i.createElement(l.Tabs,{className:c["react-tabs"]},i.createElement(l.TabList,{className:c["tab-list"]},i.createElement(l.Tab,{className:c.tab},"Change Dataset"),i.createElement(l.Tab,{className:c.tab},"Paste or Upload Data"),i.createElement(l.Tab,{className:c.tab},"From URL")),i.createElement(l.TabPanel,{className:c["tab-panel"]},this.renderDatasetPanel()),i.createElement(l.TabPanel,{className:c["tab-panel"]},i.createElement("div",null,this.renderUploadPanel(),this.renderPastePanel())),i.createElement(l.TabPanel,{className:c["tab-panel"]},this.renderUrlPanel()))))},t.prototype.renderDataset=function(e){var t=e.name===this.props.data.name?c["element-selected"]:null;return i.createElement("li",{key:e.name,className:c["dataset-list-element"]+" "+t},i.createElement("a",{onClick:this.onDatasetChange.bind(this,e)},i.createElement("i",{className:"fa fa-database"})," ",e.name))},t.prototype.renderDatasetPanel=function(){return i.createElement("div",null,i.createElement("ul",{styleName:"dataset-list"},f.DEFAULT_DATASETS.map(this.renderDataset)))},t.prototype.renderUploadPanel=function(){return i.createElement("div",{styleName:"upload-panel"},i.createElement("div",{className:"form-group"},i.createElement("label",{htmlFor:"data-file"},"File"),i.createElement("input",{id:"data-file",type:"file",onChange:this.onFileChange})),i.createElement("p",null,"Upload a data file, or paste data in CSV format into the input."),i.createElement("div",{styleName:"dropzone-target"}))},t.prototype.renderUrlPanel=function(){return i.createElement("div",{styleName:"url-panel"},i.createElement("p",null,"Add the name of the dataset and the URL to a ",i.createElement("b",null," JSON "),", ",i.createElement("b",null," CSV ")," (with header), or",i.createElement("b",null," TSV ")," file. Make sure that the formatting is correct and clean the data before adding it. The added dataset is only visible to you."),i.createElement("div",{className:"form-group"},i.createElement("label",{htmlFor:"filetype-selector"},"File Type"),i.createElement("select",{value:this.state.fileType,onChange:this.handleFileTypeChange,id:"filetype-selector"},i.createElement("option",{value:"json"},"JSON"),i.createElement("option",{value:"csv"},"CSV"),i.createElement("option",{value:"tsv"},"TSV"))),i.createElement("div",{className:"form-group"},i.createElement("label",{htmlFor:"data-name"},"Name"),i.createElement("input",{name:"dataName",value:this.state.dataName,onChange:this.handleTextChange,id:"data-name",type:"name"})),i.createElement("div",{className:"form-group"},i.createElement("label",{htmlFor:"data-url"},"URL"),i.createElement("input",{name:"dataUrl",value:this.state.dataUrl,onChange:this.handleTextChange,id:"data-url",type:"name"})),i.createElement("button",{onClick:this.onDataUrlSubmit},"Add Dataset"))},t.prototype.handleFileTypeChange=function(e){this.setState({fileType:e.target.value})},t.prototype.renderPastePanel=function(){return i.createElement("div",{styleName:"paste-panel"},i.createElement("div",{className:"form-group"},i.createElement("label",{htmlFor:"data-name"},"Name"),i.createElement("input",{name:"dataName",value:this.state.dataName,onChange:this.handleTextChange,id:"data-name",type:"name"})),i.createElement("div",{className:"form-group"},i.createElement("textarea",{name:"dataText",value:this.state.dataText,onChange:this.handleTextChange})),i.createElement("button",{onClick:this.onDataTextSubmit},"Add Data"))},t.prototype.onDatasetChange=function(e){this.props.handleAction(d.datasetLoad(e.name,e)),this.closeModal()},t.prototype.onFileChange=function(e){var t=this.props.handleAction,n=new FileReader,r=e.target.files[0];n.onload=function(e){var n,i=r.name.replace(/\.\w+$/,""),o=r.name.split(".").pop();try{n=u.read(e.target.result,{type:o})}catch(e){window.alert(e.message)}t(d.datasetLoad(i,{values:n,format:o}))},n.readAsText(r)},t.prototype.onDataTextSubmit=function(){var e=u.read(this.state.dataText,{type:"csv"});this.props.handleAction(d.datasetLoad(this.state.dataName,{values:e}))},t.prototype.loadDataString=function(e){var t=this.state.dataName,n=this.state.fileType,r=u.read(e,{type:n});this.props.handleAction(d.datasetLoad(t,{values:r}))},t.prototype.onDataUrlSubmit=function(){var e=this;u.loader().load(this.state.dataUrl).then(function(t){e.loadDataString(t)}).catch(function(e){console.warn("Error occurred while loading data: ",e)})},t.prototype.openModal=function(){this.setState({modalIsOpen:!0})},t.prototype.closeModal=function(){this.setState({modalIsOpen:!1})},t.prototype.handleTextChange=function(e){var t=e.target.name;this.setState((n={},n[t]=e.target.value,n));var n},t}(i.PureComponent);t.DataSelectorBase=h;var m=o(h,c);t.DataSelector=a.connect(function(e){return{data:p.selectDataset(e)}},d.createDispatchHandler())(m)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(6),o=n(0),a=n(8),s=n(2),l=n(40),u=n(290),c=function(e){function t(t){var n=e.call(this,t)||this;return n.onFunctionChange=n.onFunctionChange.bind(n),n.onCheck=n.onCheck.bind(n),n.onFunctionCheck=n.onFunctionCheck.bind(n),n}return r(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.fieldDefParts,r=t.wildcardHandler,a=n.fn,u=n.type,c=l.getSupportedFunction(u),d=i.isWildcard(a),f=c.map(function(t){return o.createElement("label",{styleName:"func-label",key:t||"-"},o.createElement("input",{onChange:d?e.onFunctionCheck:e.onFunctionChange,type:d?"checkbox":"radio",checked:i.isWildcard(a)?s.contains(a.enum,t):t===a,value:t||"-"})," ",t||"-")});return f.length>0&&o.createElement("div",{styleName:"function-chooser"},r&&o.createElement("label",{styleName:"wildcard-button"},o.createElement("input",{type:"checkbox",onChange:this.onCheck})," Wildcard"),o.createElement("h4",null,"Function"),f)},t.prototype.onFunctionChange=function(e){var t=e.target.value;"-"===t&&(t=void 0),this.props.onFunctionChange(t)},t.prototype.onFunctionCheck=function(e){var t=e.target.checked,n=e.target.value;"-"===n&&(n=void 0),t?this.props.wildcardHandler.onWildcardAdd(n):this.props.wildcardHandler.onWildcardRemove(n)},t.prototype.onCheck=function(e){e.target.checked?this.props.wildcardHandler.onWildcardEnable():this.props.wildcardHandler.onWildcardDisable()},t}(o.PureComponent);t.FunctionPickerBase=c,t.FunctionPicker=a(c,u)},function(e,t,n){"use strict";function r(e){return"string"===e.type}function i(e,t,n,r,i){var d=g(e,t,n),f=t?e+"_"+t:e;switch(e){case"scale":return s(t,l(i,r),r,d,f);case"axis":return a(t,i,d,f);case"stack":return u("stack",_.definitions.StackOffset.enum,d);case"legend":return o(t,d,f);case"format":return c("format","",d,"string");default:throw new Error("Property combination not recognized")}}function o(e,t,n){switch(e){case"orient":return u(n,_.definitions.LegendOrient.enum,t);case"title":return c(n,"",t,"string");case"type":return u(n,_.definitions.Legend.properties.type.enum,t);default:throw new Error("Property combination not recognized")}}function a(e,t,n,r){switch(e){case"orient":return u(r,"y"===t?["left","right"]:["top","bottom"],n);case"title":return c(r,"",n,"string");default:throw new Error("Property combination not recognized")}}function s(e,n,r,i,o){switch(e){case"type":return u(o,n,i);case"scheme":return u(o,p(r)?t.SEQUENTIAL_COLOR_SCHEMES:t.CATEGORICAL_COLOR_SCHEMES,i);case"range":case"domain":return c(o,h(r)?"a, b, c, ...":"Min Number, Max Number",i,"string");default:throw new Error("Provided property is not supported")}}function l(e,t){switch(t.type){case y.ExpandedType.QUANTITATIVE:return b.contains([v.Channel.X,v.Channel.Y],e)?["linear","log","pow","sqrt"]:e===v.Channel.COLOR?["linear","pow","sqrt","log","sequential"]:e===v.Channel.SIZE?["linear","pow","sqrt","log"]:[];case y.ExpandedType.ORDINAL:case y.ExpandedType.NOMINAL:return b.contains([v.Channel.X,v.Channel.Y],e)?["point","band"]:e===v.Channel.COLOR?["ordinal"]:e===v.Channel.SIZE?["point","band"]:[];case y.ExpandedType.TEMPORAL:return b.contains([v.Channel.X,v.Channel.Y],e)?["time","utc"]:e===v.Channel.COLOR?["time","utc","sequential"]:e===v.Channel.SIZE?["time","utc"]:[];default:return[]}}function u(e,t,n){return{schema:{type:"object",properties:(r={},r[e]={type:"string",title:n,enum:t},r)},uiSchema:(i={},i[e]={"ui:widget":"select","ui:placeholder":"auto","ui:emptyValue":"auto"},i)};var r,i}function c(e,t,n,r){return{schema:{type:"object",properties:(i={},i[e]={title:n,type:r},i)},uiSchema:(o={},o[e]={"ui:emptyValue":"","ui:placeholder":t},o)};var i,o}function d(e,t){if(!t||e.channel!==v.Channel.X&&e.channel!==v.Channel.Y){if(e.channel===v.Channel.COLOR)return P;if(e.channel===v.Channel.SIZE)return A;if(e.channel===v.Channel.SHAPE)return x}else switch(t.type){case y.ExpandedType.QUANTITATIVE:return T;case y.ExpandedType.ORDINAL:case y.ExpandedType.NOMINAL:return O;case y.ExpandedType.TEMPORAL:return w}}function f(e,t){for(var n=d(e,t),r={},i=0,o=Object.keys(n);id&&i.createElement("a",{styleName:"load-more",onClick:this.onLoadMore},"Load more..."))},t.prototype.onPlotSort=function(e,t,n){var r=this.props,i=r.handleAction,o=r.resultType;i({type:l.RESULT_MODIFY_FIELD_PROP,payload:{resultType:o,index:e,channel:t,prop:"sort",value:n}})},t.prototype.onLoadMore=function(){var e=this.props,t=e.handleAction,n=e.resultType;t({type:l.RESULT_LIMIT_INCREASE,payload:{resultType:n,increment:4}})},t}(i.PureComponent);t.PlotListBase=h,t.PlotList=a.connect(function(e){return{data:c.selectFilteredData(e),filters:d.selectFilters(e)}})(o(h,p))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_BOOKMARK={dict:{},count:0,list:[]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(59),i=n(59);t.FieldSchema=i.FieldSchema,t.Schema=i.Schema,t.DEFAULT_DATASET={isLoading:!1,name:"Empty",schema:new r.Schema({fields:[]}),data:null}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_LOG={errors:[],warnings:{warn:[],info:[],debug:[]}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_RELATED_VIEWS={isCollapsed:void 0}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_SHELF_PREVIEW={spec:null}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(93),i=n(40);t.DEFAULT_TAB_TITLE="untitled",t.DEFAULT_PLOT_TAB_STATE={title:t.DEFAULT_TAB_TITLE,shelf:i.DEFAULT_SHELF,result:r.DEFAULT_RESULT_INDEX},t.DEFAULT_ACTIVE_TAB_ID=0,t.DEFAULT_TAB={activeTabID:t.DEFAULT_ACTIVE_TAB_ID,list:[t.DEFAULT_PLOT_TAB_STATE]}},function(e,t,n){"use strict";function r(e){return i.isWildcard(e)?e:i.SHORT_WILDCARD}Object.defineProperty(t,"__esModule",{value:!0});var i=n(6);t.makeWildcard=r},function(e,t,n){"use strict";function r(e,t){var n=e.getState(),r=p.selectIsQueryEmpty(n),o=f.selectIsQuerySpecific(n);e.dispatch(d.resultRequest("main",t,null)),"disabled"===n.persistent.config.relatedViews||n.persistent.relatedViews.isCollapsed||(r?e.dispatch(i(g.histograms,t)):o&&a(e,t))}function i(e,t){var n,r=e.createQuery(t);if(e.filterSpecifiedView){if(!c.isString(r.groupBy))throw new Error("Cannot get key if query.groupBy is not string");n=s.getGroupByKey(t.spec,r.groupBy)}return d.resultRequest(e.type,r,n)}function o(e){var t=!1,n=!1,r=!1;return e.encodings.forEach(function(e){"x"===e.channel||"y"===e.channel?t=!0:"row"===e.channel||"column"===e.channel?r=!0:c.contains(u.NONSPATIAL_SCALE_CHANNELS,e.channel)&&(n=!0)}),{hasOpenPosition:t,hasStyleChannel:n,hasOpenFacet:r,isSpecAggregate:l.isAggregate(e)}}function a(e,t){var n=o(t.spec),r=n.hasOpenPosition,a=n.hasStyleChannel,s=n.hasOpenFacet;n.isSpecAggregate||e.dispatch(i(y.summaries,t)),(r||a)&&e.dispatch(i(m.addQuantitativeField,t)),(r||a||s)&&e.dispatch(i(m.addCategoricalField,t)),r&&e.dispatch(i(m.addTemporalField,t)),e.dispatch(i(h.alternativeEncodings,t))}Object.defineProperty(t,"__esModule",{value:!0});var s=n(125),l=n(76),u=n(3),c=n(2),d=n(91),f=n(12),p=n(58),h=n(709),m=n(710),g=n(711),y=n(712);t.RELATED_VIEWS_INDEX={main:void 0,addCategoricalField:m.addCategoricalField,addQuantitativeField:m.addQuantitativeField,addTemporalField:m.addTemporalField,alternativeEncodings:h.alternativeEncodings,summaries:y.summaries,histograms:g.histograms};var v={main:void 0,histograms:0,summaries:1,addQuantitativeField:2,addCategoricalField:3,addTemporalField:4,alternativeEncodings:5};t.RELATED_VIEWS_TYPES=Object.keys(t.RELATED_VIEWS_INDEX).filter(function(e){return"main"!==e}).sort(function(e,t){return v[e]-v[t]}),t.dispatchQueries=r,t.makeRelatedViewQueries=a},function(e,t){e.exports=l},function(e,t){e.exports=u},function(e,t){e.exports={id:"http://json-schema.org/draft-04/schema#",$schema:"http://json-schema.org/draft-04/schema#",description:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},positiveInteger:{type:"integer",minimum:0},positiveIntegerDefault0:{allOf:[{$ref:"#/definitions/positiveInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},minItems:1,uniqueItems:!0}},type:"object",properties:{id:{type:"string",format:"uri"},$schema:{type:"string",format:"uri"},title:{type:"string"},description:{type:"string"},default:{},multipleOf:{type:"number",minimum:0,exclusiveMinimum:!0},maximum:{type:"number"},exclusiveMaximum:{type:"boolean",default:!1},minimum:{type:"number"},exclusiveMinimum:{type:"boolean",default:!1},maxLength:{$ref:"#/definitions/positiveInteger"},minLength:{$ref:"#/definitions/positiveIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{anyOf:[{type:"boolean"},{$ref:"#"}],default:{}},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:{}},maxItems:{$ref:"#/definitions/positiveInteger"},minItems:{$ref:"#/definitions/positiveIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},maxProperties:{$ref:"#/definitions/positiveInteger"},minProperties:{$ref:"#/definitions/positiveIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{anyOf:[{type:"boolean"},{$ref:"#"}],default:{}},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},enum:{type:"array",minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},dependencies:{exclusiveMaximum:["maximum"],exclusiveMinimum:["minimum"]},default:{}}},function(e,t,n){"use strict";function r(e){if(!(this instanceof r))return new r(e);e=this._opts=L.copy(e)||{},this._schemas={},this._refs={},this._fragments={},this._formats=R(e.format);var t=this._schemaUriFormat=this._formats["uri-reference"];this._schemaUriFormatFunc=function(e){return t.test(e)},this._cache=e.cache||new k,this._loadingSchemas={},this._compilations=[],this.RULES=I(),this._getId=y(e),e.loopRequired=e.loopRequired||1/0,"property"==e.errorDataPath&&(e._errorDataPathProperty=!0),void 0===e.serialize&&(e.serialize=M),this._metaOpts=A(this),e.formats&&T(this),O(this),"object"==typeof e.meta&&this.addMetaSchema(e.meta),w(this),e.patternGroups&&F(this)}function i(e,t){var n;if("string"==typeof e){if(!(n=this.getSchema(e)))throw new Error('no schema with key or ref "'+e+'"')}else{var r=this._addSchema(e);n=r.validate||this._compile(r)}var i=n(t);return!0===n.$async?"*"==this._opts.async?j(i):i:(this.errors=n.errors,i)}function o(e,t){var n=this._addSchema(e,void 0,t);return n.validate||this._compile(n)}function a(e,t,n,r){if(Array.isArray(e))for(var i=0;i=1&&n<=12&&r>=1&&r<=f[n]}function o(e,t){var n=e.match(p);if(!n)return!1;var r=n[1],i=n[2],o=n[3],a=n[5];return r<=23&&i<=59&&o<=59&&(!t||a)}function a(e){var t=e.split(_);return 2==t.length&&i(t[0])&&o(t[1],!0)}function s(e){return e.length<=255&&h.test(e)}function l(e){return E.test(e)&&m.test(e)}function u(e){if(S.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}var c=n(67),d=/^\d\d\d\d-(\d\d)-(\d\d)$/,f=[0,31,29,31,30,31,30,31,31,30,31,30,31],p=/^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d:\d\d)?$/i,h=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*$/i,m=/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9a-f]{2})*)?$/i,g=/^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#.\/;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,y=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,v=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,b=/^(?:\/(?:[^~\/]|~0|~1)*)*$|^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;e.exports=r,r.fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)$/i,uri:/^(?:[a-z][a-z0-9+-.]*)(?::|\/)\/?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i,"uri-template":g,url:y,email:/^[a-z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:h,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:u,uuid:v,"json-pointer":b,"relative-json-pointer":/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~\/]|~0|~1)*)*)$/},r.full={date:i,time:o,"date-time":a,uri:l,"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@\/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@\/?]|%[0-9a-f]{2})*)?$/i,"uri-template":g,url:y,email:/^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:u,uuid:v,"json-pointer":b,"relative-json-pointer":/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~\/]|~0|~1)*)*)$/};var _=/t|\s/i,E=/\/|:/,S=/[^\\]\\Z/},function(e,t,n){"use strict";function r(e,t,n,a){function E(){var e=z.validate,t=e.apply(null,arguments);return E.errors=e.errors,t}function S(e,n,i,o){var a=!n||n&&n.schema==e;if(n.schema!=t.schema)return r.call(D,e,n,i,o);var m=!0===e.$async,E=g({isTop:!0,schema:e,isRoot:a,baseId:o,root:n,schemaPath:"",errSchemaPath:"#",errorPath:'""',MissingRefError:h.MissingRef,RULES:V,validate:g,util:p,resolve:f,resolveRef:O,usePattern:x,useDefault:C,useCustomRule:k,opts:M,formats:W,self:D});E=d(R,u)+d(N,s)+d(L,l)+d(B,c)+E,M.processCode&&(E=M.processCode(E));var S;try{S=new Function("self","RULES","formats","root","refVal","defaults","customRules","co","equal","ucs2length","ValidationError",E)(D,V,W,t,R,L,B,y,b,v,_),R[0]=S}catch(e){throw console.error("Error compiling schema, function code:",E),e}return S.schema=e,S.errors=null,S.refs=I,S.refVal=R,S.root=a?S:n,m&&(S.$async=!0),!0===M.sourceCode&&(S.source={code:E,patterns:N,defaults:L}),S}function O(e,i,o){i=f.url(e,i);var a,s,l=I[i];if(void 0!==l)return a=R[l],s="refVal["+l+"]",A(a,s);if(!o&&t.refs){var u=t.refs[i];if(void 0!==u)return a=t.refVal[u],s=w(i,a),A(a,s)}s=w(i);var c=f.call(D,S,t,i);if(void 0===c){var d=n&&n[i];d&&(c=f.inlineRef(d,M.inlineRefs)?d:r.call(D,d,t,n,e))}if(void 0!==c)return P(i,c),A(c,s);T(i)}function w(e,t){var n=R.length;return R[n]=t,I[e]=n,"refVal"+n}function T(e){delete I[e]}function P(e,t){var n=I[e];R[n]=t}function A(e,t){return"object"==typeof e||"boolean"==typeof e?{code:t,schema:e,inline:!0}:{code:t,$async:e&&e.$async}}function x(e){var t=F[e];return void 0===t&&(t=F[e]=N.length,N[t]=e),"pattern"+t}function C(e){switch(typeof e){case"boolean":case"number":return""+e;case"string":return p.toQuotedString(e);case"object":if(null===e)return"null";var t=m(e),n=j[t];return void 0===n&&(n=j[t]=L.length,L[n]=e),"default"+n}}function k(e,t,n,r){var i=e.definition.validateSchema;if(i&&!1!==D._opts.validateSchema){if(!i(t)){var o="keyword schema is invalid: "+D.errorsText(i.errors);if("log"!=D._opts.validateSchema)throw new Error(o);console.error(o)}}var a,s=e.definition.compile,l=e.definition.inline,u=e.definition.macro;if(s)a=s.call(D,t,n,r);else if(u)a=u.call(D,t,n,r),!1!==M.validateSchema&&D.validateSchema(a,!0);else if(l)a=l.call(D,r,e.keyword,t,n);else if(!(a=e.definition.validate))return;if(void 0===a)throw new Error('custom keyword "'+e.keyword+'"failed to compile');var c=B.length;return B[c]=a,{code:"customRule"+c,validate:a}}var D=this,M=this._opts,R=[void 0],I={},N=[],F={},L=[],j={},B=[];t=t||{schema:e,refVal:R,refs:I};var U=i.call(this,e,t,a),z=this._compilations[U.index];if(U.compiling)return z.callValidate=E;var W=this._formats,V=this.RULES;try{var q=S(e,t,n,a);z.validate=q;var H=z.callValidate;return H&&(H.schema=q.schema,H.errors=null,H.refs=q.refs,H.refVal=q.refVal,H.root=q.root,H.$async=q.$async,M.sourceCode&&(H.source=q.source)),q}finally{o.call(this,e,t,a)}}function i(e,t,n){var r=a.call(this,e,t,n);return r>=0?{index:r,compiling:!0}:(r=this._compilations.length,this._compilations[r]={schema:e,root:t,baseId:n},{index:r,compiling:!1})}function o(e,t,n){var r=a.call(this,e,t,n);r>=0&&this._compilations.splice(r,1)}function a(e,t,n){for(var r=0;r=55296&&t<=56319&&i=0)return u&&(r+=" if (true) { "),r;throw new Error('unknown format "'+a+'" is used in schema at path "'+e.errSchemaPath+'"')}var g="object"==typeof m&&!(m instanceof RegExp)&&m.validate,y=g&&m.type||"string";if(g){var v=!0===m.async;m=m.validate}if(y!=n)return u&&(r+=" if (true) { "),r;if(v){if(!e.async)throw new Error("async format in sync schema");var b="formats"+e.util.getProperty(a)+".validate";r+=" if (!("+e.yieldAwait+" "+b+"("+c+"))) { "}else{r+=" if (! ";var b="formats"+e.util.getProperty(a);g&&(b+=".validate"),r+="function"==typeof m?" "+b+"("+c+") ":" "+b+".test("+c+") ",r+=") { "}}var _=_||[];_.push(r),r="",!1!==e.createErrors?(r+=" { keyword: 'format' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { format: ",r+=f?""+d:""+e.util.toQuotedString(a),r+=" } ",!1!==e.opts.messages&&(r+=" , message: 'should match format \"",r+=f?"' + "+d+" + '":""+e.util.escapeQuotes(a),r+="\"' "),e.opts.verbose&&(r+=" , schema: ",r+=f?"validate.schema"+s:""+e.util.toQuotedString(a),r+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),r+=" } "):r+=" {} ";var E=r;return r=_.pop(),!e.compositeRule&&u?e.async?r+=" throw new ValidationError(["+E+"]); ":r+=" validate.errors = ["+E+"]; return false; ":r+=" var err = "+E+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } ",u&&(r+=" else { "),r}},function(e,t,n){"use strict";e.exports=function(e,t,n){var r=" ",i=e.level,o=e.dataLevel,a=e.schema[t],s=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,u=!e.opts.allErrors,c="data"+(o||""),d="valid"+i,f="errs__"+i,p=e.util.copy(e),h="";p.level++;var m="valid"+p.level,g="i"+i,y=p.dataLevel=e.dataLevel+1,v="data"+y,b=e.baseId;if(r+="var "+f+" = errors;var "+d+";",Array.isArray(a)){var _=e.schema.additionalItems;if(!1===_){r+=" "+d+" = "+c+".length <= "+a.length+"; ";var E=l;l=e.errSchemaPath+"/additionalItems",r+=" if (!"+d+") { ";var S=S||[];S.push(r),r="",!1!==e.createErrors?(r+=" { keyword: 'additionalItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { limit: "+a.length+" } ",!1!==e.opts.messages&&(r+=" , message: 'should NOT have more than "+a.length+" items' "),e.opts.verbose&&(r+=" , schema: false , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),r+=" } "):r+=" {} ";var O=r;r=S.pop(),!e.compositeRule&&u?e.async?r+=" throw new ValidationError(["+O+"]); ":r+=" validate.errors = ["+O+"]; return false; ":r+=" var err = "+O+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } ",l=E,u&&(h+="}",r+=" else { ")}var w=a;if(w)for(var T,P=-1,A=w.length-1;P "+P+") { ";var x=c+"["+P+"]";p.schema=T,p.schemaPath=s+"["+P+"]",p.errSchemaPath=l+"/"+P,p.errorPath=e.util.getPathExpr(e.errorPath,P,e.opts.jsonPointers,!0),p.dataPathArr[y]=P;var C=e.validate(p);p.baseId=b,e.util.varOccurences(C,v)<2?r+=" "+e.util.varReplace(C,v,x)+" ":r+=" var "+v+" = "+x+"; "+C+" ",r+=" } ",u&&(r+=" if ("+m+") { ",h+="}")}if("object"==typeof _&&e.util.schemaHasRules(_,e.RULES.all)){p.schema=_,p.schemaPath=e.schemaPath+".additionalItems",p.errSchemaPath=e.errSchemaPath+"/additionalItems",r+=" "+m+" = true; if ("+c+".length > "+a.length+") { for (var "+g+" = "+a.length+"; "+g+" < "+c+".length; "+g+"++) { ",p.errorPath=e.util.getPathExpr(e.errorPath,g,e.opts.jsonPointers,!0);var x=c+"["+g+"]";p.dataPathArr[y]=g;var C=e.validate(p);p.baseId=b,e.util.varOccurences(C,v)<2?r+=" "+e.util.varReplace(C,v,x)+" ":r+=" var "+v+" = "+x+"; "+C+" ",u&&(r+=" if (!"+m+") break; "),r+=" } } ",u&&(r+=" if ("+m+") { ",h+="}")}}else if(e.util.schemaHasRules(a,e.RULES.all)){p.schema=a,p.schemaPath=s,p.errSchemaPath=l,r+=" for (var "+g+" = 0; "+g+" < "+c+".length; "+g+"++) { ",p.errorPath=e.util.getPathExpr(e.errorPath,g,e.opts.jsonPointers,!0);var x=c+"["+g+"]";p.dataPathArr[y]=g;var C=e.validate(p);p.baseId=b,e.util.varOccurences(C,v)<2?r+=" "+e.util.varReplace(C,v,x)+" ":r+=" var "+v+" = "+x+"; "+C+" ",u&&(r+=" if (!"+m+") break; "),r+=" }"}return u&&(r+=" "+h+" if ("+f+" == errors) {"),r=e.util.cleanUpCode(r)}},function(e,t,n){"use strict";e.exports=function(e,t,n){var r,i=" ",o=e.level,a=e.dataLevel,s=e.schema[t],l=e.schemaPath+e.util.getProperty(t),u=e.errSchemaPath+"/"+t,c=!e.opts.allErrors,d="data"+(a||""),f=e.opts.$data&&s&&s.$data;f?(i+=" var schema"+o+" = "+e.util.getData(s.$data,a,e.dataPathArr)+"; ",r="schema"+o):r=s,i+="var division"+o+";if (",f&&(i+=" "+r+" !== undefined && ( typeof "+r+" != 'number' || "),i+=" (division"+o+" = "+d+" / "+r+", ",e.opts.multipleOfPrecision?i+=" Math.abs(Math.round(division"+o+") - division"+o+") > 1e-"+e.opts.multipleOfPrecision+" ":i+=" division"+o+" !== parseInt(division"+o+") ",i+=" ) ",f&&(i+=" ) "),i+=" ) { ";var p=p||[];p.push(i),i="",!1!==e.createErrors?(i+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { multipleOf: "+r+" } ",!1!==e.opts.messages&&(i+=" , message: 'should be multiple of ",i+=f?"' + "+r:r+"'"),e.opts.verbose&&(i+=" , schema: ",i+=f?"validate.schema"+l:""+s,i+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+d+" "),i+=" } "):i+=" {} ";var h=i;return i=p.pop(),!e.compositeRule&&c?e.async?i+=" throw new ValidationError(["+h+"]); ":i+=" validate.errors = ["+h+"]; return false; ":i+=" var err = "+h+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",i+="} ",c&&(i+=" else { "),i}},function(e,t,n){"use strict";e.exports=function(e,t,n){var r=" ",i=e.level,o=e.dataLevel,a=e.schema[t],s=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,u=!e.opts.allErrors,c="data"+(o||""),d="errs__"+i,f=e.util.copy(e);f.level++;var p="valid"+f.level;if(e.util.schemaHasRules(a,e.RULES.all)){f.schema=a,f.schemaPath=s,f.errSchemaPath=l,r+=" var "+d+" = errors; ";var h=e.compositeRule;e.compositeRule=f.compositeRule=!0,f.createErrors=!1;var m;f.opts.allErrors&&(m=f.opts.allErrors,f.opts.allErrors=!1),r+=" "+e.validate(f)+" ",f.createErrors=!0,m&&(f.opts.allErrors=m),e.compositeRule=f.compositeRule=h,r+=" if ("+p+") { ";var g=g||[];g.push(r),r="",!1!==e.createErrors?(r+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(r+=" , message: 'should NOT be valid' "),e.opts.verbose&&(r+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),r+=" } "):r+=" {} ";var y=r;r=g.pop(),!e.compositeRule&&u?e.async?r+=" throw new ValidationError(["+y+"]); ":r+=" validate.errors = ["+y+"]; return false; ":r+=" var err = "+y+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } else { errors = "+d+"; if (vErrors !== null) { if ("+d+") vErrors.length = "+d+"; else vErrors = null; } ",e.opts.allErrors&&(r+=" } ")}else r+=" var err = ",!1!==e.createErrors?(r+=" { keyword: 'not' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: {} ",!1!==e.opts.messages&&(r+=" , message: 'should NOT be valid' "),e.opts.verbose&&(r+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),r+=" } "):r+=" {} ",r+="; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",u&&(r+=" if (false) { ");return r}},function(e,t,n){"use strict";e.exports=function(e,t,n){var r=" ",i=e.level,o=e.dataLevel,a=e.schema[t],s=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,u=!e.opts.allErrors,c="data"+(o||""),d="valid"+i,f="errs__"+i,p=e.util.copy(e),h="";p.level++;var m="valid"+p.level;r+="var "+f+" = errors;var prevValid"+i+" = false;var "+d+" = false;";var g=p.baseId,y=e.compositeRule;e.compositeRule=p.compositeRule=!0;var v=a;if(v)for(var b,_=-1,E=v.length-1;_5)r+=" || validate.schema"+s+"["+g+"] ";else{var F=E;if(F)for(var L,j=-1,B=F.length-1;j= "+ye+"; ",l=e.errSchemaPath+"/patternGroups/minimum",r+=" if (!"+d+") { ";var $=$||[];$.push(r),r="",!1!==e.createErrors?(r+=" { keyword: 'patternGroups' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { reason: '"+_e+"', limit: "+be+", pattern: '"+e.util.escapeQuotes(H)+"' } ",!1!==e.opts.messages&&(r+=" , message: 'should NOT have "+Ee+" than "+be+' properties matching pattern "'+e.util.escapeQuotes(H)+"\"' "),e.opts.verbose&&(r+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),r+=" } "):r+=" {} ";var X=r;r=$.pop(),!e.compositeRule&&u?e.async?r+=" throw new ValidationError(["+X+"]); ":r+=" validate.errors = ["+X+"]; return false; ":r+=" var err = "+X+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } ",void 0!==ve&&(r+=" else ")}if(void 0!==ve){var be=ve,_e="maximum",Ee="more";r+=" "+d+" = pgPropCount"+i+" <= "+ve+"; ",l=e.errSchemaPath+"/patternGroups/maximum",r+=" if (!"+d+") { ";var $=$||[];$.push(r),r="",!1!==e.createErrors?(r+=" { keyword: 'patternGroups' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { reason: '"+_e+"', limit: "+be+", pattern: '"+e.util.escapeQuotes(H)+"' } ",!1!==e.opts.messages&&(r+=" , message: 'should NOT have "+Ee+" than "+be+' properties matching pattern "'+e.util.escapeQuotes(H)+"\"' "),e.opts.verbose&&(r+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),r+=" } "):r+=" {} ";var X=r;r=$.pop(),!e.compositeRule&&u?e.async?r+=" throw new ValidationError(["+X+"]); ":r+=" validate.errors = ["+X+"]; return false; ":r+=" var err = "+X+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } "}l=K,u&&(r+=" if ("+d+") { ",h+="}")}}}}return u&&(r+=" "+h+" if ("+f+" == errors) {"),r=e.util.cleanUpCode(r)}},function(e,t,n){"use strict";e.exports=function(e,t,n){var r=" ",i=e.level,o=e.dataLevel,a=e.schema[t],s=e.schemaPath+e.util.getProperty(t),l=e.errSchemaPath+"/"+t,u=!e.opts.allErrors,c="data"+(o||""),d="errs__"+i,f=e.util.copy(e);f.level++;var p="valid"+f.level;if(e.util.schemaHasRules(a,e.RULES.all)){f.schema=a,f.schemaPath=s,f.errSchemaPath=l;var h="key"+i,m="idx"+i,g="i"+i,y="' + "+h+" + '",v=f.dataLevel=e.dataLevel+1,b="data"+v,_="dataProperties"+i,E=e.opts.ownProperties,S=e.baseId;r+=" var "+d+" = errors; ",E&&(r+=" var "+_+" = undefined; "),r+=E?" "+_+" = "+_+" || Object.keys("+c+"); for (var "+m+"=0; "+m+"<"+_+".length; "+m+"++) { var "+h+" = "+_+"["+m+"]; ":" for (var "+h+" in "+c+") { ",r+=" var startErrs"+i+" = errors; ";var O=h,w=e.compositeRule;e.compositeRule=f.compositeRule=!0;var T=e.validate(f);f.baseId=S,e.util.varOccurences(T,b)<2?r+=" "+e.util.varReplace(T,b,O)+" ":r+=" var "+b+" = "+O+"; "+T+" ",e.compositeRule=f.compositeRule=w,r+=" if (!"+p+") { for (var "+g+"=startErrs"+i+"; "+g+"=e.opts.loopRequired,S=e.opts.ownProperties;if(u)if(r+=" var missing"+i+"; ",E){f||(r+=" var "+p+" = validate.schema"+s+"; ");var O="i"+i,w="schema"+i+"["+O+"]",T="' + "+w+" + '";e.opts._errorDataPathProperty&&(e.errorPath=e.util.getPathExpr(_,w,e.opts.jsonPointers)),r+=" var "+d+" = true; ",f&&(r+=" if (schema"+i+" === undefined) "+d+" = true; else if (!Array.isArray(schema"+i+")) "+d+" = false; else {"),r+=" for (var "+O+" = 0; "+O+" < "+p+".length; "+O+"++) { "+d+" = "+c+"["+p+"["+O+"]] !== undefined ",S&&(r+=" && Object.prototype.hasOwnProperty.call("+c+", "+p+"["+O+"]) "),r+="; if (!"+d+") break; } ",f&&(r+=" } "),r+=" if (!"+d+") { ";var P=P||[];P.push(r),r="",!1!==e.createErrors?(r+=" { keyword: 'required' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(l)+" , params: { missingProperty: '"+T+"' } ",!1!==e.opts.messages&&(r+=" , message: '",e.opts._errorDataPathProperty?r+="is a required property":r+="should have required property \\'"+T+"\\'",r+="' "),e.opts.verbose&&(r+=" , schema: validate.schema"+s+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),r+=" } "):r+=" {} ";var A=r;r=P.pop(),!e.compositeRule&&u?e.async?r+=" throw new ValidationError(["+A+"]); ":r+=" validate.errors = ["+A+"]; return false; ":r+=" var err = "+A+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",r+=" } else { "}else{r+=" if ( ";var x=h;if(x)for(var C,O=-1,k=x.length-1;O 1) { var i = "+d+".length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal("+d+"[i], "+d+"[j])) { "+f+" = false; break outer; } } } } ",p&&(i+=" } "),i+=" if (!"+f+") { ";var h=h||[];h.push(i),i="",!1!==e.createErrors?(i+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(u)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(i+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(i+=" , schema: ",i+=p?"validate.schema"+l:""+s,i+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+d+" "),i+=" } "):i+=" {} ";var m=i;i=h.pop(),!e.compositeRule&&c?e.async?i+=" throw new ValidationError(["+m+"]); ":i+=" validate.errors = ["+m+"]; return false; ":i+=" var err = "+m+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",i+=" } ",c&&(i+=" else { ")}else c&&(i+=" if (true) { ");return i}},function(e,t,n){"use strict";function r(e,t){function n(e,t,n){for(var r,o=0;o0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function i(e){return 3*e.length/4-r(e)}function o(e){var t,n,i,o,a,s,l=e.length;a=r(e),s=new d(3*l/4-a),i=a>0?l-4:l;var u=0;for(t=0,n=0;t>16&255,s[u++]=o>>8&255,s[u++]=255&o;return 2===a?(o=c[e.charCodeAt(t)]<<2|c[e.charCodeAt(t+1)]>>4,s[u++]=255&o):1===a&&(o=c[e.charCodeAt(t)]<<10|c[e.charCodeAt(t+1)]<<4|c[e.charCodeAt(t+2)]>>2,s[u++]=o>>8&255,s[u++]=255&o),s}function a(e){return u[e>>18&63]+u[e>>12&63]+u[e>>6&63]+u[63&e]}function s(e,t,n){for(var r,i=[],o=t;ol?l:a+16383));return 1===r?(t=e[n-1],i+=u[t>>2],i+=u[t<<4&63],i+="=="):2===r&&(t=(e[n-2]<<8)+e[n-1],i+=u[t>>10],i+=u[t>>4&63],i+=u[t<<2&63],i+="="),o.push(i),o.join("")}t.byteLength=i,t.toByteArray=o,t.fromByteArray=l;for(var u=[],c=[],d="undefined"!=typeof Uint8Array?Uint8Array:Array,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p=0,h=f.length;p1&&n[1]||""}var n,r=t(/(ipod|iphone|ipad)/i).toLowerCase(),i=/like android/i.test(e),o=!i&&/android/i.test(e),s=/nexus\s*[0-6]\s*/i.test(e),l=!s&&/nexus\s*[0-9]+/i.test(e),u=/CrOS/.test(e),c=/silk/i.test(e),d=/sailfish/i.test(e),f=/tizen/i.test(e),p=/(web|hpw)os/i.test(e),h=/windows phone/i.test(e),m=(/SamsungBrowser/i.test(e),!h&&/windows/i.test(e)),g=!r&&!c&&/macintosh/i.test(e),y=!o&&!d&&!f&&!p&&/linux/i.test(e),v=t(/edge\/(\d+(\.\d+)?)/i),b=t(/version\/(\d+(\.\d+)?)/i),_=/tablet/i.test(e),E=!_&&/[^-]mobi/i.test(e),S=/xbox/i.test(e);/opera/i.test(e)?n={name:"Opera",opera:a,version:b||t(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)}:/opr|opios/i.test(e)?n={name:"Opera",opera:a,version:t(/(?:opr|opios)[\s\/](\d+(\.\d+)?)/i)||b}:/SamsungBrowser/i.test(e)?n={name:"Samsung Internet for Android",samsungBrowser:a,version:b||t(/(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i)}:/coast/i.test(e)?n={name:"Opera Coast",coast:a,version:b||t(/(?:coast)[\s\/](\d+(\.\d+)?)/i)}:/yabrowser/i.test(e)?n={name:"Yandex Browser",yandexbrowser:a,version:b||t(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/ucbrowser/i.test(e)?n={name:"UC Browser",ucbrowser:a,version:t(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)}:/mxios/i.test(e)?n={name:"Maxthon",maxthon:a,version:t(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)}:/epiphany/i.test(e)?n={name:"Epiphany",epiphany:a,version:t(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)}:/puffin/i.test(e)?n={name:"Puffin",puffin:a,version:t(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)}:/sleipnir/i.test(e)?n={name:"Sleipnir",sleipnir:a,version:t(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)}:/k-meleon/i.test(e)?n={name:"K-Meleon",kMeleon:a,version:t(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)}:h?(n={name:"Windows Phone",windowsphone:a},v?(n.msedge=a,n.version=v):(n.msie=a,n.version=t(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(e)?n={name:"Internet Explorer",msie:a,version:t(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:u?n={name:"Chrome",chromeos:a,chromeBook:a,chrome:a,version:t(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/chrome.+? edge/i.test(e)?n={name:"Microsoft Edge",msedge:a,version:v}:/vivaldi/i.test(e)?n={name:"Vivaldi",vivaldi:a,version:t(/vivaldi\/(\d+(\.\d+)?)/i)||b}:d?n={name:"Sailfish",sailfish:a,version:t(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(e)?n={name:"SeaMonkey",seamonkey:a,version:t(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel|fxios/i.test(e)?(n={name:"Firefox",firefox:a,version:t(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(e)&&(n.firefoxos=a)):c?n={name:"Amazon Silk",silk:a,version:t(/silk\/(\d+(\.\d+)?)/i)}:/phantom/i.test(e)?n={name:"PhantomJS",phantom:a,version:t(/phantomjs\/(\d+(\.\d+)?)/i)}:/slimerjs/i.test(e)?n={name:"SlimerJS",slimer:a,version:t(/slimerjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(e)||/rim\stablet/i.test(e)?n={name:"BlackBerry",blackberry:a,version:b||t(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:p?(n={name:"WebOS",webos:a,version:b||t(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(e)&&(n.touchpad=a)):/bada/i.test(e)?n={name:"Bada",bada:a,version:t(/dolfin\/(\d+(\.\d+)?)/i)}:f?n={name:"Tizen",tizen:a,version:t(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||b}:/qupzilla/i.test(e)?n={name:"QupZilla",qupzilla:a,version:t(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i)||b}:/chromium/i.test(e)?n={name:"Chromium",chromium:a,version:t(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i)||b}:/chrome|crios|crmo/i.test(e)?n={name:"Chrome",chrome:a,version:t(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:o?n={name:"Android",version:b}:/safari|applewebkit/i.test(e)?(n={name:"Safari",safari:a},b&&(n.version=b)):r?(n={name:"iphone"==r?"iPhone":"ipad"==r?"iPad":"iPod"},b&&(n.version=b)):n=/googlebot/i.test(e)?{name:"Googlebot",googlebot:a,version:t(/googlebot\/(\d+(\.\d+))/i)||b}:{name:t(/^(.*)\/(.*) /),version:function(t){var n=e.match(t);return n&&n.length>1&&n[2]||""}(/^(.*)\/(.*) /)},!n.msedge&&/(apple)?webkit/i.test(e)?(/(apple)?webkit\/537\.36/i.test(e)?(n.name=n.name||"Blink",n.blink=a):(n.name=n.name||"Webkit",n.webkit=a),!n.version&&b&&(n.version=b)):!n.opera&&/gecko\//i.test(e)&&(n.name=n.name||"Gecko",n.gecko=a,n.version=n.version||t(/gecko\/(\d+(\.\d+)?)/i)),n.windowsphone||n.msedge||!o&&!n.silk?n.windowsphone||n.msedge||!r?g?n.mac=a:S?n.xbox=a:m?n.windows=a:y&&(n.linux=a):(n[r]=a,n.ios=a):n.android=a;var O="";n.windowsphone?O=t(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):r?(O=t(/os (\d+([_\s]\d+)*) like mac os x/i),O=O.replace(/[_\s]/g,".")):o?O=t(/android[ \/-](\d+(\.\d+)*)/i):n.webos?O=t(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):n.blackberry?O=t(/rim\stablet\sos\s(\d+(\.\d+)*)/i):n.bada?O=t(/bada\/(\d+(\.\d+)*)/i):n.tizen&&(O=t(/tizen[\/\s](\d+(\.\d+)*)/i)),O&&(n.osversion=O);var w=O.split(".")[0];return _||l||"ipad"==r||o&&(3==w||w>=4&&!E)||n.silk?n.tablet=a:(E||"iphone"==r||"ipod"==r||o||s||n.blackberry||n.webos||n.bada)&&(n.mobile=a),n.msedge||n.msie&&n.version>=10||n.yandexbrowser&&n.version>=15||n.vivaldi&&n.version>=1||n.chrome&&n.version>=20||n.samsungBrowser&&n.version>=4||n.firefox&&n.version>=20||n.safari&&n.version>=6||n.opera&&n.version>=10||n.ios&&n.osversion&&n.osversion.split(".")[0]>=6||n.blackberry&&n.version>=10.1||n.chromium&&n.version>=20?n.a=a:n.msie&&n.version<10||n.chrome&&n.version<20||n.firefox&&n.version<20||n.safari&&n.version<6||n.opera&&n.version<10||n.ios&&n.osversion&&n.osversion.split(".")[0]<6||n.chromium&&n.version<20?n.c=a:n.x=a,n}function t(e){return e.split(".").length}function n(e,t){var n,r=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(n=0;n=0;){if(i[0][r]>i[1][r])return 1;if(i[0][r]!==i[1][r])return-1;if(0===r)return 0}}function i(t,n,i){var o=s;"string"==typeof n&&(i=n,n=void 0),void 0===n&&(n=!1),i&&(o=e(i));var a=""+o.version;for(var l in t)if(t.hasOwnProperty(l)&&o[l]){if("string"!=typeof t[l])throw new Error("Browser version in the minVersion map should be a string: "+l+": "+String(t));return r([a,t[l]])<0}return n}function o(e,t,n){return!i(e,t,n)}var a=!0,s=e("undefined"!=typeof navigator?navigator.userAgent||"":"");return s.test=function(e){for(var t=0;t=r())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+r().toString(16)+" bytes");return 0|e}function m(e){return+e!=e&&(e=0),o.alloc(+e)}function g(e,t){if(o.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return q(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return Q(e).length;default:if(r)return q(e).length;t=(""+t).toLowerCase(),r=!0}}function y(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if(n>>>=0,t>>>=0,n<=t)return"";for(e||(e="utf8");;)switch(e){case"hex":return M(this,t,n);case"utf8":case"utf-8":return x(this,t,n);case"ascii":return k(this,t,n);case"latin1":case"binary":return D(this,t,n);case"base64":return A(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return R(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function b(e,t,n,r,i){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof t&&(t=o.from(t,r)),o.isBuffer(t))return 0===t.length?-1:_(e,t,n,r,i);if("number"==typeof t)return t&=255,o.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):_(e,[t],n,r,i);throw new TypeError("val must be string, number or Buffer")}function _(e,t,n,r,i){function o(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}var a=1,s=e.length,l=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;a=2,s/=2,l/=2,n/=2}var u;if(i){var c=-1;for(u=n;us&&(n=s-l),u=n;u>=0;u--){for(var d=!0,f=0;fi&&(r=i):r=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");r>o/2&&(r=o/2);for(var a=0;a239?4:o>223?3:o>191?2:1;if(i+s<=n){var l,u,c,d;switch(s){case 1:o<128&&(a=o);break;case 2:l=e[i+1],128==(192&l)&&(d=(31&o)<<6|63&l)>127&&(a=d);break;case 3:l=e[i+1],u=e[i+2],128==(192&l)&&128==(192&u)&&(d=(15&o)<<12|(63&l)<<6|63&u)>2047&&(d<55296||d>57343)&&(a=d);break;case 4:l=e[i+1],u=e[i+2],c=e[i+3],128==(192&l)&&128==(192&u)&&128==(192&c)&&(d=(15&o)<<18|(63&l)<<12|(63&u)<<6|63&c)>65535&&d<1114112&&(a=d)}}null===a?(a=65533,s=1):a>65535&&(a-=65536,r.push(a>>>10&1023|55296),a=56320|1023&a),r.push(a),i+=s}return C(r)}function C(e){var t=e.length;if(t<=Z)return String.fromCharCode.apply(String,e);for(var n="",r=0;rr)&&(n=r);for(var i="",o=t;on)throw new RangeError("Trying to access beyond buffer length")}function N(e,t,n,r,i,a){if(!o.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||te.length)throw new RangeError("Index out of range")}function F(e,t,n,r){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-n,2);i>>8*(r?i:1-i)}function L(e,t,n,r){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-n,4);i>>8*(r?i:3-i)&255}function j(e,t,n,r,i,o){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function B(e,t,n,r,i){return i||j(e,t,n,4,3.4028234663852886e38,-3.4028234663852886e38),X.write(e,t,n,r,23,4),n+4}function U(e,t,n,r,i){return i||j(e,t,n,8,1.7976931348623157e308,-1.7976931348623157e308),X.write(e,t,n,r,52,8),n+8}function z(e){if(e=W(e).replace(ee,""),e.length<2)return"";for(;e.length%4!=0;)e+="=";return e}function W(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function V(e){return e<16?"0"+e.toString(16):e.toString(16)}function q(e,t){t=t||1/0;for(var n,r=e.length,i=null,o=[],a=0;a55295&&n<57344){if(!i){if(n>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(a+1===r){(t-=3)>-1&&o.push(239,191,189);continue}i=n;continue}if(n<56320){(t-=3)>-1&&o.push(239,191,189),i=n;continue}n=65536+(i-55296<<10|n-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,n<128){if((t-=1)<0)break;o.push(n)}else if(n<2048){if((t-=2)<0)break;o.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function H(e){for(var t=[],n=0;n>8,i=n%256,o.push(i),o.push(r);return o}function Q(e){return $.toByteArray(z(e))}function Y(e,t,n,r){for(var i=0;i=t.length||i>=e.length);++i)t[i+n]=e[i];return i}function K(e){return e!==e}var $=n(347),X=n(438),J=n(350);t.Buffer=o,t.SlowBuffer=m,t.INSPECT_MAX_BYTES=50,o.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=r(),o.poolSize=8192,o._augment=function(e){return e.__proto__=o.prototype,e},o.from=function(e,t,n){return a(null,e,t,n)},o.TYPED_ARRAY_SUPPORT&&(o.prototype.__proto__=Uint8Array.prototype,o.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&o[Symbol.species]===o&&Object.defineProperty(o,Symbol.species,{value:null,configurable:!0})),o.alloc=function(e,t,n){return l(null,e,t,n)},o.allocUnsafe=function(e){return u(null,e)},o.allocUnsafeSlow=function(e){return u(null,e)},o.isBuffer=function(e){return!(null==e||!e._isBuffer)},o.compare=function(e,t){if(!o.isBuffer(e)||!o.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var n=e.length,r=t.length,i=0,a=Math.min(n,r);i0&&(e=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(e+=" ... ")),""},o.prototype.compare=function(e,t,n,r,i){if(!o.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),t<0||n>e.length||r<0||i>this.length)throw new RangeError("out of range index");if(r>=i&&t>=n)return 0;if(r>=i)return-1;if(t>=n)return 1;if(t>>>=0,n>>>=0,r>>>=0,i>>>=0,this===e)return 0;for(var a=i-r,s=n-t,l=Math.min(a,s),u=this.slice(r,i),c=e.slice(t,n),d=0;di)&&(n=i),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var o=!1;;)switch(r){case"hex":return E(this,e,t,n);case"utf8":case"utf-8":return S(this,e,t,n);case"ascii":return O(this,e,t,n);case"latin1":case"binary":return w(this,e,t,n);case"base64":return T(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,e,t,n);default:if(o)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),o=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Z=4096;o.prototype.slice=function(e,t){var n=this.length;e=~~e,t=void 0===t?n:~~t,e<0?(e+=n)<0&&(e=0):e>n&&(e=n),t<0?(t+=n)<0&&(t=0):t>n&&(t=n),t0&&(i*=256);)r+=this[e+--t]*i;return r},o.prototype.readUInt8=function(e,t){return t||I(e,1,this.length),this[e]},o.prototype.readUInt16LE=function(e,t){return t||I(e,2,this.length),this[e]|this[e+1]<<8},o.prototype.readUInt16BE=function(e,t){return t||I(e,2,this.length),this[e]<<8|this[e+1]},o.prototype.readUInt32LE=function(e,t){return t||I(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},o.prototype.readUInt32BE=function(e,t){return t||I(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},o.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||I(e,t,this.length);for(var r=this[e],i=1,o=0;++o=i&&(r-=Math.pow(2,8*t)),r},o.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||I(e,t,this.length);for(var r=t,i=1,o=this[e+--r];r>0&&(i*=256);)o+=this[e+--r]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},o.prototype.readInt8=function(e,t){return t||I(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},o.prototype.readInt16LE=function(e,t){t||I(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},o.prototype.readInt16BE=function(e,t){t||I(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},o.prototype.readInt32LE=function(e,t){return t||I(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},o.prototype.readInt32BE=function(e,t){return t||I(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},o.prototype.readFloatLE=function(e,t){return t||I(e,4,this.length),X.read(this,e,!0,23,4)},o.prototype.readFloatBE=function(e,t){return t||I(e,4,this.length),X.read(this,e,!1,23,4)},o.prototype.readDoubleLE=function(e,t){return t||I(e,8,this.length),X.read(this,e,!0,52,8)},o.prototype.readDoubleBE=function(e,t){return t||I(e,8,this.length),X.read(this,e,!1,52,8)},o.prototype.writeUIntLE=function(e,t,n,r){if(e=+e,t|=0,n|=0,!r){N(this,e,t,n,Math.pow(2,8*n)-1,0)}var i=1,o=0;for(this[t]=255&e;++o=0&&(o*=256);)this[t+i]=e/o&255;return t+n},o.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,255,0),o.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},o.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},o.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,65535,0),o.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},o.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):L(this,e,t,!0),t+4},o.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,4294967295,0),o.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):L(this,e,t,!1),t+4},o.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);N(this,e,t,n,i-1,-i)}var o=0,a=1,s=0;for(this[t]=255&e;++o>0)-s&255;return t+n},o.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);N(this,e,t,n,i-1,-i)}var o=n-1,a=1,s=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)e<0&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+n},o.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,1,127,-128),o.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},o.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},o.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,2,32767,-32768),o.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},o.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),o.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):L(this,e,t,!0),t+4},o.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||N(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),o.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):L(this,e,t,!1),t+4},o.prototype.writeFloatLE=function(e,t,n){return B(this,e,t,!0,n)},o.prototype.writeFloatBE=function(e,t,n){return B(this,e,t,!1,n)},o.prototype.writeDoubleLE=function(e,t,n){return U(this,e,t,!0,n)},o.prototype.writeDoubleBE=function(e,t,n){return U(this,e,t,!1,n)},o.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t=0;--i)e[i+t]=this[i+n];else if(a<1e3||!o.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,n=void 0===n?this.length:n>>>0,e||(e=0);var a;if("number"==typeof e)for(a=t;a=r.minCardinalityForBin}return!0}},{name:"binAppliedForQuantitative",description:"bin should be applied to quantitative field only.",properties:[u.Property.TYPE,u.Property.BIN],allowWildcardForProperties:!1,strict:!0,satisfy:function(e,t,n,r){return!e.bin||e.type===s.Type.QUANTITATIVE}},{name:"channelFieldCompatible",description:"encoding channel's range type be compatible with channel type.",properties:[u.Property.CHANNEL,u.Property.TYPE,u.Property.BIN,u.Property.TIMEUNIT],allowWildcardForProperties:!1,strict:!0,satisfy:function(e,t,n,i){var a=r({field:"f"},h.toFieldDef(e,["bin","timeUnit","type"]));return o.channelCompatibility(a,e.channel).compatible}},{name:"hasFn",description:"A field with as hasFn flag should have one of aggregate, timeUnit, or bin.",properties:[u.Property.AGGREGATE,u.Property.BIN,u.Property.TIMEUNIT],allowWildcardForProperties:!0,strict:!0,satisfy:function(e,t,n,r){return!e.hasFn||(!!e.aggregate||!!e.bin||!!e.timeUnit)}},{name:"omitScaleZeroWithBinnedField",description:"Do not use scale zero with binned field",properties:[u.Property.SCALE,u.getEncodingNestedProp("scale","zero"),u.Property.BIN],allowWildcardForProperties:!1,strict:!0,satisfy:function(e,t,n,r){return!e.bin||!e.scale||!0!==e.scale.zero}},{name:"onlyOneTypeOfFunction",description:"Only of of aggregate, autoCount, timeUnit, or bin should be applied at the same time.",properties:[u.Property.AGGREGATE,u.Property.AUTOCOUNT,u.Property.TIMEUNIT,u.Property.BIN],allowWildcardForProperties:!0,strict:!0,satisfy:function(e,t,n,r){if(h.isFieldQuery(e)){return(!d.isWildcard(e.aggregate)&&e.aggregate?1:0)+(!d.isWildcard(e.bin)&&e.bin?1:0)+(!d.isWildcard(e.timeUnit)&&e.timeUnit?1:0)<=1}return!0}},{name:"timeUnitAppliedForTemporal",description:"Time unit should be applied to temporal field only.",properties:[u.Property.TYPE,u.Property.TIMEUNIT],allowWildcardForProperties:!1,strict:!0,satisfy:function(e,t,n,r){return!e.timeUnit||e.type===s.Type.TEMPORAL}},{name:"timeUnitShouldHaveVariation",description:"A particular time unit should be applied only if they produce unique values.",properties:[u.Property.TIMEUNIT,u.Property.TYPE],allowWildcardForProperties:!1,strict:!1,satisfy:function(e,t,n,r){return!e.timeUnit||e.type!==s.Type.TEMPORAL||(!n.has("timeUnit")&&!r.constraintManuallySpecifiedValue||t.timeUnitHasVariation(e))}},{name:"scalePropertiesSupportedByScaleType",description:"Scale properties must be supported by correct scale type",properties:[].concat(u.SCALE_PROPS,[u.Property.SCALE,u.Property.TYPE]),allowWildcardForProperties:!0,strict:!0,satisfy:function(e,t,n,r){if(e.scale){var i=e.scale,o=h.scaleType(e);if(void 0===o||null===o)return!0;for(var s in i)if("type"!==s&&"name"!==s&&"enum"!==s){var l=s;if("point"===o){if(!a.scaleTypeSupportProperty("point",l)&&!a.scaleTypeSupportProperty("band",l))return!1}else if(!a.scaleTypeSupportProperty(o,l))return!1}}return!0}},{name:"scalePropertiesSupportedByChannel",description:"Not all scale properties are supported by all encoding channels",properties:[].concat(u.SCALE_PROPS,[u.Property.SCALE,u.Property.CHANNEL]),allowWildcardForProperties:!0,strict:!0,satisfy:function(e,t,n,r){if(e){var i=e.channel,o=e.scale;if(i&&!d.isWildcard(i)&&o){if("row"===i||"column"===i)return!1;for(var s in o)if(o.hasOwnProperty(s)&&"type"!==s&&"name"!==s&&"enum"!==s){var l=void 0===a.channelScalePropertyIncompatability(i,s);if(!l)return!1}}}return!0}},{name:"typeMatchesPrimitiveType",description:"Data type should be supported by field's primitive type.",properties:[u.Property.FIELD,u.Property.TYPE],allowWildcardForProperties:!1,strict:!0,satisfy:function(e,t,n,r){if("*"===e.field)return!0;var i=t.primitiveType(e.field),o=e.type;if(!n.has("field")&&!n.has("type")&&!r.constraintManuallySpecifiedValue)return!0;switch(i){case f.PrimitiveType.BOOLEAN:case f.PrimitiveType.STRING:return o!==s.Type.QUANTITATIVE&&o!==s.Type.TEMPORAL;case f.PrimitiveType.NUMBER:case f.PrimitiveType.INTEGER:return o!==s.Type.TEMPORAL;case f.PrimitiveType.DATETIME:return o===s.Type.TEMPORAL;case null:return!1}throw new Error("Not implemented")}},{name:"typeMatchesSchemaType",description:"Enumerated data type of a field should match the field's type in the schema.",properties:[u.Property.FIELD,u.Property.TYPE],allowWildcardForProperties:!1,strict:!1,satisfy:function(e,t,n,r){return!(n.has("field")||n.has("type")||r.constraintManuallySpecifiedValue)||("*"===e.field?e.type===s.Type.QUANTITATIVE:t.vlType(e.field)===e.type)}},{name:"maxCardinalityForCategoricalColor",description:"Categorical channel should not have too high cardinality",properties:[u.Property.CHANNEL,u.Property.FIELD],allowWildcardForProperties:!1,strict:!1,satisfy:function(e,t,n,r){return e.channel!==i.Channel.COLOR||e.type!==s.Type.NOMINAL&&e.type!==l.ExpandedType.KEY||t.cardinality(e)<=r.maxCardinalityForCategoricalColor}},{name:"maxCardinalityForFacet",description:"Row/column channel should not have too high cardinality",properties:[u.Property.CHANNEL,u.Property.FIELD,u.Property.BIN,u.Property.TIMEUNIT],allowWildcardForProperties:!1,strict:!1,satisfy:function(e,t,n,r){return e.channel!==i.Channel.ROW&&e.channel!==i.Channel.COLUMN||t.cardinality(e)<=r.maxCardinalityForFacet}},{name:"maxCardinalityForShape",description:"Shape channel should not have too high cardinality",properties:[u.Property.CHANNEL,u.Property.FIELD,u.Property.BIN,u.Property.TIMEUNIT],allowWildcardForProperties:!1,strict:!1,satisfy:function(e,t,n,r){return e.channel!==i.Channel.SHAPE||t.cardinality(e)<=r.maxCardinalityForShape}},{name:"dataTypeAndFunctionMatchScaleType",description:"Scale type must match data type",properties:[u.Property.TYPE,u.Property.SCALE,u.getEncodingNestedProp("scale","type"),u.Property.TIMEUNIT,u.Property.BIN],allowWildcardForProperties:!1,strict:!0,satisfy:function(e,t,n,r){if(e.scale){var i=e.type,o=h.scaleType(e);if(l.isDiscrete(i))return void 0===o||a.hasDiscreteDomain(o);if(i===s.Type.TEMPORAL)return e.timeUnit?p.contains([a.ScaleType.TIME,a.ScaleType.UTC,void 0],o)||a.hasDiscreteDomain(o):p.contains([a.ScaleType.TIME,a.ScaleType.UTC,void 0],o);if(i===s.Type.QUANTITATIVE)return e.bin?p.contains([a.ScaleType.LINEAR,void 0],o):p.contains([a.ScaleType.LOG,a.ScaleType.POW,a.ScaleType.SQRT,a.ScaleType.QUANTILE,a.ScaleType.QUANTIZE,a.ScaleType.LINEAR,void 0],o)}return!0}}].map(function(e){return new m.EncodingConstraintModel(e)}),t.FIELD_CONSTRAINT_INDEX=t.FIELD_CONSTRAINTS.reduce(function(e,t){return e[t.name()]=t,e},{}),t.FIELD_CONSTRAINTS_BY_PROPERTY=t.FIELD_CONSTRAINTS.reduce(function(e,t){for(var n=0,r=t.properties();n1&&(o||n.constraintManuallySpecifiedValue)))return!1}}return!0}},{name:"omitNonPositionalOrFacetOverPositionalChannels",description:"Do not use non-positional channels unless all positional channels are used",properties:[p.Property.CHANNEL],allowWildcardForProperties:!1,strict:!1,satisfy:function(e,t,n){for(var r=e.specQuery.encodings,i=!1,o=!1,s=!1,l=!1,u=0;ue.score)return n}return e},{type:"Dimension",feature:"No Dimension",score:-5}),[]},t}(i.Scorer);t.DimensionScorer=a},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),i=this&&this.__assign||Object.assign||function(e){for(var t,n=1,r=arguments.length;ne.score?o:e},null);l.push(t)}),l},n}(s.Scorer);t.TypeChannelScorer=l},function(e,t,n){"use strict";function r(e,t,n){var r=e.wildcardIndex.encodingIndicesByProperty.get("field");if(!r)return{score:0,features:[]};for(var o=e.specQuery.encodings,a=t.fieldSchemas.length,s=[],l=0,u=1,c=r.length-1;c>=0;c--){var d=r[c],f=o[d],p=void 0;if(i.isFieldQuery(f)){p=f.field;var h=e.wildcardIndex.encodings[d].get("field"),m=t.fieldSchema(p).index,g=-m*u;l+=g,s.push({score:g,type:"fieldOrder",feature:"field "+h.name+" is "+p+" (#"+m+" in the schema)"}),u*=a}}return{score:l,features:s}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(14);t.name="fieldOrder",t.score=r},function(e,t,n){"use strict";function r(e,t){f[e]=t}function i(e){return f[e]}function o(e,t,n,r){return t.nest&&r!==t.nest.length?(e.items.forEach(function(e){o(e,t,n,r+1)}),t.nest[r].orderGroupBy&&e.items.sort(s(t.nest[r].orderGroupBy,n,t.config))):(t.orderBy||t.chooseBy)&&(e.items.sort(a(t.orderBy||t.chooseBy,n,t.config)),t.chooseBy&&e.items.length>0&&e.items.splice(1)),e}function a(e,t,n){return function(r,i){return e instanceof Array?l(e,r,i,t,n):l([e],r,i,t,n)}}function s(e,t,n){return function(r,i){var o=c.getTopSpecQueryItem(r),a=c.getTopSpecQueryItem(i);return e instanceof Array?l(e,o,a,t,n):l([e],o,a,t,n)}}function l(e,t,n,r,i){for(var o=0,a=e;or.smallRangeStepForHighCardinalityOrFacet.maxCardinality)){void 0===i.scale&&(i.scale={});var o=c.scaleType(i);i.scale&&(void 0===o||l.hasDiscreteDomain(o))&&(i.scale.rangeStep||(i.scale.rangeStep=12))}var a=n[s.Channel.X];if(c.isFieldQuery(a)&&(n[s.Channel.COLUMN]||t.cardinality(a)>r.smallRangeStepForHighCardinalityOrFacet.maxCardinality)){void 0===a.scale&&(a.scale={});var u=c.scaleType(a);a.scale&&(void 0===u||l.hasDiscreteDomain(u))&&(a.scale.rangeStep||(a.scale.rangeStep=12))}return e}function o(e,t,n,r){n[s.Channel.COLOR]=e.getEncodingQueryByChannel(s.Channel.COLOR);var i=n[s.Channel.COLOR];return c.isFieldQuery(i)&&void 0!==i&&(i.type===u.Type.NOMINAL||i.type===d.ExpandedType.KEY)&&t.cardinality(i)>r.nominalColorScaleForHighCardinality.maxCardinality&&(void 0===i.scale&&(i.scale={}),i.scale&&(i.scale.range||(i.scale.scheme=r.nominalColorScaleForHighCardinality.palette))),e}function a(e,t,n,r){if([s.Channel.COLUMN,s.Channel.X,s.Channel.Y].forEach(function(t){n[t]=e.getEncodingQueryByChannel(t)}),void 0===n[s.Channel.COLUMN]){var i=n[s.Channel.X],o=n[s.Channel.Y];c.isFieldQuery(i)&&c.isFieldQuery(o)&&void 0!==o&&o.field&&l.hasDiscreteDomain(c.scaleType(o))&&void 0!==i&&t.cardinality(o)>r.xAxisOnTopForHighYCardinalityWithoutColumn.maxCardinality&&(void 0===i.axis&&(i.axis={}),i.axis&&!i.axis.orient&&(i.axis.orient="top"))}return e}Object.defineProperty(t,"__esModule",{value:!0});var s=n(3),l=n(5),u=n(16),c=n(14),d=n(31);t.stylize=r,t.smallRangeStepForHighCardinalityOrFacet=i,t.nominalColorScaleForHighCardinality=o,t.xAxisOnTopForHighYCardinalityWithoutColumn=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(18),i=n(48),o=function(){function e(){this._mark=void 0,this._encodings={},this._encodingIndicesByProperty=new i.PropIndex}return e.prototype.setEncodingProperty=function(e,t,n){var r=this._encodings;(r[e]=r[e]||new i.PropIndex).set(t,n);var o=this._encodingIndicesByProperty;return o.set(t,o.get(t)||[]),o.get(t).push(e),this},e.prototype.hasEncodingProperty=function(e,t){return!!this._encodings[e]&&this._encodings[e].has(t)},e.prototype.hasProperty=function(e){if(r.isEncodingProperty(e))return this.encodingIndicesByProperty.has(e);if("mark"===e)return!!this.mark;throw new Error("Unimplemented for property "+e)},e.prototype.isEmpty=function(){return!this.mark&&0===this.encodingIndicesByProperty.size()},e.prototype.setMark=function(e){return this._mark=e,this},Object.defineProperty(e.prototype,"mark",{get:function(){return this._mark},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"encodings",{get:function(){return this._encodings},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"encodingIndicesByProperty",{get:function(){return this._encodingIndicesByProperty},enumerable:!0,configurable:!0}),e}();t.WildcardIndex=o},function(e,t,n){function r(e){if(!e||!e.nodeType)throw new Error("A DOM element reference is required");this.el=e,this.list=e.classList}try{var i=n(189)}catch(e){var i=n(189)}var o=Object.prototype.toString;e.exports=function(e){return new r(e)},r.prototype.add=function(e){if(this.list)return this.list.add(e),this;var t=this.array();return~i(t,e)||t.push(e),this.el.className=t.join(" "),this},r.prototype.remove=function(e){if("[object RegExp]"==o.call(e))return this.removeMatching(e);if(this.list)return this.list.remove(e),this;var t=this.array(),n=i(t,e);return~n&&t.splice(n,1),this.el.className=t.join(" "),this},r.prototype.removeMatching=function(e){for(var t=this.array(),n=0;nc;)if((s=l[c++])!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===n)return e||c||0;return!e&&-1}}},function(e,t,n){var r=n(127),i=n(37)("toStringTag"),o="Arguments"==r(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=a(t=Object(e),i))?n:o?r(t):"Object"==(s=r(t))&&"function"==typeof t.callee?"Arguments":s}},function(e,t,n){"use strict";var r=n(51),i=n(80);e.exports=function(e,t,n){t in e?r.f(e,t,i(0,n)):e[t]=n}},function(e,t,n){var r=n(79),i=n(134),o=n(100);e.exports=function(e){var t=r(e),n=i.f;if(n)for(var a,s=n(e),l=o.f,u=0;s.length>u;)l.call(e,a=s[u++])&&t.push(a);return t}},function(e,t,n){e.exports=n(50).document&&document.documentElement},function(e,t,n){var r=n(78),i=n(37)("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||o[i]===e)}},function(e,t,n){var r=n(127);e.exports=Array.isArray||function(e){return"Array"==r(e)}},function(e,t,n){var r=n(71);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&r(o.call(e)),t}}},function(e,t,n){"use strict";var r=n(132),i=n(80),o=n(135),a={};n(73)(a,n(37)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:i(1,n)}),o(e,t+" Iterator")}},function(e,t,n){var r=n(37)("iterator"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o=[7],a=o[r]();a.next=function(){return{done:n=!0}},o[r]=function(){return a},e(o)}catch(e){}return n}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){var r=n(79),i=n(52);e.exports=function(e,t){for(var n,o=i(e),a=r(o),s=a.length,l=0;s>l;)if(o[n=a[l++]]===t)return n}},function(e,t,n){var r=n(102)("meta"),i=n(77),o=n(61),a=n(51).f,s=0,l=Object.isExtensible||function(){return!0},u=!n(72)(function(){return l(Object.preventExtensions({}))}),c=function(e){a(e,r,{value:{i:"O"+ ++s,w:{}}})},d=function(e,t){if(!i(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!o(e,r)){if(!l(e))return"F";if(!t)return"E";c(e)}return e[r].i},f=function(e,t){if(!o(e,r)){if(!l(e))return!0;if(!t)return!1;c(e)}return e[r].w},p=function(e){return u&&h.NEED&&l(e)&&!o(e,r)&&c(e),e},h=e.exports={KEY:r,NEED:!1,fastKey:d,getWeak:f,onFreeze:p}},function(e,t,n){"use strict";var r=n(79),i=n(134),o=n(100),a=n(101),s=n(192),l=Object.assign;e.exports=!l||n(72)(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=l({},e)[n]||Object.keys(l({},t)).join("")!=r})?function(e,t){for(var n=a(e),l=arguments.length,u=1,c=i.f,d=o.f;l>u;)for(var f,p=s(arguments[u++]),h=c?r(p).concat(c(p)):r(p),m=h.length,g=0;m>g;)d.call(p,f=h[g++])&&(n[f]=p[f]);return n}:l},function(e,t,n){var r=n(51),i=n(71),o=n(79);e.exports=n(60)?Object.defineProperties:function(e,t){i(e);for(var n,a=o(t),s=a.length,l=0;s>l;)r.f(e,n=a[l++],t[n]);return e}},function(e,t,n){var r=n(52),i=n(194).f,o={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(e){try{return i(e)}catch(e){return a.slice()}};e.exports.f=function(e){return a&&"[object Window]"==o.call(e)?s(e):i(r(e))}},function(e,t,n){var r=n(77),i=n(71),o=function(e,t){if(i(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,r){try{r=n(128)(Function.call,n(133).f(Object.prototype,"__proto__").set,2),r(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return o(e,n),t?e.__proto__=n:r(e,n),e}}({},!1):void 0),check:o}},function(e,t,n){var r=n(138),i=n(129);e.exports=function(e){return function(t,n){var o,a,s=String(i(t)),l=r(n),u=s.length;return l<0||l>=u?e?"":void 0:(o=s.charCodeAt(l),o<55296||o>56319||l+1===u||(a=s.charCodeAt(l+1))<56320||a>57343?e?s.charAt(l):o:e?s.slice(l,l+2):a-56320+(o-55296<<10)+65536)}}},function(e,t,n){var r=n(138),i=Math.max,o=Math.min;e.exports=function(e,t){return e=r(e),e<0?i(e+t,0):o(e,t)}},function(e,t,n){var r=n(384),i=n(37)("iterator"),o=n(78);e.exports=n(25).getIteratorMethod=function(e){if(void 0!=e)return e[i]||e["@@iterator"]||o[r(e)]}},function(e,t,n){"use strict";var r=n(128),i=n(49),o=n(101),a=n(390),s=n(388),l=n(199),u=n(385),c=n(402);i(i.S+i.F*!n(392)(function(e){Array.from(e)}),"Array",{from:function(e){var t,n,i,d,f=o(e),p="function"==typeof this?this:Array,h=arguments.length,m=h>1?arguments[1]:void 0,g=void 0!==m,y=0,v=c(f);if(g&&(m=r(m,h>2?arguments[2]:void 0,2)),void 0==v||p==Array&&s(v))for(t=l(f.length),n=new p(t);t>y;y++)u(n,y,g?m(f[y],y):f[y]);else for(d=v.call(f),n=new p;!(i=d.next()).done;y++)u(n,y,g?a(d,m,[i.value,y],!0):i.value);return n.length=y,n}})},function(e,t,n){"use strict";var r=n(382),i=n(393),o=n(78),a=n(52);e.exports=n(193)(Array,"Array",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,i(1)):"keys"==t?i(0,n):"values"==t?i(0,e[n]):i(0,[n,e[n]])},"values"),o.Arguments=o.Array,r("keys"),r("values"),r("entries")},function(e,t,n){var r=n(49);r(r.S+r.F,"Object",{assign:n(396)})},function(e,t,n){var r=n(49);r(r.S,"Object",{create:n(132)})},function(e,t,n){var r=n(49);r(r.S+r.F*!n(60),"Object",{defineProperty:n(51).f})},function(e,t,n){var r=n(52),i=n(133).f;n(197)("getOwnPropertyDescriptor",function(){return function(e,t){return i(r(e),t)}})},function(e,t,n){var r=n(101),i=n(195);n(197)("getPrototypeOf",function(){return function(e){return i(r(e))}})},function(e,t,n){var r=n(49);r(r.S,"Object",{setPrototypeOf:n(399).set})},function(e,t){},function(e,t,n){"use strict";var r=n(50),i=n(61),o=n(60),a=n(49),s=n(198),l=n(395).KEY,u=n(72),c=n(137),d=n(135),f=n(102),p=n(37),h=n(141),m=n(140),g=n(394),y=n(386),v=n(389),b=n(71),_=n(52),E=n(139),S=n(80),O=n(132),w=n(398),T=n(133),P=n(51),A=n(79),x=T.f,C=P.f,k=w.f,D=r.Symbol,M=r.JSON,R=M&&M.stringify,I=p("_hidden"),N=p("toPrimitive"),F={}.propertyIsEnumerable,L=c("symbol-registry"),j=c("symbols"),B=c("op-symbols"),U=Object.prototype,z="function"==typeof D,W=r.QObject,V=!W||!W.prototype||!W.prototype.findChild,q=o&&u(function(){return 7!=O(C({},"a",{get:function(){return C(this,"a",{value:7}).a}})).a})?function(e,t,n){var r=x(U,t);r&&delete U[t],C(e,t,n),r&&e!==U&&C(U,t,r)}:C,H=function(e){var t=j[e]=O(D.prototype);return t._k=e,t},G=z&&"symbol"==typeof D.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof D},Q=function(e,t,n){return e===U&&Q(B,t,n),b(e),t=E(t,!0),b(n),i(j,t)?(n.enumerable?(i(e,I)&&e[I][t]&&(e[I][t]=!1),n=O(n,{enumerable:S(0,!1)})):(i(e,I)||C(e,I,S(1,{})),e[I][t]=!0),q(e,t,n)):C(e,t,n)},Y=function(e,t){b(e);for(var n,r=y(t=_(t)),i=0,o=r.length;o>i;)Q(e,n=r[i++],t[n]);return e},K=function(e,t){return void 0===t?O(e):Y(O(e),t)},$=function(e){var t=F.call(this,e=E(e,!0));return!(this===U&&i(j,e)&&!i(B,e))&&(!(t||!i(this,e)||!i(j,e)||i(this,I)&&this[I][e])||t)},X=function(e,t){if(e=_(e),t=E(t,!0),e!==U||!i(j,t)||i(B,t)){var n=x(e,t);return!n||!i(j,t)||i(e,I)&&e[I][t]||(n.enumerable=!0),n}},J=function(e){for(var t,n=k(_(e)),r=[],o=0;n.length>o;)i(j,t=n[o++])||t==I||t==l||r.push(t);return r},Z=function(e){for(var t,n=e===U,r=k(n?B:_(e)),o=[],a=0;r.length>a;)!i(j,t=r[a++])||n&&!i(U,t)||o.push(j[t]);return o};z||(D=function(){if(this instanceof D)throw TypeError("Symbol is not a constructor!");var e=f(arguments.length>0?arguments[0]:void 0),t=function(n){this===U&&t.call(B,n),i(this,I)&&i(this[I],e)&&(this[I][e]=!1),q(this,e,S(1,n))};return o&&V&&q(U,e,{configurable:!0,set:t}),H(e)},s(D.prototype,"toString",function(){return this._k}),T.f=X,P.f=Q,n(194).f=w.f=J,n(100).f=$,n(134).f=Z,o&&!n(131)&&s(U,"propertyIsEnumerable",$,!0),h.f=function(e){return H(p(e))}),a(a.G+a.W+a.F*!z,{Symbol:D});for(var ee="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),te=0;ee.length>te;)p(ee[te++]);for(var ee=A(p.store),te=0;ee.length>te;)m(ee[te++]);a(a.S+a.F*!z,"Symbol",{for:function(e){return i(L,e+="")?L[e]:L[e]=D(e)},keyFor:function(e){if(G(e))return g(L,e);throw TypeError(e+" is not a symbol!")},useSetter:function(){V=!0},useSimple:function(){V=!1}}),a(a.S+a.F*!z,"Object",{create:K,defineProperty:Q,defineProperties:Y,getOwnPropertyDescriptor:X,getOwnPropertyNames:J,getOwnPropertySymbols:Z}),M&&a(a.S+a.F*(!z||u(function(){var e=D();return"[null]"!=R([e])||"{}"!=R({a:e})||"{}"!=R(Object(e))})),"JSON",{stringify:function(e){if(void 0!==e&&!G(e)){for(var t,n,r=[e],i=1;arguments.length>i;)r.push(arguments[i++]);return t=r[1],"function"==typeof t&&(n=t),!n&&v(t)||(t=function(e,t){if(n&&(t=n.call(this,e,t)),!G(t))return t}),r[1]=t,R.apply(M,r)}}}),D.prototype[N]||n(73)(D.prototype,N,D.prototype.valueOf),d(D,"Symbol"),d(Math,"Math",!0),d(r.JSON,"JSON",!0)},function(e,t,n){n(140)("asyncIterator")},function(e,t,n){n(140)("observable")},function(e,t,n){n(404);for(var r=n(50),i=n(73),o=n(78),a=n(37)("toStringTag"),s=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],l=0;l<5;l++){var u=s[l],c=r[u],d=c&&c.prototype;d&&!d[a]&&i(d,a,u),o[u]=o.Array}},function(e,t,n){"use strict";function r(e){return e}function i(e,t,n){function i(e,t,n){for(var r in t)t.hasOwnProperty(r)&&u("function"==typeof t[r],"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.",e.displayName||"ReactClass",o[n],r)}function d(e,t){var n=E.hasOwnProperty(t)?E[t]:null;T.hasOwnProperty(t)&&l("OVERRIDE_BASE"===n,"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",t),e&&l("DEFINE_MANY"===n||"DEFINE_MANY_MERGED"===n,"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",t)}function f(e,n){if(!n){var r=typeof n;return void u("object"===r&&null!==n,"%s: You're attempting to include a mixin that is either null or not an object. Check the mixins included by the component, as well as any mixins they include themselves. Expected object but got %s.",e.displayName||"ReactClass",null===n?null:r)}l("function"!=typeof n,"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."),l(!t(n),"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.");var i=e.prototype,o=i.__reactAutoBindPairs;n.hasOwnProperty(c)&&S.mixins(e,n.mixins);for(var a in n)if(n.hasOwnProperty(a)&&a!==c){var s=n[a],f=i.hasOwnProperty(a);if(d(f,a),S.hasOwnProperty(a))S[a](e,s);else{var p=E.hasOwnProperty(a),h="function"==typeof s,y=h&&!p&&!f&&!1!==n.autobind;if(y)o.push(a,s),i[a]=s;else if(f){var v=E[a];l(p&&("DEFINE_MANY_MERGED"===v||"DEFINE_MANY"===v),"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",v,a),"DEFINE_MANY_MERGED"===v?i[a]=m(i[a],s):"DEFINE_MANY"===v&&(i[a]=g(i[a],s))}else i[a]=s,"function"==typeof s&&n.displayName&&(i[a].displayName=n.displayName+"_"+a)}}}function p(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var i=n in S;l(!i,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.',n);var o=n in e;l(!o,"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",n),e[n]=r}}}function h(e,t){l(e&&t&&"object"==typeof e&&"object"==typeof t,"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.");for(var n in t)t.hasOwnProperty(n)&&(l(void 0===e[n],"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.",n),e[n]=t[n]);return e}function m(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var i={};return h(i,n),h(i,r),i}}function g(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function y(e,t){var n=t.bind(e);n.__reactBoundContext=e,n.__reactBoundMethod=t,n.__reactBoundArguments=null;var r=e.constructor.displayName,i=n.bind;return n.bind=function(o){for(var a=arguments.length,s=Array(a>1?a-1:0),l=1;l0))return o;for(n(t,1),e(t),t=0;)for(;n(e,1),!r(e););})},r&&(s.count=function(t,n){return i.setTime(+t),o.setTime(+n),e(i),e(o),Math.floor(r(i,o))},s.every=function(e){return e=Math.floor(e),isFinite(e)&&e>0?e>1?s.filter(a?function(t){return a(t)%e==0}:function(t){return s.count(0,t)%e==0}):s:null}),s}function n(e){return t(function(t){t.setHours(0,0,0,0),t.setDate(t.getDate()-(t.getDay()+7-e)%7)},function(e,t){e.setDate(e.getDate()+7*t)},function(e,t){return(t-e-6e4*(t.getTimezoneOffset()-e.getTimezoneOffset()))/6048e5})}function r(e){return t(function(t){t.setUTCHours(0,0,0,0),t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7)},function(e,t){e.setUTCDate(e.getUTCDate()+7*t)},function(e,t){return(t-e)/6048e5})}var i=new Date,o=new Date,a=t(function(){},function(e,t){e.setTime(+e+t)},function(e,t){return t-e});a.every=function(e){return e=Math.floor(e),isFinite(e)&&e>0?e>1?t(function(t){t.setTime(Math.floor(t/e)*e)},function(t,n){t.setTime(+t+n*e)},function(t,n){return(n-t)/e}):a:null};var s=t(function(e){e.setMilliseconds(0)},function(e,t){e.setTime(+e+1e3*t)},function(e,t){return(t-e)/1e3},function(e){return e.getSeconds()}),l=t(function(e){e.setSeconds(0,0)},function(e,t){e.setTime(+e+6e4*t)},function(e,t){return(t-e)/6e4},function(e){return e.getMinutes()}),u=t(function(e){e.setMinutes(0,0,0)},function(e,t){e.setTime(+e+36e5*t)},function(e,t){return(t-e)/36e5},function(e){return e.getHours()}),c=t(function(e){e.setHours(0,0,0,0)},function(e,t){e.setDate(e.getDate()+t)},function(e,t){return(t-e-6e4*(t.getTimezoneOffset()-e.getTimezoneOffset()))/864e5},function(e){return e.getDate()-1}),d=n(0),f=n(1),p=n(2),h=n(3),m=n(4),g=n(5),y=n(6),v=t(function(e){e.setHours(0,0,0,0),e.setDate(1)},function(e,t){e.setMonth(e.getMonth()+t)},function(e,t){return t.getMonth()-e.getMonth()+12*(t.getFullYear()-e.getFullYear())},function(e){return e.getMonth()}),b=t(function(e){e.setHours(0,0,0,0),e.setMonth(0,1)},function(e,t){e.setFullYear(e.getFullYear()+t)},function(e,t){return t.getFullYear()-e.getFullYear()},function(e){return e.getFullYear()}),_=t(function(e){e.setUTCMilliseconds(0)},function(e,t){e.setTime(+e+1e3*t)},function(e,t){return(t-e)/1e3},function(e){return e.getUTCSeconds()}),E=t(function(e){e.setUTCSeconds(0,0)},function(e,t){e.setTime(+e+6e4*t)},function(e,t){return(t-e)/6e4},function(e){return e.getUTCMinutes()}),S=t(function(e){e.setUTCMinutes(0,0,0)},function(e,t){e.setTime(+e+36e5*t)},function(e,t){return(t-e)/36e5},function(e){return e.getUTCHours()}),O=t(function(e){e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCDate(e.getUTCDate()+t)},function(e,t){return(t-e)/864e5},function(e){return e.getUTCDate()-1}),w=r(0),T=r(1),P=r(2),A=r(3),x=r(4),C=r(5),k=r(6),D=t(function(e){e.setUTCHours(0,0,0,0),e.setUTCDate(1)},function(e,t){e.setUTCMonth(e.getUTCMonth()+t)},function(e,t){return t.getUTCMonth()-e.getUTCMonth()+12*(t.getUTCFullYear()-e.getUTCFullYear())},function(e){return e.getUTCMonth()}),M=t(function(e){e.setUTCHours(0,0,0,0),e.setUTCMonth(0,1)},function(e,t){e.setUTCFullYear(e.getUTCFullYear()+t)},function(e,t){return t.getUTCFullYear()-e.getUTCFullYear()},function(e){return e.getUTCFullYear()}),R=a.range,I=s.range,N=l.range,F=u.range,L=c.range,j=d.range,B=f.range,U=p.range,z=h.range,W=m.range,V=g.range,q=y.range,H=d.range,G=v.range,Q=b.range,Y=a,K=R,$=_.range,X=E.range,J=S.range,Z=O.range,ee=w.range,te=T.range,ne=P.range,re=A.range,ie=x.range,oe=C.range,ae=k.range,se=w.range,le=D.range,ue=M.range;e.version="0.1.1",e.milliseconds=R,e.seconds=I,e.minutes=N,e.hours=F,e.days=L,e.sundays=j,e.mondays=B,e.tuesdays=U,e.wednesdays=z,e.thursdays=W,e.fridays=V,e.saturdays=q,e.weeks=H,e.months=G,e.years=Q,e.utcMillisecond=Y,e.utcMilliseconds=K,e.utcSeconds=$,e.utcMinutes=X,e.utcHours=J,e.utcDays=Z,e.utcSundays=ee,e.utcMondays=te,e.utcTuesdays=ne,e.utcWednesdays=re,e.utcThursdays=ie,e.utcFridays=oe,e.utcSaturdays=ae,e.utcWeeks=se,e.utcMonths=le,e.utcYears=ue,e.millisecond=a,e.second=s,e.minute=l,e.hour=u,e.day=c,e.sunday=d,e.monday=f,e.tuesday=p,e.wednesday=h,e.thursday=m,e.friday=g,e.saturday=y,e.week=d,e.month=v,e.year=b,e.utcSecond=_,e.utcMinute=E,e.utcHour=S,e.utcDay=O,e.utcSunday=w,e.utcMonday=T,e.utcTuesday=P,e.utcWednesday=A,e.utcThursday=x,e.utcFriday=C,e.utcSaturday=k,e.utcWeek=w,e.utcMonth=D,e.utcYear=M,e.interval=t})},function(e,t,n){function r(e){if(!e)throw Error("Missing binning options.");var t,n,r,s,l,u,c,d=e.maxbins||15,f=e.base||10,p=Math.log(f),h=e.div||[5,2],m=e.min,g=e.max,y=g-m;if(e.step)t=e.step;else if(e.steps)t=e.steps[Math.min(e.steps.length-1,i(e.steps,y/d,0,e.steps.length))];else{for(n=Math.ceil(Math.log(d)/p),r=e.minstep||0,t=Math.max(r,Math.pow(f,Math.round(Math.log(y)/p)-n));Math.ceil(y/t)>d;)t*=f;for(u=0;u=r&&y/l<=d&&(t=l)}return l=Math.log(t),s=l>=0?0:1+~~(-l/p),c=Math.pow(f,-s-1),m=Math.min(m,Math.floor(m/t+c)*t),g=Math.ceil(g/t)*t,{start:m,stop:g,step:t,unit:{precision:s},value:o,index:a}}function i(e,t,n,r){for(;n>>1;u.cmp(e[i],t)<0?n=i+1:r=i}return n}function o(e){return this.step*Math.floor(e/this.step+d)}function a(e){return Math.floor((e-this.start)/this.step+d)}function s(e){return this.unit.date(o.call(this,e))}function l(e){return a.call(this,this.unit.unit(e))}var u=n(32),c=n(423),d=1e-15;r.date=function(e){if(!e)throw Error("Missing date binning options.");var t=e.utc?c.utc:c,n=e.min,i=e.max,o=e.maxbins||20,a=e.minbins||4,u=+i-+n,d=e.unit?t[e.unit]:t.find(u,a,o),f=r({min:null!=d.min?d.min:d.unit(n),max:null!=d.max?d.max:d.unit(i),maxbins:o,minstep:d.minstep,steps:d.step});return f.unit=d,f.index=l,e.raw||(f.value=s),f},e.exports=r},function(e,t,n){var r=n(32),i=e.exports;i.repeat=function(e,t){var n,r=Array(t);for(n=0;nt;)i.push(r);else for(;(r=e+n*++o)=e&&r<=t?1/n:0},r.cdf=function(r){return rt?1:(r-e)/n},r.icdf=function(t){return t>=0&&t<=1?e+t*n:NaN},r},i.random.integer=function(e,t){void 0===t&&(t=e,e=0);var n=t-e,r=function(){return e+Math.floor(n*Math.random())};return r.samples=function(e){return i.zeros(e).map(r)},r.pdf=function(r){return r===Math.floor(r)&&r>=e&&r=t?1:(i-e+1)/n},r.icdf=function(t){return t>=0&&t<=1?e-1+Math.floor(t*n):NaN},r},i.random.normal=function(e,t){e=e||0,t=t||1;var n,r=function(){var r,i,o=0,a=0;if(void 0!==n)return o=n,n=void 0,o;do{o=2*Math.random()-1,a=2*Math.random()-1,r=o*o+a*a}while(0===r||r>1);return i=Math.sqrt(-2*Math.log(r)/r),n=e+a*i*t,e+o*i*t};return r.samples=function(e){return i.zeros(e).map(r)},r.pdf=function(n){var r=Math.exp(Math.pow(n-e,2)/(-2*Math.pow(t,2)));return 1/(t*Math.sqrt(2*Math.PI))*r},r.cdf=function(n){var r,i=(n-e)/t,o=Math.abs(i);if(o>37)r=0;else{var a,s=Math.exp(-o*o/2);o<7.07106781186547?(a=.0352624965998911*o+.700383064443688,a=a*o+6.37396220353165,a=a*o+33.912866078383,a=a*o+112.079291497871,a=a*o+221.213596169931,a=a*o+220.206867912376,r=s*a,a=.0883883476483184*o+1.75566716318264,a=a*o+16.064177579207,a=a*o+86.7807322029461,a=a*o+296.564248779674,a=a*o+637.333633378831,a=a*o+793.826512519948,a=a*o+440.413735824752,r/=a):(a=o+.65,a=o+4/a,a=o+3/a,a=o+2/a,a=o+1/a,r=s/a/2.506628274631)}return i>0?1-r:r},r.icdf=function(n){if(n<=0||n>=1)return NaN;var r=2*n-1,i=8*(Math.PI-3)/(3*Math.PI*(4-Math.PI)),o=2/(Math.PI*i)+Math.log(1-Math.pow(r,2))/2,a=Math.log(1-r*r)/i,s=(r>0?1:-1)*Math.sqrt(Math.sqrt(o*o-a)-o);return e+t*Math.SQRT2*s},r},i.random.bootstrap=function(e,t){var n=e.filter(r.isValid),o=n.length,a=t?i.random.normal(0,t):null,s=function(){return n[~~(Math.random()*o)]+(a?a():0)};return s.samples=function(e){return i.zeros(e).map(s)},s}},function(e,t,n){function r(e,t,n){var r=e&&e.nullh||0,i=l.random.normal(0,1),o=u.mean(t,n),a=u.stdev(t,n)/Math.sqrt(u.count.valid(t,n));if(0===a)return o-r==0?1:0;var s=(o-r)/a;return 2*i.cdf(-Math.abs(s))}function i(e,t,n,r){var i,o=r?t.map(a.$(n)):t,s=r?t.map(a.$(r)):n,l=u.count(o),c=u.count(s),d=Array();if(l!==c)throw Error("Array lengths must match.");for(i=0;i0?Math.pow(s,1/n):0},u.mean.harmonic=function(e,t){t=a.$(t);var n,r,i,o,s=0;for(o=0,n=0,r=e.length;or&&(r=i));return[n,r]},u.extent.index=function(e,t){t=a.$(t);var n,r,i,o,s=-1,l=-1,u=e.length;for(o=0;or&&(r=i,l=o));return[s,l]},u.dot=function(e,t,n){var r,i,o=0;if(n)for(t=a.$(t),n=a.$(n),r=0;r-1&&c!==r){for(i=1+(n-1+u)/2;u-1)for(i=1+(s-1+u)/2;um)&&(m=l),n=l-c,c+=n/++d,g+=n*(l-c),y.push(l));return g/=d-1,r=Math.sqrt(g),y.sort(a.cmp),{type:s(e,t),unique:v,count:e.length,valid:d,missing:f,distinct:p,min:h,max:m,mean:c,stdev:r,median:o=u.quantile(y,.5),q1:u.quantile(y,.25),q3:u.quantile(y,.75),modeskew:0===r?0:(c-o)/r}},u.summary=function(e,t){t=t||a.keys(e[0]);var n=t.map(function(t){var n=u.profile(e,a.$(t));return n.field=t,n});return n.__summary__=!0,n}},function(e,t,n){function r(e){return u.setTime(+e),u}function i(e,t,n,r,i,o){var a={type:e,date:t,unit:n};return r?a.step=r:a.minstep=1,null!=i&&(a.min=i),null!=o&&(a.max=o),a}function o(e,t,n,r,o,a){return i(e,function(e){return t.offset(n,e)},function(e){return t.count(n,e)},r,o,a)}function a(e,t,n,r){var i,o,a,s=h[0];for(i=1,o=h.length;is[0]){if((a=t/s[0])>r)return e[h[i-1][1]];if(a>=n)return e[s[1]]}return e[h[o-1][1]]}function s(e){var t,n,r={};for(t=0,n=e.length;t=n.left&&a.left+s.width>n.right&&(s.width-=a.left+s.width-n.right),o.adjustX&&a.left+s.width>n.right&&(a.left=Math.max(n.right-s.width,n.left)),o.adjustY&&a.top=r.top&&a.top+s.height>r.bottom&&(s.height-=a.top+s.height-r.bottom),o.adjustY&&a.top+s.height>r.bottom&&(a.top=Math.max(r.bottom-s.height,r.top)),i.a.mix(a,s)}var i=n(82);t.a=r},function(e,t,n){"use strict";function r(e,t,r,o,a){var s=void 0,l=void 0,u=void 0,c=void 0;return s={left:e.left,top:e.top},u=n.i(i.a)(t,r[1]),c=n.i(i.a)(e,r[0]),l=[c.left-u.left,c.top-u.top],{left:s.left-l[0]+o[0]-a[0],top:s.top-l[1]+o[1]-a[1]}}var i=n(203);t.a=r},function(e,t,n){"use strict";function r(e){var t=void 0,n=void 0,r=void 0;if(i.a.isWindow(e)||9===e.nodeType){var o=i.a.getWindow(e);t={left:i.a.getWindowScrollLeft(o),top:i.a.getWindowScrollTop(o)},n=i.a.viewportWidth(o),r=i.a.viewportHeight(o)}else t=i.a.offset(e),n=i.a.outerWidth(e),r=i.a.outerHeight(e);return t.width=n,t.height=r,t}var i=n(82);t.a=r},function(e,t,n){"use strict";function r(e){for(var t={left:0,right:1/0,top:0,bottom:1/0},r=n.i(o.a)(e),a=void 0,s=void 0,l=void 0,u=i.a.getDocument(e),c=u.defaultView||u.parentWindow,d=u.body,f=u.documentElement;r;){if(-1!==navigator.userAgent.indexOf("MSIE")&&0===r.clientWidth||r===d||r===f||"visible"===i.a.css(r,"overflow")){if(r===d||r===f)break}else{var p=i.a.offset(r);p.left+=r.clientLeft,p.top+=r.clientTop,t.top=Math.max(t.top,p.top),t.right=Math.min(t.right,p.left+r.clientWidth),t.bottom=Math.min(t.bottom,p.top+r.clientHeight),t.left=Math.max(t.left,p.left)}r=n.i(o.a)(r)}return a=i.a.getWindowScrollLeft(c),s=i.a.getWindowScrollTop(c),t.left=Math.max(t.left,a),t.top=Math.max(t.top,s),l={width:i.a.viewportWidth(c),height:i.a.viewportHeight(c)},t.right=Math.min(t.right,a+l.width),t.bottom=Math.min(t.bottom,s+l.height),t.top>=0&&t.left>=0&&t.bottom>t.top&&t.right>t.left?t:null}var i=n(82),o=n(204);t.a=r},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t,n){return e.leftn.right}function o(e,t,n){return e.topn.bottom}function a(e,t,n){return e.left>n.right||e.left+t.widthn.bottom||e.top+t.height=t.right||r.top>=t.bottom}function u(e,t,n){var r=[];return g.a.each(e,function(e){r.push(e.replace(t,function(e){return n[e]}))}),r}function c(e,t){return e[t]=-e[t],e}function d(e,t){return(/%$/.test(e)?parseInt(e.substring(0,e.length-1),10)/100*t:parseInt(e,10))||0}function f(e){return e.bottom-e.top}function p(e){return e.right-e.left}function h(e,t){e[0]=d(e[0],t.width),e[1]=d(e[1],t.height)}function m(e,t,d){var m=d.points,y=d.offset||[0,0],O=d.targetOffset||[0,0],w=d.overflow,T=d.target||t,P=d.source||e;y=[].concat(y),O=[].concat(O),w=w||{};var A={},x=0,C=n.i(v.a)(P),k=n.i(_.a)(P),D=n.i(_.a)(T);h(y,k),h(O,D);var M=n.i(E.a)(k,D,m,y,O),R=g.a.merge(k,M),I=!l(T),N=g.a.merge(D,n.i(S.a)(D,m[1])),F=void 0,L=void 0,j=m[0].charAt(1);F="c"===j?g.a.merge(C,{left:N.left-k.width/2}):g.a.merge(C,r({},"l"===j?"left":"right",N.left+y[0]));var B=m[0].charAt(0);L="c"===B?g.a.merge(C,{top:N.top-k.height/2}):g.a.merge(C,r({},"t"===B?"top":"bottom",N.top+y[1]));var U=F,z=L;if(C&&(w.adjustX||w.adjustY)&&I){if(w.adjustX&&i(M,k,C)){var W=u(m,/[lr]/gi,{l:"r",r:"l"}),V=c(y,0),q=c(O,0),H=n.i(E.a)(k,D,W,V,q),G=g.a.merge(C,r({},"l"===W[0].charAt(1)?"left":"right",n.i(S.a)(D,W[1]).left));p(G)>p(F)&&!a(H,k,C)&&(x=1,m=W,y=V,O=q,U=G)}if(w.adjustY&&o(M,k,C)){var Q=u(m,/[tb]/gi,{t:"b",b:"t"}),Y=c(y,1),K=c(O,1),$=n.i(E.a)(k,D,Q,Y,K),X=g.a.merge(C,r({},"t"===Q[0].charAt(0)?"top":"bottom",n.i(S.a)(D,Q[1]).top));f(X)>f(L)&&!s($,k,C)&&(x=1,m=Q,y=Y,O=K,z=X)}x&&(M=n.i(E.a)(k,D,m,y,O),g.a.mix(R,M)),A.resizeHeight=w.resizeHeight,A.resizeWidth=w.resizeWidth,A.adjustX=w.adjustX&&i(M,k,U),A.adjustY=w.adjustY&&o(M,k,z),(A.adjustX||A.adjustY)&&(R=n.i(b.a)(M,k,U,z,A))}return R.width!==k.width&&g.a.css(P,"width",g.a.width(P)+R.width-k.width),R.height!==k.height&&g.a.css(P,"height",g.a.height(P)+R.height-k.height),g.a.offset(P,{left:R.left,top:R.top},{useCssRight:d.useCssRight,useCssBottom:d.useCssBottom,useCssTransform:d.useCssTransform}),{points:m,offset:y,targetOffset:O,overflow:A}}Object.defineProperty(t,"__esModule",{value:!0});var g=n(82),y=n(204),v=n(427),b=n(424),_=n(426),E=n(425),S=n(203);m.__getOffsetParent=y.a,m.__getVisibleRectForElement=v.a,t.default=m},function(e,t,n){"use strict";function r(){if(void 0!==d)return d;d="";var e=document.createElement("p").style;for(var t in f)t+"Transform"in e&&(d=t);return d}function i(){return r()?r()+"TransitionProperty":"transitionProperty"}function o(){return r()?r()+"Transform":"transform"}function a(e,t){var n=i();n&&(e.style[n]=t,"transitionProperty"!==n&&(e.style.transitionProperty=t))}function s(e,t){var n=o();n&&(e.style[n]=t,"transform"!==n&&(e.style.transform=t))}function l(e){return e.style.transitionProperty||e.style[i()]}function u(e){var t=window.getComputedStyle(e,null),n=t.getPropertyValue("transform")||t.getPropertyValue(o());if(n&&"none"!==n){var r=n.replace(/[^0-9\-.,]/g,"").split(",");return{x:parseFloat(r[12]||r[4],0),y:parseFloat(r[13]||r[5],0)}}return{x:0,y:0}}function c(e,t){var n=window.getComputedStyle(e,null),r=n.getPropertyValue("transform")||n.getPropertyValue(o());if(r&&"none"!==r){var i=void 0,a=r.match(p);if(a)a=a[1],i=a.split(",").map(function(e){return parseFloat(e,10)}),i[4]=t.x,i[5]=t.y,s(e,"matrix("+i.join(",")+")");else{i=r.match(h)[1].split(",").map(function(e){return parseFloat(e,10)}),i[12]=t.x,i[13]=t.y,s(e,"matrix3d("+i.join(",")+")")}}else s(e,"translateX("+t.x+"px) translateY("+t.y+"px) translateZ(0)")}t.e=o,t.b=a,t.a=l,t.c=u,t.d=c;var d=void 0,f={Webkit:"-webkit-",Moz:"-moz-",ms:"-ms-",O:"-o-"},p=/matrix\((.*)\)/,h=/matrix3d\((.*)\)/},function(e,t,n){"use strict";e.exports=document.createElement("div").style},function(e,t,n){"use strict";var r;e.exports=function(){if(r)return r;var e=window.getComputedStyle(document.documentElement,""),t=(Array.prototype.slice.call(e).join("").match(/-(moz|webkit|ms)-/)||""===e.OLink&&["","o"])[1];return r="-"+t+"-"}},function(e,t,n){"use strict";var r,i=n(430),o=["Moz","Webkit","O","ms"];e.exports=function(e,t){var n;if(e in i)return e;var a=e.charAt(0).toUpperCase()+e.substr(1);if(r){if((n=r+a)in i)return n}else for(var s=0;s-1?r:(r.push(e),t.className=r.join(" "),r)}},r.prototype.remove=function(e){var t=this.el;if(t&&""!==t.className){var r=t.className.split(" "),i=n(r,e);return i>-1&&r.splice(i,1),t.className=r.join(" "),r}},r.prototype.has=function(e){var t=this.el;if(t){return n(t.className.split(" "),e)>-1}},r.prototype.toggle=function(e){this.el&&(this.has(e)?this.remove(e):this.add(e))}},function(e,t,n){var r;!function(){"use strict";var i=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:i,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:i&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:i&&!!window.screen};void 0!==(r=function(){return o}.call(t,n,t,e))&&(e.exports=r)}()},function(e,t,n){"use strict";var r={};Object.freeze(r),e.exports=r},function(e,t,n){"use strict";function r(e){return e in a?a[e]:a[e]=e.replace(i,"-$&").toLowerCase().replace(o,"-ms-")}var i=/[A-Z]/g,o=/^ms-/,a={};e.exports=r},function(e,t){t.read=function(e,t,n,r,i){var o,a,s=8*i-r-1,l=(1<>1,c=-7,d=n?i-1:0,f=n?-1:1,p=e[t+d];for(d+=f,o=p&(1<<-c)-1,p>>=-c,c+=s;c>0;o=256*o+e[t+d],d+=f,c-=8);for(a=o&(1<<-c)-1,o>>=-c,c+=r;c>0;a=256*a+e[t+d],d+=f,c-=8);if(0===o)o=1-u;else{if(o===l)return a?NaN:1/0*(p?-1:1);a+=Math.pow(2,r),o-=u}return(p?-1:1)*a*Math.pow(2,o-r)},t.write=function(e,t,n,r,i,o){var a,s,l,u=8*o-i-1,c=(1<>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=r?0:o-1,h=r?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=c):(a=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-a))<1&&(a--,l*=2),t+=a+d>=1?f/l:f*Math.pow(2,1-d),t*l>=2&&(a++,l/=2),a+d>=c?(s=0,a=c):a+d>=1?(s=(t*l-1)*Math.pow(2,i),a+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,i),a=0));i>=8;e[n+p]=255&s,p+=h,s/=256,i-=8);for(a=a<0;e[n+p]=255&a,p+=h,a/=256,u-=8);e[n+p-h]|=128*m}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){var t=e.prefixMap,n=e.plugins,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(e){return e};return function(){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var r="undefined"!=typeof navigator?navigator.userAgent:void 0;if(this._userAgent=n.userAgent||r,this._keepUnprefixed=n.keepUnprefixed||!1,this._userAgent&&(this._browserInfo=(0,l.default)(this._userAgent)),!this._browserInfo||!this._browserInfo.cssPrefix)return this._useFallback=!0,!1;this.prefixedKeyframes=(0,c.default)(this._browserInfo.browserName,this._browserInfo.browserVersion,this._browserInfo.cssPrefix);var o=this._browserInfo.browserName&&t[this._browserInfo.browserName];if(o){this._requiresPrefix={};for(var a in o)o[a]>=this._browserInfo.browserVersion&&(this._requiresPrefix[a]=!0);this._hasPropsRequiringPrefix=Object.keys(this._requiresPrefix).length>0}else this._useFallback=!0;this._metaData={browserVersion:this._browserInfo.browserVersion,browserName:this._browserInfo.browserName,cssPrefix:this._browserInfo.cssPrefix,jsPrefix:this._browserInfo.jsPrefix,keepUnprefixed:this._keepUnprefixed,requiresPrefix:this._requiresPrefix}}return a(e,[{key:"prefix",value:function(e){return this._useFallback?r(e):this._hasPropsRequiringPrefix?this._prefixStyle(e):e}},{key:"_prefixStyle",value:function(e){for(var t in e){var r=e[t];if((0,g.default)(r))e[t]=this.prefix(r);else if(Array.isArray(r)){for(var i=[],o=0,a=r.length;o0&&(e[t]=i)}else{var l=(0,v.default)(n,t,r,e,this._metaData);l&&(e[t]=l),this._requiresPrefix[t]&&(e[this._browserInfo.jsPrefix+(0,f.default)(t)]=r,this._keepUnprefixed||delete e[t])}}return e}}],[{key:"prefixAll",value:function(e){return r(e)}}]),e}()}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n-1&&("chrome"===i||"opera"===i||"and_chr"===i||("ios_saf"===i||"safari"===i)&&a<10))return(0,o.default)(t.replace(/cross-fade\(/g,s+"cross-fade("),t,l)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i);e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n,r){var i=r.browserName,l=r.browserVersion,u=r.cssPrefix,c=r.keepUnprefixed;return"cursor"!==e||!a[t]||"firefox"!==i&&"chrome"!==i&&"safari"!==i&&"opera"!==i?"cursor"===e&&s[t]&&("firefox"===i&&l<24||"chrome"===i&&l<37||"safari"===i&&l<9||"opera"===i&&l<24)?(0,o.default)(u+t,t,c):void 0:(0,o.default)(u+t,t,c)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a={grab:!0,grabbing:!0},s={"zoom-in":!0,"zoom-out":!0};e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n,r){var i=r.browserName,a=r.browserVersion,s=r.cssPrefix,l=r.keepUnprefixed;if("string"==typeof t&&t.indexOf("filter(")>-1&&("ios_saf"===i||"safari"===i&&a<9.1))return(0,o.default)(t.replace(/filter\(/g,s+"filter("),t,l)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i);e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n,r){var i=r.browserName,s=r.browserVersion,l=r.cssPrefix,u=r.keepUnprefixed;if("display"===e&&a[t]&&("chrome"===i&&s<29&&s>20||("safari"===i||"ios_saf"===i)&&s<9&&s>6||"opera"===i&&(15===s||16===s)))return(0,o.default)(l+t,t,u)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a={flex:!0,"inline-flex":!0};e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n,r){var i=r.browserName,l=r.browserVersion,c=r.cssPrefix,d=r.keepUnprefixed,f=r.requiresPrefix;if((u.indexOf(e)>-1||"display"===e&&"string"==typeof t&&t.indexOf("flex")>-1)&&("firefox"===i&&l<22||"chrome"===i&&l<21||("safari"===i||"ios_saf"===i)&&l<=6.1||"android"===i&&l<4.4||"and_uc"===i)){if(delete f[e],d||Array.isArray(n[e])||delete n[e],"flexDirection"===e&&"string"==typeof t&&(t.indexOf("column")>-1?n.WebkitBoxOrient="vertical":n.WebkitBoxOrient="horizontal",t.indexOf("reverse")>-1?n.WebkitBoxDirection="reverse":n.WebkitBoxDirection="normal"),"display"===e&&a[t])return(0,o.default)(c+a[t],t,d);s[e]&&(n[s[e]]=a[t]||t)}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a={"space-around":"justify","space-between":"justify","flex-start":"start","flex-end":"end","wrap-reverse":"multiple",wrap:"multiple",flex:"box","inline-flex":"inline-box"},s={alignItems:"WebkitBoxAlign",justifyContent:"WebkitBoxPack",flexWrap:"WebkitBoxLines"},l=["alignContent","alignSelf","order","flexGrow","flexShrink","flexBasis","flexDirection"],u=Object.keys(s).concat(l);e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n,r){var i=r.browserName,s=r.browserVersion,l=r.cssPrefix,u=r.keepUnprefixed;if("string"==typeof t&&null!==t.match(a)&&("firefox"===i&&s<16||"chrome"===i&&s<26||("safari"===i||"ios_saf"===i)&&s<7||("opera"===i||"op_mini"===i)&&s<12.1||"android"===i&&s<4.4||"and_uc"===i))return(0,o.default)(l+t,t,u)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=/linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/;e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n,r){var i=r.browserName,a=r.cssPrefix,s=r.keepUnprefixed;if("string"==typeof t&&t.indexOf("image-set(")>-1&&("chrome"===i||"opera"===i||"and_chr"===i||"and_uc"===i||"ios_saf"===i||"safari"===i))return(0,o.default)(t.replace(/image-set\(/g,a+"image-set("),t,s)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i);e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n){var r=n.browserName,i=n.cssPrefix,a=n.keepUnprefixed;if("position"===e&&"sticky"===t&&("safari"===r||"ios_saf"===r))return(0,o.default)(i+t,t,a)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i);e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n,r){var i=r.cssPrefix,l=r.keepUnprefixed;if(a[e]&&s[t])return(0,o.default)(i+t,t,l)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a={maxHeight:!0,maxWidth:!0,width:!0,height:!0,columnWidth:!0,minWidth:!0,minHeight:!0},s={"min-content":!0,"max-content":!0,"fill-available":!0,"fit-content":!0,"contain-floats":!0};e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n,r){var o=r.cssPrefix,u=r.keepUnprefixed,c=r.requiresPrefix;if("string"==typeof t&&s[e]){var d=function(){l||(l=Object.keys(c).map(function(e){return(0,a.default)(e)}));var e=t.split(/,(?![^()]*(?:\([^()]*\))?\))/g);return l.forEach(function(t){e.forEach(function(n,r){n.indexOf(t)>-1&&"order"!==t&&(e[r]=n.replace(t,o+t)+(u?","+n:""))})}),{v:e.join(",")}}();if("object"===(void 0===d?"undefined":i(d)))return d.v}}Object.defineProperty(t,"__esModule",{value:!0});var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default=r;var o=n(201),a=function(e){return e&&e.__esModule?e:{default:e}}(o),s={transition:!0,transitionProperty:!0,WebkitTransition:!0,WebkitTransitionProperty:!0,MozTransition:!0,MozTransitionProperty:!0},l=void 0;e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){function t(e){for(var i in e){var o=e[i];if((0,f.default)(o))e[i]=t(o);else if(Array.isArray(o)){for(var s=[],u=0,d=o.length;u0&&(e[i]=s)}else{var h=(0,l.default)(r,i,o,e,n);h&&(e[i]=h),(0,a.default)(n,i,e)}}return e}var n=e.prefixMap,r=e.plugins;return t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(466),a=r(o),s=n(207),l=r(s),u=n(205),c=r(u),d=n(206),f=r(d);e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(451),o=r(i),a=n(463),s=r(a),l=n(454),u=r(l),c=n(453),d=r(c),f=n(455),p=r(f),h=n(456),m=r(h),g=n(457),y=r(g),v=n(458),b=r(v),_=n(459),E=r(_),S=n(460),O=r(S),w=n(461),T=r(w),P=n(462),A=r(P),x=[d.default,u.default,p.default,y.default,b.default,E.default,O.default,T.default,A.default,m.default];t.default=(0,o.default)({prefixMap:s.default.prefixMap,plugins:x}),e.exports=t.default},function(e,t,n){"use strict";function r(e,t){if("string"==typeof t&&!(0,o.default)(t)&&t.indexOf("cross-fade(")>-1)return a.map(function(e){return t.replace(/cross-fade\(/g,e+"cross-fade(")})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(81),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=["-webkit-",""];e.exports=t.default},function(e,t,n){"use strict";function r(e,t){if("cursor"===e&&o[t])return i.map(function(e){return e+t})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=["-webkit-","-moz-",""],o={"zoom-in":!0,"zoom-out":!0,grab:!0,grabbing:!0};e.exports=t.default},function(e,t,n){"use strict";function r(e,t){if("string"==typeof t&&!(0,o.default)(t)&&t.indexOf("filter(")>-1)return a.map(function(e){return t.replace(/filter\(/g,e+"filter(")})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(81),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=["-webkit-",""];e.exports=t.default},function(e,t,n){"use strict";function r(e,t){if("display"===e&&i[t])return["-webkit-box","-moz-box","-ms-"+t+"box","-webkit-"+t,t]}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i={flex:!0,"inline-flex":!0};e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n){"flexDirection"===e&&"string"==typeof t&&(t.indexOf("column")>-1?n.WebkitBoxOrient="vertical":n.WebkitBoxOrient="horizontal",t.indexOf("reverse")>-1?n.WebkitBoxDirection="reverse":n.WebkitBoxDirection="normal"),o[e]&&(n[o[e]]=i[t]||t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i={"space-around":"justify","space-between":"justify","flex-start":"start","flex-end":"end","wrap-reverse":"multiple",wrap:"multiple"},o={alignItems:"WebkitBoxAlign",justifyContent:"WebkitBoxPack",flexWrap:"WebkitBoxLines"};e.exports=t.default},function(e,t,n){"use strict";function r(e,t){if("string"==typeof t&&!(0,o.default)(t)&&null!==t.match(s))return a.map(function(e){return e+t})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(81),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=["-webkit-","-moz-",""],s=/linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/;e.exports=t.default},function(e,t,n){"use strict";function r(e,t){if("string"==typeof t&&!(0,o.default)(t)&&t.indexOf("image-set(")>-1)return a.map(function(e){return t.replace(/image-set\(/g,e+"image-set(")})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(81),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=["-webkit-",""];e.exports=t.default},function(e,t,n){"use strict";function r(e,t){if("position"===e&&"sticky"===t)return["-webkit-sticky","sticky"]}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r,e.exports=t.default},function(e,t,n){"use strict";function r(e,t){if(o[e]&&a[t])return i.map(function(e){return e+t})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=["-webkit-","-moz-",""],o={maxHeight:!0,maxWidth:!0,width:!0,height:!0,columnWidth:!0,minWidth:!0,minHeight:!0},a={"min-content":!0,"max-content":!0,"fill-available":!0,"fit-content":!0,"contain-floats":!0};e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if((0,u.default)(e))return e;for(var n=e.split(/,(?![^()]*(?:\([^()]*\))?\))/g),r=0,i=n.length;r-1&&"order"!==c)for(var d=t[l],f=0,h=d.length;f-1)return a;var s=o.split(/,(?![^()]*(?:\([^()]*\))?\))/g).filter(function(e){return null===e.match(/-webkit-|-ms-/)}).join(",");return e.indexOf("Moz")>-1?s:(n["Webkit"+(0,d.default)(e)]=a,n["Moz"+(0,d.default)(e)]=s,o)}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o;var a=n(201),s=r(a),l=n(81),u=r(l),c=n(146),d=r(c),f={transition:!0,transitionProperty:!0,WebkitTransition:!0,WebkitTransitionProperty:!0,MozTransition:!0,MozTransitionProperty:!0},p={Webkit:"-webkit-",Moz:"-moz-",ms:"-ms-"};e.exports=t.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={plugins:[],prefixMap:{appearance:["Webkit","Moz"],userSelect:["Webkit","Moz","ms"],textEmphasisPosition:["Webkit"],textEmphasis:["Webkit"],textEmphasisStyle:["Webkit"],textEmphasisColor:["Webkit"],boxDecorationBreak:["Webkit"],clipPath:["Webkit"],maskImage:["Webkit"],maskMode:["Webkit"],maskRepeat:["Webkit"],maskPosition:["Webkit"],maskClip:["Webkit"],maskOrigin:["Webkit"],maskSize:["Webkit"],maskComposite:["Webkit"],mask:["Webkit"],maskBorderSource:["Webkit"],maskBorderMode:["Webkit"],maskBorderSlice:["Webkit"],maskBorderWidth:["Webkit"],maskBorderOutset:["Webkit"],maskBorderRepeat:["Webkit"],maskBorder:["Webkit"],maskType:["Webkit"],textDecorationStyle:["Webkit"],textDecorationSkip:["Webkit"],textDecorationLine:["Webkit"],textDecorationColor:["Webkit"],filter:["Webkit"],fontFeatureSettings:["Webkit"],breakAfter:["Webkit","Moz","ms"],breakBefore:["Webkit","Moz","ms"],breakInside:["Webkit","Moz","ms"],columnCount:["Webkit","Moz"],columnFill:["Webkit","Moz"],columnGap:["Webkit","Moz"],columnRule:["Webkit","Moz"],columnRuleColor:["Webkit","Moz"],columnRuleStyle:["Webkit","Moz"],columnRuleWidth:["Webkit","Moz"],columns:["Webkit","Moz"],columnSpan:["Webkit","Moz"],columnWidth:["Webkit","Moz"],flex:["Webkit"],flexBasis:["Webkit"],flexDirection:["Webkit"],flexGrow:["Webkit"],flexFlow:["Webkit"],flexShrink:["Webkit"],flexWrap:["Webkit"],alignContent:["Webkit"],alignItems:["Webkit"],alignSelf:["Webkit"],justifyContent:["Webkit"],order:["Webkit"],transform:["Webkit"],transformOrigin:["Webkit"],transformOriginX:["Webkit"],transformOriginY:["Webkit"],backfaceVisibility:["Webkit"],perspective:["Webkit"],perspectiveOrigin:["Webkit"],transformStyle:["Webkit"],transformOriginZ:["Webkit"],animation:["Webkit"],animationDelay:["Webkit"],animationDirection:["Webkit"],animationFillMode:["Webkit"],animationDuration:["Webkit"],animationIterationCount:["Webkit"],animationName:["Webkit"],animationPlayState:["Webkit"],animationTimingFunction:["Webkit"],backdropFilter:["Webkit"],fontKerning:["Webkit"],scrollSnapType:["Webkit","ms"],scrollSnapPointsX:["Webkit","ms"],scrollSnapPointsY:["Webkit","ms"],scrollSnapDestination:["Webkit","ms"],scrollSnapCoordinate:["Webkit","ms"],shapeImageThreshold:["Webkit"],shapeImageMargin:["Webkit"],shapeImageOutside:["Webkit"],hyphens:["Webkit","Moz","ms"],flowInto:["Webkit","ms"],flowFrom:["Webkit","ms"],regionFragment:["Webkit","ms"],textAlignLast:["Moz"],tabSize:["Moz"],wrapFlow:["ms"],wrapThrough:["ms"],wrapMargin:["ms"],gridTemplateColumns:["ms"],gridTemplateRows:["ms"],gridTemplateAreas:["ms"],gridTemplate:["ms"],gridAutoColumns:["ms"],gridAutoRows:["ms"],gridAutoFlow:["ms"],grid:["ms"],gridRowStart:["ms"],gridColumnStart:["ms"],gridRowEnd:["ms"],gridRow:["ms"],gridColumn:["ms"],gridColumnEnd:["ms"],gridColumnGap:["ms"],gridRowGap:["ms"],gridArea:["ms"],gridGap:["ms"],textSizeAdjust:["Webkit","ms"],transitionDelay:["Webkit"],transitionDuration:["Webkit"],transitionProperty:["Webkit"],transitionTimingFunction:["Webkit"]}},e.exports=t.default},function(e,t,n){"use strict";function r(e){if(e.firefox)return"firefox";if(e.mobile||e.tablet){if(e.ios)return"ios_saf";if(e.android)return"android";if(e.opera)return"op_mini"}for(var t in l)if(e[t])return l[t]}function i(e){var t=a.default._detect(e);for(var n in s)if(t[n]){var i=s[n];t.jsPrefix=i,t.cssPrefix="-"+i.toLowerCase()+"-";break}return t.browserName=r(t),t.version?t.browserVersion=parseFloat(t.version):t.browserVersion=parseInt(parseFloat(t.osversion),10),t.osVersion=parseFloat(t.osversion),"ios_saf"===t.browserName&&t.browserVersion>t.osVersion&&(t.browserVersion=t.osVersion),"android"===t.browserName&&t.chrome&&t.browserVersion>37&&(t.browserName="and_chr"),"android"===t.browserName&&t.osVersion<5&&(t.browserVersion=t.osVersion),"android"===t.browserName&&t.samsungBrowser&&(t.browserName="and_chr",t.browserVersion=44),t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=i;var o=n(348),a=function(e){return e&&e.__esModule?e:{default:e}}(o),s={chrome:"Webkit",safari:"Webkit",ios:"Webkit",android:"Webkit",phantom:"Webkit",opera:"Webkit",webos:"Webkit",blackberry:"Webkit",bada:"Webkit",tizen:"Webkit",chromium:"Webkit",vivaldi:"Webkit",firefox:"Moz",seamoney:"Moz",sailfish:"Moz",msie:"ms",msedge:"ms"},l={chrome:"chrome",chromium:"chrome",safari:"safari",firfox:"firefox",msedge:"edge",opera:"opera",vivaldi:"opera",msie:"ie"};e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n){return"chrome"===e&&t<43||("safari"===e||"ios_saf"===e)&&t<9||"opera"===e&&t<30||"android"===e&&t<=4.4||"and_uc"===e?n+"keyframes":"keyframes"}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r,e.exports=t.default},function(e,t,n){"use strict";function r(e,t,n){var r=e[t];if(r)for(var i=0,a=r.length;i="0"&&r<="9";)t+=r,l();if("."===r)for(t+=".";l()&&r>="0"&&r<="9";)t+=r;if("e"===r||"E"===r)for(t+=r,l(),"-"!==r&&"+"!==r||(t+=r,l());r>="0"&&r<="9";)t+=r,l();if(e=+t,isFinite(e))return e;s("Bad number")},c=function(){var e,t,n,i="";if('"'===r)for(;l();){if('"'===r)return l(),i;if("\\"===r)if(l(),"u"===r){for(n=0,t=0;t<4&&(e=parseInt(l(),16),isFinite(e));t+=1)n=16*n+e;i+=String.fromCharCode(n)}else{if("string"!=typeof a[r])break;i+=a[r]}else i+=r}s("Bad string")},d=function(){for(;r&&r<=" ";)l()},f=function(){switch(r){case"t":return l("t"),l("r"),l("u"),l("e"),!0;case"f":return l("f"),l("a"),l("l"),l("s"),l("e"),!1;case"n":return l("n"),l("u"),l("l"),l("l"),null}s("Unexpected '"+r+"'")},p=function(){var e=[];if("["===r){if(l("["),d(),"]"===r)return l("]"),e;for(;r;){if(e.push(o()),d(),"]"===r)return l("]"),e;l(","),d()}}s("Bad array")},h=function(){var e,t={};if("{"===r){if(l("{"),d(),"}"===r)return l("}"),t;for(;r;){if(e=c(),d(),l(":"),Object.hasOwnProperty.call(t,e)&&s('Duplicate key "'+e+'"'),t[e]=o(),d(),"}"===r)return l("}"),t;l(","),d()}}s("Bad object")};o=function(){switch(d(),r){case"{":return h();case"[":return p();case'"':return c();case"-":return u();default:return r>="0"&&r<="9"?u():f()}},e.exports=function(e,t){var a;return i=e,n=0,r=" ",a=o(),d(),r&&s("Syntax error"),"function"==typeof t?function e(n,r){var i,o,a=n[r];if(a&&"object"==typeof a)for(i in a)Object.prototype.hasOwnProperty.call(a,i)&&(o=e(a,i),void 0!==o?a[i]=o:delete a[i]);return t.call(n,r,a)}({"":a},""):a}},function(e,t){function n(e){return s.lastIndex=0,s.test(e)?'"'+e.replace(s,function(e){var t=l[e];return"string"==typeof t?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function r(e,t){var s,l,u,c,d,f=i,p=t[e];switch(p&&"object"==typeof p&&"function"==typeof p.toJSON&&(p=p.toJSON(e)),"function"==typeof a&&(p=a.call(t,e,p)),typeof p){case"string":return n(p);case"number":return isFinite(p)?String(p):"null";case"boolean":case"null":return String(p);case"object":if(!p)return"null";if(i+=o,d=[],"[object Array]"===Object.prototype.toString.apply(p)){for(c=p.length,s=0;s"||e+""});i.addError({name:"type",argument:a,message:"is not of a type(s) "+a})}return i},c.anyOf=function(e,t,n,i){if(void 0===e)return null;var o=new s(e,t,n,i),a=new s(e,t,n,i);if(!Array.isArray(t.anyOf))throw new l("anyOf must be an array");if(!t.anyOf.some(r.bind(this,e,n,i,function(e){a.importErrors(e)}))){var u=t.anyOf.map(function(e,t){return e.id&&"<"+e.id+">"||e.title&&JSON.stringify(e.title)||e.$ref&&"<"+e.$ref+">"||"[subschema "+t+"]"});n.nestedErrors&&o.importErrors(a),o.addError({name:"anyOf",argument:u,message:"is not any of "+u.join(",")})}return o},c.allOf=function(e,t,n,r){if(void 0===e)return null;if(!Array.isArray(t.allOf))throw new l("allOf must be an array");var i=new s(e,t,n,r),o=this;return t.allOf.forEach(function(t,a){var s=o.validateSchema(e,t,n,r);if(!s.valid){var l=t.id&&"<"+t.id+">"||t.title&&JSON.stringify(t.title)||t.$ref&&"<"+t.$ref+">"||"[subschema "+a+"]";i.addError({name:"allOf",argument:{id:l,length:s.errors.length,valid:s},message:"does not match allOf schema "+l+" with "+s.errors.length+" error[s]:"}),i.importErrors(s)}}),i},c.oneOf=function(e,t,n,i){if(void 0===e)return null;if(!Array.isArray(t.oneOf))throw new l("oneOf must be an array");var o=new s(e,t,n,i),a=new s(e,t,n,i),u=t.oneOf.filter(r.bind(this,e,n,i,function(e){a.importErrors(e)})).length,c=t.oneOf.map(function(e,t){return e.id&&"<"+e.id+">"||e.title&&JSON.stringify(e.title)||e.$ref&&"<"+e.$ref+">"||"[subschema "+t+"]"});return 1!==u&&(n.nestedErrors&&o.importErrors(a),o.addError({name:"oneOf",argument:c,message:"is not exactly one from "+c.join(",")})),o},c.properties=function(e,t,n,r){if(void 0!==e&&e instanceof Object){var i=new s(e,t,n,r),o=t.properties||{};for(var a in o){var l=(e||void 0)&&e[a],u=this.validateSchema(l,o[a],n,r.makeChild(o[a],a));u.instance!==i.instance[a]&&(i.instance[a]=u.instance),i.importErrors(u)}return i}},c.patternProperties=function(e,t,n,r){if(void 0!==e&&this.types.object(e)){var o=new s(e,t,n,r),a=t.patternProperties||{};for(var l in e){var u=!0;for(var c in a){if(new RegExp(c).test(l)){u=!1;var d=this.validateSchema(e[l],a[c],n,r.makeChild(a[c],l));d.instance!==o.instance[l]&&(o.instance[l]=d.instance),o.importErrors(d)}}u&&i.call(this,e,t,n,r,l,o)}return o}},c.additionalProperties=function(e,t,n,r){if(void 0!==e&&this.types.object(e)){if(t.patternProperties)return null;var o=new s(e,t,n,r);for(var a in e)i.call(this,e,t,n,r,a,o);return o}},c.minProperties=function(e,t,n,r){if(!e||"object"!=typeof e)return null;var i=new s(e,t,n,r);return Object.keys(e).length>=t.minProperties||i.addError({name:"minProperties",argument:t.minProperties,message:"does not meet minimum property length of "+t.minProperties}),i},c.maxProperties=function(e,t,n,r){if(!e||"object"!=typeof e)return null;var i=new s(e,t,n,r);return Object.keys(e).length<=t.maxProperties||i.addError({name:"maxProperties",argument:t.maxProperties,message:"does not meet maximum property length of "+t.maxProperties}),i},c.items=function(e,t,n,r){if(!Array.isArray(e))return null;var i=this,o=new s(e,t,n,r);return void 0!==e&&t.items?(e.every(function(e,a){var s=Array.isArray(t.items)?t.items[a]||t.additionalItems:t.items;if(void 0===s)return!0;if(!1===s)return o.addError({name:"items",message:"additionalItems not permitted"}),!1;var l=i.validateSchema(e,s,n,r.makeChild(s,a));return l.instance!==o.instance[a]&&(o.instance[a]=l.instance),o.importErrors(l),!0}),o):o},c.minimum=function(e,t,n,r){if("number"!=typeof e)return null;var i=new s(e,t,n,r),o=!0;return o=t.exclusiveMinimum&&!0===t.exclusiveMinimum?e>t.minimum:e>=t.minimum,o||i.addError({name:"minimum",argument:t.minimum,message:"must have a minimum value of "+t.minimum}),i},c.maximum=function(e,t,n,r){if("number"!=typeof e)return null;var i,o=new s(e,t,n,r);return i=t.exclusiveMaximum&&!0===t.exclusiveMaximum?e=t.minLength||i.addError({name:"minLength",argument:t.minLength,message:"does not meet minimum length of "+t.minLength}),i},c.maxLength=function(e,t,n,r){if("string"!=typeof e)return null;var i=new s(e,t,n,r);return e.length<=t.maxLength||i.addError({name:"maxLength",argument:t.maxLength,message:"does not meet maximum length of "+t.maxLength}),i},c.minItems=function(e,t,n,r){if(!Array.isArray(e))return null;var i=new s(e,t,n,r);return e.length>=t.minItems||i.addError({name:"minItems",argument:t.minItems,message:"does not meet minimum length of "+t.minItems}),i},c.maxItems=function(e,t,n,r){if(!Array.isArray(e))return null;var i=new s(e,t,n,r);return e.length<=t.maxItems||i.addError({name:"maxItems",argument:t.maxItems,message:"does not meet maximum length of "+t.maxItems}),i},c.uniqueItems=function(e,t,n,r){function i(e,t,n){for(var r=t+1;r"||a;o.addError({name:"not",argument:s,message:"is of prohibited type "+s})}}),o):null},e.exports=u},function(e,t,n){"use strict";var r=e.exports.Validator=n(473);e.exports.ValidatorResult=n(83).ValidatorResult,e.exports.ValidationError=n(83).ValidationError,e.exports.SchemaError=n(83).SchemaError,e.exports.validate=function(e,t,n){return(new r).validate(e,t,n)}},function(e,t,n){"use strict";function r(e){var t="string"==typeof e?e:e.$ref;return"string"==typeof t&&t}var i=n(153),o=n(471),a=n(83),s=a.ValidatorResult,l=a.SchemaError,u=a.SchemaContext,c=function e(){this.customFormats=Object.create(e.prototype.customFormats),this.schemas={},this.unresolvedRefs=[],this.types=Object.create(d),this.attributes=Object.create(o.validators)};c.prototype.customFormats={},c.prototype.schemas=null,c.prototype.types=null,c.prototype.attributes=null,c.prototype.unresolvedRefs=null,c.prototype.addSchema=function(e,t){if(!e)return null;var n=t||e.id;return this.addSubSchema(n,e),n&&(this.schemas[n]=e),this.schemas[n]},c.prototype.addSubSchema=function(e,t){if(t&&"object"==typeof t){if(t.$ref){var n=i.resolve(e,t.$ref);return void(void 0===this.schemas[n]&&(this.schemas[n]=null,this.unresolvedRefs.push(n)))}var r=t.id&&i.resolve(e,t.id),o=r||e;if(r){if(this.schemas[r]){if(!a.deepCompareStrict(this.schemas[r],t))throw new Error("Schema <"+t+"> already exists with different definition");return this.schemas[r]}this.schemas[r]=t;var s=r.replace(/^([^#]*)#$/,"$1");this.schemas[s]=t}return this.addSubSchemaArray(o,t.items instanceof Array?t.items:[t.items]),this.addSubSchemaArray(o,t.extends instanceof Array?t.extends:[t.extends]),this.addSubSchema(o,t.additionalItems),this.addSubSchemaObject(o,t.properties),this.addSubSchema(o,t.additionalProperties),this.addSubSchemaObject(o,t.definitions),this.addSubSchemaObject(o,t.patternProperties),this.addSubSchemaObject(o,t.dependencies),this.addSubSchemaArray(o,t.disallow),this.addSubSchemaArray(o,t.allOf),this.addSubSchemaArray(o,t.anyOf),this.addSubSchemaArray(o,t.oneOf),this.addSubSchema(o,t.not),this.schemas[r]}},c.prototype.addSubSchemaArray=function(e,t){if(t instanceof Array)for(var n=0;n",e);var u=a.objectGetPath(n.schemas[s],o.substr(1));if(void 0===u)throw new l("no such schema "+o+" located in <"+s+">",e);return{subschema:u,switchSchema:t}},c.prototype.testType=function(e,t,n,r,i){if("function"==typeof this.types[i])return this.types[i].call(this,e);if(i&&"object"==typeof i){var o=this.validateSchema(e,i,n,r);return void 0===o||!(o&&o.errors.length)}return!0};var d=c.prototype.types={};d.string=function(e){return"string"==typeof e},d.number=function(e){return"number"==typeof e&&isFinite(e)},d.integer=function(e){return"number"==typeof e&&e%1==0},d.boolean=function(e){return"boolean"==typeof e},d.array=function(e){return Array.isArray(e)},d.null=function(e){return null===e},d.date=function(e){return e instanceof Date},d.any=function(e){return!0},d.object=function(e){return e&&"object"==typeof e&&!(e instanceof Array)&&!(e instanceof Date)},e.exports=c},function(e,t,n){(function(t){function n(e,t){for(var n=-1,r=e?e.length:0,i=Array(r);++n-1}function g(e,t){var n=this.__data__,r=O(n,e);return r<0?n.push([e,t]):n[r][1]=t,this}function y(e){var t=-1,n=e?e.length:0;for(this.clear();++t0,o=!(t[0]instanceof Array);if(r&&s){for(var a=0;a0&&(n+=l),n+=i(e[a],a);t.length>0&&(n+=u)}for(var c=0;c0&&(n+=l);var p=r&&o?e[f]:f;n+=i(t[c][p],f)}c-1||" "===e.charAt(0)||" "===e.charAt(e.length-1)?c+e+c:e)}function o(e,t){for(var n=0;n-1)return!0;return!1}var a=!1,s=!0,l=",",u="\r\n",c='"';!function(){"object"==typeof t&&("string"==typeof t.delimiter&&1===t.delimiter.length&&-1===w.BAD_DELIMITERS.indexOf(t.delimiter)&&(l=t.delimiter),("boolean"==typeof t.quotes||t.quotes instanceof Array)&&(a=t.quotes),"string"==typeof t.newline&&(u=t.newline),"string"==typeof t.quoteChar&&(c=t.quoteChar),"boolean"==typeof t.header&&(s=t.header))}();var d=new RegExp(c,"g");if("string"==typeof e&&(e=JSON.parse(e)),e instanceof Array){if(!e.length||e[0]instanceof Array)return r(null,e);if("object"==typeof e[0])return r(n(e[0]),e)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),e.data instanceof Array&&(e.fields||(e.fields=e.meta&&e.meta.fields),e.fields||(e.fields=e.data[0]instanceof Array?e.fields:n(e.data[0])),e.data[0]instanceof Array||"object"==typeof e.data[0]||(e.data=[e.data])),r(e.fields||[],e.data||[]);throw"exception: Unable to serialize unrecognized input"}function n(e){function t(e){var t=h(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null),this._handle=new s(t),this._handle.streamer=this,this._config=t}this._handle=null,this._paused=!1,this._finished=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},t.call(this,e),this.parseChunk=function(e){if(this.isFirstChunk&&g(this._config.beforeFirstChunk)){var t=this._config.beforeFirstChunk(e);void 0!==t&&(e=t)}this.isFirstChunk=!1;var n=this._partialLine+e;this._partialLine="";var r=this._handle.parse(n,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var i=r.meta.cursor;this._finished||(this._partialLine=n.substring(i-this._baseIndex),this._baseIndex=i),r&&r.data&&(this._rowCount+=r.data.length);var o=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(_)v.postMessage({results:r,workerId:w.WORKER_ID,finished:o});else if(g(this._config.chunk)){if(this._config.chunk(r,this._handle),this._paused)return;r=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(r.data),this._completeResults.errors=this._completeResults.errors.concat(r.errors),this._completeResults.meta=r.meta),!o||!g(this._config.complete)||r&&r.meta.aborted||this._config.complete(this._completeResults,this._input),o||r&&r.meta.paused||this._nextChunk(),r}},this._sendError=function(e){g(this._config.error)?this._config.error(e):_&&this._config.error&&v.postMessage({workerId:w.WORKER_ID,error:e,finished:!1})}}function r(e){function t(e){var t=e.getResponseHeader("Content-Range");return null===t?-1:parseInt(t.substr(t.lastIndexOf("/")+1))}e=e||{},e.chunkSize||(e.chunkSize=w.RemoteChunkSize),n.call(this,e);var r;this._nextChunk=b?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)return void this._chunkLoaded();if(r=new XMLHttpRequest,this._config.withCredentials&&(r.withCredentials=this._config.withCredentials),b||(r.onload=m(this._chunkLoaded,this),r.onerror=m(this._chunkError,this)),r.open("GET",this._input,!b),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var t in e)r.setRequestHeader(t,e[t])}if(this._config.chunkSize){var n=this._start+this._config.chunkSize-1;r.setRequestHeader("Range","bytes="+this._start+"-"+n),r.setRequestHeader("If-None-Match","webkit-no-cache")}try{r.send()}catch(e){this._chunkError(e.message)}b&&0===r.status?this._chunkError():this._start+=this._config.chunkSize},this._chunkLoaded=function(){if(4==r.readyState){if(r.status<200||r.status>=400)return void this._chunkError();this._finished=!this._config.chunkSize||this._start>t(r),this.parseChunk(r.responseText)}},this._chunkError=function(e){var t=r.statusText||e;this._sendError(t)}}function i(e){e=e||{},e.chunkSize||(e.chunkSize=w.LocalChunkSize),n.call(this,e);var t,r,i="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,i?(t=new FileReader,t.onload=m(this._chunkLoaded,this),t.onerror=m(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function o(e){e=e||{},n.call(this,e);var t,r;this.stream=function(e){return t=e,r=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e=this._config.chunkSize,t=e?r.substr(0,e):r;return r=e?r.substr(e):"",this._finished=!r,this.parseChunk(t)}}}function a(e){e=e||{},n.call(this,e);var t=[],r=!0;this.stream=function(e){this._input=e,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._nextChunk=function(){t.length?this.parseChunk(t.shift()):r=!0},this._streamData=m(function(e){try{t.push("string"==typeof e?e:e.toString(this._config.encoding)),r&&(r=!1,this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=m(function(e){this._streamCleanUp(),this._sendError(e.message)},this),this._streamEnd=m(function(){this._streamCleanUp(),this._finished=!0,this._streamData("")},this),this._streamCleanUp=m(function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)},this)}function s(e){function t(){if(O&&m&&(d("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+w.DefaultDelimiter+"'"),m=!1),e.skipEmptyLines)for(var t=0;t=S.length?"__parsed_extra":S[r]),a=o(i,a),"__parsed_extra"===i?(n[i]=n[i]||[],n[i].push(a)):n[i]=a}O.data[t]=n,e.header&&(r>S.length?d("FieldMismatch","TooManyFields","Too many fields: expected "+S.length+" fields but parsed "+r,t):r1&&(d+=Math.abs(g-a),a=g):a=g}h.data.length>0&&(f/=h.data.length-p),(void 0===o||d1.99&&(o=d,i=c)}return e.delimiter=i,{successful:!!i,bestDelimiter:i}}function u(e){e=e.substr(0,1048576);var t=e.split("\r"),n=e.split("\n"),r=n.length>1&&n[0].length=t.length/2?"\r\n":"\r"}function c(e){return y.test(e)?parseFloat(e):e}function d(e,t,n,r){O.errors.push({type:e,code:t,message:n,row:r})}var f,p,m,y=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i,v=this,b=0,_=!1,E=!1,S=[],O={data:[],errors:[],meta:{}};if(g(e.step)){var T=e.step;e.step=function(r){if(O=r,n())t();else{if(t(),0===O.data.length)return;b+=r.data.length,e.preview&&b>e.preview?p.abort():T(O,v)}}}this.parse=function(n,r,i){if(e.newline||(e.newline=u(n)),m=!1,e.delimiter)g(e.delimiter)&&(e.delimiter=e.delimiter(n),O.meta.delimiter=e.delimiter);else{var o=s(n,e.newline,e.skipEmptyLines);o.successful?e.delimiter=o.bestDelimiter:(m=!0,e.delimiter=w.DefaultDelimiter),O.meta.delimiter=e.delimiter}var a=h(e);return e.preview&&e.header&&a.preview++,f=n,p=new l(a),O=p.parse(f,r,i),t(),_?{meta:{paused:!0}}:O||{meta:{paused:!1}}},this.paused=function(){return _},this.pause=function(){_=!0,p.abort(),f=f.substr(p.getCharIndex())},this.resume=function(){_=!1,v.streamer.parseChunk(f)},this.aborted=function(){return E},this.abort=function(){E=!0,p.abort(),O.meta.aborted=!0,g(e.complete)&&e.complete(O),f=""}}function l(e){e=e||{};var t=e.delimiter,n=e.newline,r=e.comments,i=e.step,o=e.preview,a=e.fastMode,s=e.quoteChar||'"';if(("string"!=typeof t||w.BAD_DELIMITERS.indexOf(t)>-1)&&(t=","),r===t)throw"Comment character same as delimiter";!0===r?r="#":("string"!=typeof r||w.BAD_DELIMITERS.indexOf(r)>-1)&&(r=!1),"\n"!=n&&"\r"!=n&&"\r\n"!=n&&(n="\n");var l=0,u=!1;this.parse=function(e,c,d){function f(e){O.push(e),P=l}function p(t){return d?m():(void 0===t&&(t=e.substr(l)),T.push(t),l=v,f(T),S&&y(),m())}function h(t){l=t,f(T),T=[],k=e.indexOf(n,l)}function m(e){return{data:O,errors:w,meta:{delimiter:t,linebreak:n,aborted:u,truncated:!!e,cursor:P+(c||0)}}}function y(){i(m()),O=[],w=[]}if("string"!=typeof e)throw"Input must be a string";var v=e.length,b=t.length,_=n.length,E=r.length,S=g(i);l=0;var O=[],w=[],T=[],P=0;if(!e)return m();if(a||!1!==a&&-1===e.indexOf(s)){for(var A=e.split(n),x=0;x=o)return O=O.slice(0,o),m(!0)}}return m()}for(var C=e.indexOf(t,l),k=e.indexOf(n,l),D=new RegExp(s+s,"g");;)if(e[l]!==s)if(r&&0===T.length&&e.substr(l,E)===r){if(-1===k)return m();l=k+_,k=e.indexOf(n,l),C=e.indexOf(t,l)}else if(-1!==C&&(C=o)return m(!0)}else{var M=l;for(l++;;){var M=e.indexOf(s,M+1);if(-1===M)return d||w.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:O.length,index:l}),p();if(M===v-1){var R=e.substring(l,M).replace(D,s);return p(R)}if(e[M+1]!==s){if(e[M+1]===t){T.push(e.substring(l,M).replace(D,s)),l=M+1+b,C=e.indexOf(t,l),k=e.indexOf(n,l);break}if(e.substr(M+1,_)===n){if(T.push(e.substring(l,M).replace(D,s)),h(M+1+_),C=e.indexOf(t,l),S&&(y(),u))return m();if(o&&O.length>=o)return m(!0);break}}else M++}}return p()},this.abort=function(){u=!0},this.getCharIndex=function(){return l}}function u(){if(!w.WORKERS_SUPPORTED)return!1;if(!E&&null===w.SCRIPT_PATH)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. You need to set Papa.SCRIPT_PATH manually.");var e=w.SCRIPT_PATH||y;e+=(-1!==e.indexOf("?")?"&":"?")+"papaworker";var t=new v.Worker(e);return t.onmessage=c,t.id=O++,S[t.id]=t,t}function c(e){var t=e.data,n=S[t.workerId],r=!1;if(t.error)n.userError(t.error,t.file);else if(t.results&&t.results.data){var i=function(){r=!0,d(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},o={abort:i,pause:f,resume:f};if(g(n.userStep)){for(var a=0;a1)for(var n=1;n1&&(r=n[0]+"@",e=n[1]),e=e.replace(D,"."),r+s(e.split("."),t).join(".")}function u(e){for(var t,n,r=[],i=0,o=e.length;i=55296&&t<=56319&&i65535&&(e-=65536,t+=N(e>>>10&1023|55296),e=56320|1023&e),t+=N(e)}).join("")}function d(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:E}function f(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function p(e,t,n){var r=0;for(e=n?I(e/T):e>>1,e+=I(e/t);e>R*O>>1;r+=E)e=I(e/R);return I(r+(R+1)*e/(e+w))}function h(e){var t,n,r,i,o,s,l,u,f,h,m=[],g=e.length,y=0,v=A,b=P;for(n=e.lastIndexOf(x),n<0&&(n=0),r=0;r=128&&a("not-basic"),m.push(e.charCodeAt(r));for(i=n>0?n+1:0;i=g&&a("invalid-input"),u=d(e.charCodeAt(i++)),(u>=E||u>I((_-y)/s))&&a("overflow"),y+=u*s,f=l<=b?S:l>=b+O?O:l-b,!(uI(_/h)&&a("overflow"),s*=h;t=m.length+1,b=p(y-o,t,0==o),I(y/t)>_-v&&a("overflow"),v+=I(y/t),y%=t,m.splice(y++,0,v)}return c(m)}function m(e){var t,n,r,i,o,s,l,c,d,h,m,g,y,v,b,w=[];for(e=u(e),g=e.length,t=A,n=0,o=P,s=0;s=t&&mI((_-n)/y)&&a("overflow"),n+=(l-t)*y,t=l,s=0;s_&&a("overflow"),m==t){for(c=n,d=E;h=d<=o?S:d>=o+O?O:d-o,!(c= 0x80 (not a basic code point)","invalid-input":"Invalid input"},R=E-S,I=Math.floor,N=String.fromCharCode;b={version:"1.4.1",ucs2:{decode:u,encode:c},decode:h,encode:m,toASCII:y,toUnicode:g},void 0!==(i=function(){return b}.call(t,n,t,e))&&(e.exports=i)}()}).call(t,n(677)(e),n(89))},function(e,t,n){"use strict";function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,n,o){t=t||"&",n=n||"=";var a={};if("string"!=typeof e||0===e.length)return a;e=e.split(t);var s=1e3;o&&"number"==typeof o.maxKeys&&(s=o.maxKeys);var l=e.length;s>0&&l>s&&(l=s);for(var u=0;u=0?(c=h.substr(0,m),d=h.substr(m+1)):(c=h,d=""),f=decodeURIComponent(c),p=decodeURIComponent(d),r(a,f)?i(a[f])?a[f].push(p):a[f]=[a[f],p]:a[f]=p}return a};var i=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},function(e,t,n){"use strict";function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r children");return v.a.createElement(S.a,{key:n.key,ref:function(t){return e.childrenRefs[n.key]=t},animation:t.animation,transitionName:t.transitionName,transitionEnter:t.transitionEnter,transitionAppear:t.transitionAppear,transitionLeave:t.transitionLeave},n)}));var i=t.component;if(i){var o=t;return"string"==typeof i&&(o=a()({className:t.className,style:t.style},t.componentProps)),v.a.createElement(i,o,r)}return r[0]||null}}]),t}(v.a.Component);T.propTypes={component:_.a.any,componentProps:_.a.object,animation:_.a.object,transitionName:_.a.oneOfType([_.a.string,_.a.object]),transitionEnter:_.a.bool,transitionAppear:_.a.bool,exclusive:_.a.bool,transitionLeave:_.a.bool,onEnd:_.a.func,onEnter:_.a.func,onLeave:_.a.func,onAppear:_.a.func,showProp:_.a.string},T.defaultProps={animation:{},component:"span",componentProps:{},transitionEnter:!0,transitionLeave:!0,transitionAppear:!1,onEnd:i,onEnter:i,onLeave:i,onAppear:i};var P=function(){var e=this;this.performEnter=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillEnter(e.handleDoneAdding.bind(e,t,"enter")))},this.performAppear=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillAppear(e.handleDoneAdding.bind(e,t,"appear")))},this.handleDoneAdding=function(t,i){var o=e.props;if(delete e.currentlyAnimatingKeys[t],!o.exclusive||o===e.nextProps){var a=n.i(E.a)(r(o));e.isValidChildByKey(a,t)?"appear"===i?O.a.allowAppearCallback(o)&&(o.onAppear(t),o.onEnd(t,!0)):O.a.allowEnterCallback(o)&&(o.onEnter(t),o.onEnd(t,!0)):e.performLeave(t)}},this.performLeave=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillLeave(e.handleDoneLeaving.bind(e,t)))},this.handleDoneLeaving=function(t){var i=e.props;if(delete e.currentlyAnimatingKeys[t],!i.exclusive||i===e.nextProps){var o=n.i(E.a)(r(i));if(e.isValidChildByKey(o,t))e.performEnter(t);else{var a=function(){O.a.allowLeaveCallback(i)&&(i.onLeave(t),i.onEnd(t,!1))};n.i(E.e)(e.state.children,o,i.showProp)?a():e.setState({children:o},a)}}}};t.a=T},function(e,t,n){"use strict";var r=n(97),i=n.n(r),o=n(27),a=n.n(o),s=n(28),l=n.n(s),u=n(30),c=n.n(u),d=n(29),f=n.n(d),p=n(0),h=n.n(p),m=n(24),g=n.n(m),y=n(1),v=n.n(y),b=n(418),_=n.n(b),E=n(210),S={enter:"transitionEnter",appear:"transitionAppear",leave:"transitionLeave"},O=function(e){function t(){return a()(this,t),c()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return f()(t,e),l()(t,[{key:"componentWillUnmount",value:function(){this.stop()}},{key:"componentWillEnter",value:function(e){E.a.isEnterSupported(this.props)?this.transition("enter",e):e()}},{key:"componentWillAppear",value:function(e){E.a.isAppearSupported(this.props)?this.transition("appear",e):e()}},{key:"componentWillLeave",value:function(e){E.a.isLeaveSupported(this.props)?this.transition("leave",e):e()}},{key:"transition",value:function(e,t){var n=this,r=g.a.findDOMNode(this),o=this.props,a=o.transitionName,s="object"===(void 0===a?"undefined":i()(a));this.stop();var l=function(){n.stopper=null,t()};if((b.isCssAnimationSupported||!o.animation[e])&&a&&o[S[e]]){var u=s?a[e]:a+"-"+e,c=u+"-active";s&&a[e+"Active"]&&(c=a[e+"Active"]),this.stopper=_()(r,{name:u,active:c},l)}else this.stopper=o.animation[e](r,l)}},{key:"stop",value:function(){var e=this.stopper;e&&(this.stopper=null,e.stop())}},{key:"render",value:function(){return this.props.children}}]),t}(h.a.Component);O.propTypes={children:v.a.any},t.a=O},function(e,t,n){"use strict";function r(e){var t=[];return u.a.Children.forEach(e,function(e){t.push(e)}),t}function i(e,t){var n=null;return e&&e.forEach(function(e){n||e&&e.key===t&&(n=e)}),n}function o(e,t,n){var r=null;return e&&e.forEach(function(e){if(e&&e.key===t&&e.props[n]){if(r)throw new Error("two child with same key for children");r=e}}),r}function a(e,t,n){var r=e.length===t.length;return r&&e.forEach(function(e,i){var o=t[i];e&&o&&(e&&!o||!e&&o?r=!1:e.key!==o.key?r=!1:n&&e.props[n]!==o.props[n]&&(r=!1))}),r}function s(e,t){var n=[],r={},o=[];return e.forEach(function(e){e&&i(t,e.key)?o.length&&(r[e.key]=o,o=[]):o.push(e)}),t.forEach(function(e){e&&r.hasOwnProperty(e.key)&&(n=n.concat(r[e.key])),n.push(e)}),n=n.concat(o)}t.a=r,t.b=i,t.d=o,t.e=a,t.c=s;var l=n(0),u=n.n(l)},function(e,t,n){"use strict";var r=n(68),i=n.n(r),o=n(123),a=n.n(o),s=n(17),l=n.n(s),u=n(27),c=n.n(u),d=n(28),f=n.n(d),p=n(30),h=n.n(p),m=n(29),g=n.n(m),y=n(0),v=n.n(y),b=n(1),_=n.n(b),E=n(47),S=n.n(E),O=n(581),w=n.n(O),T=n(114),P=n.n(T),A=n(211),x=n(212),C=n(149),k=function(e){function t(e){c()(this,t);var n=h()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.onEnd=function(){n.setState({handle:null}),n.removeDocumentEvents(),n.props.onAfterChange(n.getValue())};var r=e.count,i=e.min,o=e.max,a=Array.apply(null,Array(r+1)).map(function(){return i}),s="defaultValue"in e?e.defaultValue:a,l=void 0!==e.value?e.value:s,u=l.map(function(e){return n.trimAlignValue(e)}),d=u[0]===o?0:u.length-1;return n.state={handle:null,recent:d,bounds:u},n}return g()(t,e),f()(t,[{key:"componentWillReceiveProps",value:function(e){var t=this;if(("value"in e||"min"in e||"max"in e)&&(this.props.min!==e.min||this.props.max!==e.max||!w()(this.props.value,e.value))){var n=this.state.bounds,r=e.value||n,i=r.map(function(n){return t.trimAlignValue(n,e)});i.length===n.length&&i.every(function(e,t){return e===n[t]})||(this.setState({bounds:i}),n.some(function(t){return C.a(t,e)})&&this.props.onChange(i))}}},{key:"onChange",value:function(e){var t=this.props;"value"in t?void 0!==e.handle&&this.setState({handle:e.handle}):this.setState(e);var n=l()({},this.state,e),r=n.bounds;t.onChange(r)}},{key:"onStart",value:function(e){var t=this.props,n=this.state,r=this.getValue();t.onBeforeChange(r);var i=this.calcValueByPos(e);this.startValue=i,this.startPosition=e;var o=this.getClosestBound(i),s=this.getBoundNeedMoving(i,o);if(this.setState({handle:s,recent:s}),i!==r[s]){var l=[].concat(a()(n.bounds));l[s]=i,this.onChange({bounds:l})}}},{key:"onMove",value:function(e,t){C.b(e);var n=this.props,r=this.state,i=this.calcValueByPos(t);if(i!==r.bounds[r.handle]){var o=[].concat(a()(r.bounds));o[r.handle]=i;var s=r.handle;if(!1!==n.pushable){var l=r.bounds[s];this.pushSurroundingHandles(o,s,l)}else n.allowCross&&(o.sort(function(e,t){return e-t}),s=o.indexOf(i));this.onChange({handle:s,bounds:o})}}},{key:"onKeyboard",value:function(){P()(!0,"Keyboard support is not yet supported for ranges.")}},{key:"getValue",value:function(){return this.state.bounds}},{key:"getClosestBound",value:function(e){for(var t=this.state.bounds,n=0,r=1;rt[r]&&(n=r);return Math.abs(t[n+1]-e)=r.length||o<0)return!1;var a=t+n,s=r[o],l=this.props.pushable,u=n*(e[a]-s);return!!this.pushHandle(e,a,n,l-u)&&(e[t]=s,!0)}},{key:"trimAlignValue",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=l()({},this.props,t),r=C.c(e,n),i=this.ensureValueNotConflict(r,n);return C.d(i,n)}},{key:"ensureValueNotConflict",value:function(e,t){var n=t.allowCross,r=this.state||{},i=r.handle,o=r.bounds;if(!n&&null!=i){if(i>0&&e<=o[i-1])return o[i-1];if(i=o[i+1])return o[i+1]}return e}},{key:"render",value:function(){var e=this,t=this.state,n=t.handle,r=t.bounds,o=this.props,a=o.prefixCls,s=o.vertical,l=o.included,u=o.disabled,c=o.min,d=o.max,f=o.handle,p=o.trackStyle,h=o.handleStyle,m=r.map(function(t){return e.calcOffset(t)}),g=a+"-handle",y=r.map(function(t,r){var o;return f({className:S()((o={},i()(o,g,!0),i()(o,g+"-"+(r+1),!0),o)),vertical:s,offset:m[r],value:t,dragging:n===r,index:r,min:c,max:d,disabled:u,style:h[r],ref:function(t){return e.saveHandle(r,t)}})});return{tracks:r.slice(0,-1).map(function(e,t){var n,r=t+1,o=S()((n={},i()(n,a+"-track",!0),i()(n,a+"-track-"+r,!0),n));return v.a.createElement(A.a,{className:o,vertical:s,included:l,offset:m[r-1],length:m[r]-m[r-1],style:p[t],key:r})}),handles:y}}}]),t}(v.a.Component);k.displayName="Range",k.propTypes={defaultValue:_.a.arrayOf(_.a.number),value:_.a.arrayOf(_.a.number),count:_.a.number,pushable:_.a.oneOfType([_.a.bool,_.a.number]),allowCross:_.a.bool,disabled:_.a.bool},k.defaultProps={count:1,allowCross:!0,pushable:!1},t.a=n.i(x.a)(k)},function(e,t,n){"use strict";var r=n(17),i=n.n(r),o=n(27),a=n.n(o),s=n(28),l=n.n(s),u=n(30),c=n.n(u),d=n(29),f=n.n(d),p=n(0),h=n.n(p),m=n(1),g=n.n(m),y=n(114),v=n.n(y),b=n(211),_=n(212),E=n(149),S=function(e){function t(e){a()(this,t);var n=c()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.onEnd=function(){n.setState({dragging:!1}),n.removeDocumentEvents(),n.props.onAfterChange(n.getValue())};var r=void 0!==e.defaultValue?e.defaultValue:e.min,i=void 0!==e.value?e.value:r;return n.state={value:n.trimAlignValue(i),dragging:!1},v()(!("minimumTrackStyle"in e),"minimumTrackStyle will be deprecate, please use trackStyle instead."),v()(!("maximumTrackStyle"in e),"maximumTrackStyle will be deprecate, please use railStyle instead."),n}return f()(t,e),l()(t,[{key:"componentWillReceiveProps",value:function(e){if("value"in e||"min"in e||"max"in e){var t=this.state.value,n=void 0!==e.value?e.value:t,r=this.trimAlignValue(n,e);r!==t&&(this.setState({value:r}),E.a(n,e)&&this.props.onChange(r))}}},{key:"onChange",value:function(e){var t=this.props;!("value"in t)&&this.setState(e);var n=e.value;t.onChange(n)}},{key:"onStart",value:function(e){this.setState({dragging:!0});var t=this.props,n=this.getValue();t.onBeforeChange(n);var r=this.calcValueByPos(e);this.startValue=r,this.startPosition=e,r!==n&&this.onChange({value:r})}},{key:"onMove",value:function(e,t){E.b(e);var n=this.state.value,r=this.calcValueByPos(t);r!==n&&this.onChange({value:r})}},{key:"onKeyboard",value:function(e){var t=E.j(e);if(t){E.b(e);var n=this.state,r=n.value,i=t(r,this.props),o=this.trimAlignValue(i);if(o===r)return;this.onChange({value:o})}}},{key:"getValue",value:function(){return this.state.value}},{key:"getLowerBound",value:function(){return this.props.min}},{key:"getUpperBound",value:function(){return this.state.value}},{key:"trimAlignValue",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i()({},this.props,t),r=E.c(e,n);return E.d(r,n)}},{key:"render",value:function(){var e=this,t=this.props,n=t.prefixCls,r=t.vertical,o=t.included,a=t.disabled,s=t.minimumTrackStyle,l=t.trackStyle,u=t.handleStyle,c=t.min,d=t.max,f=t.handle,p=this.state,m=p.value,g=p.dragging,y=this.calcOffset(m),v=f({className:n+"-handle",vertical:r,offset:y,value:m,dragging:g,disabled:a,min:c,max:d,style:u[0]||u,ref:function(t){return e.saveHandle(0,t)}}),_=l[0]||l;return{tracks:h.a.createElement(b.a,{className:n+"-track",vertical:r,included:o,offset:0,length:y,style:i()({},s,_)}),handles:v}}}]),t}(h.a.Component);S.propTypes={defaultValue:g.a.number,value:g.a.number,disabled:g.a.bool},t.a=n.i(_.a)(S)},function(e,t,n){"use strict";var r=n(17),i=n.n(r),o=n(97),a=n.n(o),s=n(68),l=n.n(s),u=n(0),c=n.n(u),d=n(47),f=n.n(d),p=function(e){var t=e.className,n=e.vertical,r=e.marks,o=e.included,s=e.upperBound,u=e.lowerBound,d=e.max,p=e.min,h=Object.keys(r),m=h.length,g=m>1?100/(m-1):100,y=.9*g,v=d-p,b=h.map(parseFloat).sort(function(e,t){return e-t}).map(function(e){var d,h=!o&&e===s||o&&e<=s&&e>=u,m=f()((d={},l()(d,t+"-text",!0),l()(d,t+"-text-active",h),d)),g={marginBottom:"-50%",bottom:(e-p)/v*100+"%"},b={width:y+"%",marginLeft:-y/2+"%",left:(e-p)/v*100+"%"},_=n?g:b,E=r[e],S="object"===(void 0===E?"undefined":a()(E))&&!c.a.isValidElement(E),O=S?E.label:E,w=S?i()({},_,E.style):_;return c.a.createElement("span",{className:m,style:w,key:e},O)});return c.a.createElement("div",{className:t},b)};t.a=p},function(e,t,n){"use strict";var r=n(68),i=n.n(r),o=n(17),a=n.n(o),s=n(0),l=n.n(s),u=n(47),c=n.n(u),d=n(114),f=n.n(d),p=function(e,t,n,r,i,o){f()(!n||r>0,"`Slider[step]` should be a positive number in order to make Slider[dots] work.");var a=Object.keys(t).map(parseFloat);if(n)for(var s=i;s<=o;s+=r)a.indexOf(s)>=0||a.push(s);return a},h=function(e){var t=e.prefixCls,n=e.vertical,r=e.marks,o=e.dots,s=e.step,u=e.included,d=e.lowerBound,f=e.upperBound,h=e.max,m=e.min,g=e.dotStyle,y=e.activeDotStyle,v=h-m,b=p(0,r,o,s,m,h).map(function(e){var r,o=Math.abs(e-m)/v*100+"%",s=!u&&e===f||u&&e<=f&&e>=d,p=n?a()({bottom:o},g):a()({left:o},g);s&&(p=a()({},p,y));var h=c()((r={},i()(r,t+"-dot",!0),i()(r,t+"-dot-active",s),r));return l.a.createElement("span",{className:h,style:p,key:e})});return l.a.createElement("div",{className:t+"-step"},b)};t.a=h},function(e,t,n){"use strict";function r(e){var t,n;return n=t=function(t){function n(e){d()(this,n);var t=m()(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e));return t.handleTooltipVisibleChange=function(e,n){t.setState(function(t){return{visibles:u()({},t.visibles,s()({},e,n))}})},t.handleWithTooltip=function(e){var n=e.value,r=e.dragging,i=e.index,a=e.disabled,s=o()(e,["value","dragging","index","disabled"]),l=t.props,c=l.tipFormatter,d=l.tipProps,f=l.handleStyle,p=d.prefixCls,h=void 0===p?"rc-slider-tooltip":p,m=d.overlay,g=void 0===m?c(n):m,y=d.placement,v=void 0===y?"top":y,_=o()(d,["prefixCls","overlay","placement"]);return b.a.createElement(S.a,u()({},_,{prefixCls:h,overlay:g,placement:v,visible:!a&&(t.state.visibles[i]||r),key:i}),b.a.createElement(O.a,u()({},s,{style:u()({},f[0]),value:n,onMouseEnter:function(){return t.handleTooltipVisibleChange(i,!0)},onMouseLeave:function(){return t.handleTooltipVisibleChange(i,!1)}})))},t.state={visibles:{}},t}return y()(n,t),p()(n,[{key:"render",value:function(){return b.a.createElement(e,u()({},this.props,{handle:this.handleWithTooltip}))}}]),n}(b.a.Component),t.propTypes={tipFormatter:E.a.func,handleStyle:E.a.arrayOf(E.a.object),tipProps:E.a.object},t.defaultProps={tipFormatter:function(e){return e},handleStyle:[{}],tipProps:{}},n}t.a=r;var i=n(75),o=n.n(i),a=n(68),s=n.n(a),l=n(17),u=n.n(l),c=n(27),d=n.n(c),f=n(28),p=n.n(f),h=n(30),m=n.n(h),g=n(29),y=n.n(g),v=n(0),b=n.n(v),_=n(1),E=n.n(_),S=n(497),O=n(148)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(491),i=n(490),o=n(148),a=n(494);n.d(t,"Range",function(){return i.a}),n.d(t,"Handle",function(){return o.a}),n.d(t,"createSliderWithTooltip",function(){return a.a}),r.a.Range=i.a,r.a.Handle=o.a,r.a.createSliderWithTooltip=a.a,t.default=r.a},function(e,t,n){"use strict";var r=n(17),i=n.n(r),o=n(75),a=n.n(o),s=n(27),l=n.n(s),u=n(28),c=n.n(u),d=n(30),f=n.n(d),p=n(29),h=n.n(p),m=n(0),g=n.n(m),y=n(1),v=n.n(y),b=n(501),_=n(498),E=function(e){function t(){var e,n,r,i;l()(this,t);for(var o=arguments.length,a=Array(o),s=0;s=r.F1&&t<=r.F12)return!1;switch(t){case r.ALT:case r.CAPS_LOCK:case r.CONTEXT_MENU:case r.CTRL:case r.DOWN:case r.END:case r.ESC:case r.HOME:case r.INSERT:case r.LEFT:case r.MAC_FF_META:case r.META:case r.NUMLOCK:case r.NUM_CENTER:case r.PAGE_DOWN:case r.PAGE_UP:case r.PAUSE:case r.PRINT_SCREEN:case r.RIGHT:case r.SHIFT:case r.UP:case r.WIN_KEY:case r.WIN_KEY_RIGHT:return!1;default:return!0}},r.isCharacterKey=function(e){if(e>=r.ZERO&&e<=r.NINE)return!0;if(e>=r.NUM_ZERO&&e<=r.NUM_MULTIPLY)return!0;if(e>=r.A&&e<=r.Z)return!0;if(-1!==window.navigation.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case r.SPACE:case r.QUESTION_MARK:case r.NUM_PLUS:case r.NUM_MINUS:case r.NUM_PERIOD:case r.NUM_DIVISION:case r.SEMICOLON:case r.DASH:case r.EQUALS:case r.COMMA:case r.PERIOD:case r.SLASH:case r.APOSTROPHE:case r.SINGLE_QUOTE:case r.OPEN_SQUARE_BRACKET:case r.BACKSLASH:case r.CLOSE_SQUARE_BRACKET:return!0;default:return!1}},t.a=r},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(){var e=document.createElement("div");return document.body.appendChild(e),e}function o(e){function t(e,t,n){if(!c||e._component||c(e)){e._container||(e._container=p(e));var r=void 0;r=e.getComponent?e.getComponent(t):d(e,t),u.default.unstable_renderSubtreeIntoContainer(e,r,e._container,function(){e._component=this,n&&n.call(this)})}}function n(e){if(e._container){var t=e._container;u.default.unmountComponentAtNode(t),t.parentNode.removeChild(t),e._container=null}}var r=e.autoMount,o=void 0===r||r,a=e.autoDestroy,l=void 0===a||a,c=e.isVisible,d=e.getComponent,f=e.getContainer,p=void 0===f?i:f,h=void 0;return o&&(h=(0,s.default)({},h,{componentDidMount:function(){t(this)},componentDidUpdate:function(){t(this)}})),o&&l||(h=(0,s.default)({},h,{renderComponent:function(e,n){t(this,e,n)}})),h=l?(0,s.default)({},h,{componentWillUnmount:function(){n(this)}}):(0,s.default)({},h,{removeContainer:function(){n(this)}})}Object.defineProperty(t,"__esModule",{value:!0});var a=n(17),s=r(a);t.default=o;var l=n(24),u=r(l);e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0}),t.CopyToClipboard=void 0;var l=Object.assign||function(e){for(var t=1;tc||l.year()>u)&&(e+=" rdtNew"),s&&l.isSame(s,"day")&&(e+=" rdtActive"),l.isSame(o(),"day")&&(e+=" rdtToday"),t=!h(i,s),t&&(e+=" rdtDisabled"),n={key:l.format("M_D"),"data-value":l.date(),className:e},t||(n.onClick=this.updateSelectedDate),f.push(p(n,i,s)),7===f.length&&(d.push(r.createElement("tr",{key:l.format("M_D")},f)),f=[]),l.add(1,"d");return d},updateSelectedDate:function(e){this.props.updateSelectedDate(e,!0)},renderDay:function(e,t){return r.createElement("td",e,t.date())},renderFooter:function(){if(!this.props.timeFormat)return"";var e=this.props.selectedDate||this.props.viewDate;return r.createElement("tfoot",{key:"tf"},r.createElement("tr",{},r.createElement("td",{onClick:this.props.showView("time"),colSpan:7,className:"rdtTimeToggle"},e.format(this.props.timeFormat))))},alwaysValidDate:function(){return 1},handleClickOutside:function(){this.props.handleClickOutside()}}));e.exports=s},function(e,t,n){"use strict";function r(e){return e.charAt(0).toUpperCase()+e.slice(1)}var i=n(0),o=n(53),a=n(104),s=a(o({render:function(){return i.createElement("div",{className:"rdtMonths"},[i.createElement("table",{key:"a"},i.createElement("thead",{},i.createElement("tr",{},[i.createElement("th",{key:"prev",className:"rdtPrev",onClick:this.props.subtractTime(1,"years")},i.createElement("span",{},"‹")),i.createElement("th",{key:"year",className:"rdtSwitch",onClick:this.props.showView("years"),colSpan:2,"data-value":this.props.viewDate.year()},this.props.viewDate.year()),i.createElement("th",{key:"next",className:"rdtNext",onClick:this.props.addTime(1,"years")},i.createElement("span",{},"›"))]))),i.createElement("table",{key:"months"},i.createElement("tbody",{key:"b"},this.renderMonths()))])},renderMonths:function(){for(var e,t,n,r,o,a,s,l=this.props.selectedDate,u=this.props.viewDate.month(),c=this.props.viewDate.year(),d=[],f=0,p=[],h=this.props.renderMonth||this.renderMonth,m=this.props.isValidDate||this.alwaysValidDate;f<12;)e="rdtMonth",n=this.props.viewDate.clone().set({year:c,month:f,date:1}),o=n.endOf("month").format("D"),a=Array.from({length:o},function(e,t){return t+1}),s=a.find(function(e){var t=n.clone().set("date",e);return m(t)}),r=void 0===s,r&&(e+=" rdtDisabled"),l&&f===l.month()&&c===l.year()&&(e+=" rdtActive"),t={key:f,"data-value":f,className:e},r||(t.onClick="months"===this.props.updateOn?this.updateSelectedMonth:this.props.setDate("month")),p.push(h(t,f,c,l&&l.clone())),4===p.length&&(d.push(i.createElement("tr",{key:u+"_"+d.length},p)),p=[]),f++;return d},updateSelectedMonth:function(e){this.props.updateSelectedDate(e)},renderMonth:function(e,t){var n=this.props.viewDate,o=n.localeData().monthsShort(n.month(t)),a=o.substring(0,3);return i.createElement("td",e,r(a))},alwaysValidDate:function(){return 1},handleClickOutside:function(){this.props.handleClickOutside()}}));e.exports=s},function(e,t,n){"use strict";var r=n(0),i=n(53),o=n(216),a=n(104),s=a(i({getInitialState:function(){return this.calculateState(this.props)},calculateState:function(e){var t=e.selectedDate||e.viewDate,n=e.timeFormat,r=[];-1!==n.toLowerCase().indexOf("h")&&(r.push("hours"),-1!==n.indexOf("m")&&(r.push("minutes"),-1!==n.indexOf("s")&&r.push("seconds")));var i=!1;return null!==this.state&&-1!==this.props.timeFormat.toLowerCase().indexOf(" a")&&(i=-1!==this.props.timeFormat.indexOf(" A")?this.state.hours>=12?"PM":"AM":this.state.hours>=12?"pm":"am"),{hours:t.format("H"),minutes:t.format("mm"),seconds:t.format("ss"),milliseconds:t.format("SSS"),daypart:i,counters:r}},renderCounter:function(e){if("daypart"!==e){var t=this.state[e];return"hours"===e&&-1!==this.props.timeFormat.toLowerCase().indexOf(" a")&&0===(t=(t-1)%12+1)&&(t=12),r.createElement("div",{key:e,className:"rdtCounter"},[r.createElement("span",{key:"up",className:"rdtBtn",onMouseDown:this.onStartClicking("increase",e)},"▲"),r.createElement("div",{key:"c",className:"rdtCount"},t),r.createElement("span",{key:"do",className:"rdtBtn",onMouseDown:this.onStartClicking("decrease",e)},"▼")])}return""},renderDayPart:function(){return r.createElement("div",{key:"dayPart",className:"rdtCounter"},[r.createElement("span",{key:"up",className:"rdtBtn",onMouseDown:this.onStartClicking("toggleDayPart","hours")},"▲"),r.createElement("div",{key:this.state.daypart,className:"rdtCount"},this.state.daypart),r.createElement("span",{key:"do",className:"rdtBtn",onMouseDown:this.onStartClicking("toggleDayPart","hours")},"▼")])},render:function(){var e=this,t=[];return this.state.counters.forEach(function(n){t.length&&t.push(r.createElement("div",{key:"sep"+t.length,className:"rdtCounterSeparator"},":")),t.push(e.renderCounter(n))}),!1!==this.state.daypart&&t.push(e.renderDayPart()),3===this.state.counters.length&&-1!==this.props.timeFormat.indexOf("S")&&(t.push(r.createElement("div",{className:"rdtCounterSeparator",key:"sep5"},":")),t.push(r.createElement("div",{className:"rdtCounter rdtMilli",key:"m"},r.createElement("input",{value:this.state.milliseconds,type:"text",onChange:this.updateMilli})))),r.createElement("div",{className:"rdtTime"},r.createElement("table",{},[this.renderHeader(),r.createElement("tbody",{key:"b"},r.createElement("tr",{},r.createElement("td",{},r.createElement("div",{className:"rdtCounters"},t))))]))},componentWillMount:function(){var e=this;e.timeConstraints={hours:{min:0,max:23,step:1},minutes:{min:0,max:59,step:1},seconds:{min:0,max:59,step:1},milliseconds:{min:0,max:999,step:1}},["hours","minutes","seconds","milliseconds"].forEach(function(t){o(e.timeConstraints[t],e.props.timeConstraints[t])}),this.setState(this.calculateState(this.props))},componentWillReceiveProps:function(e){this.setState(this.calculateState(e))},updateMilli:function(e){var t=parseInt(e.target.value,10);t===e.target.value&&t>=0&&t<1e3&&(this.props.setTime("milliseconds",t),this.setState({milliseconds:t}))},renderHeader:function(){if(!this.props.dateFormat)return null;var e=this.props.selectedDate||this.props.viewDate;return r.createElement("thead",{key:"h"},r.createElement("tr",{},r.createElement("th",{className:"rdtSwitch",colSpan:4,onClick:this.props.showView("days")},e.format(this.props.dateFormat))))},onStartClicking:function(e,t){var n=this;return function(){var r={};r[t]=n[e](t),n.setState(r),n.timer=setTimeout(function(){n.increaseTimer=setInterval(function(){r[t]=n[e](t),n.setState(r)},70)},500),n.mouseUpListener=function(){clearTimeout(n.timer),clearInterval(n.increaseTimer),n.props.setTime(t,n.state[t]),document.body.removeEventListener("mouseup",n.mouseUpListener)},document.body.addEventListener("mouseup",n.mouseUpListener)}},padValues:{hours:1,minutes:2,seconds:2,milliseconds:3},toggleDayPart:function(e){var t=parseInt(this.state[e],10)+12;return t>this.timeConstraints[e].max&&(t=this.timeConstraints[e].min+(t-(this.timeConstraints[e].max+1))),this.pad(e,t)},increase:function(e){var t=parseInt(this.state[e],10)+this.timeConstraints[e].step;return t>this.timeConstraints[e].max&&(t=this.timeConstraints[e].min+(t-(this.timeConstraints[e].max+1))),this.pad(e,t)},decrease:function(e){var t=parseInt(this.state[e],10)-this.timeConstraints[e].step;return t1&&void 0!==arguments[1]?arguments[1]:{validate:!1},r=!n.props.noValidate&&(n.props.liveValidate||t.validate),i={status:"editing",formData:e};if(r){var o=n.validate(e),a=o.errors,l=o.errorSchema;i=s({},i,{errors:a,errorSchema:l})}(0,m.setState)(n,i,function(){n.props.onChange&&n.props.onChange(n.state)})},n.onBlur=function(){if(n.props.onBlur){var e;(e=n.props).onBlur.apply(e,arguments)}},n.onSubmit=function(e){if(e.preventDefault(),n.setState({status:"submitted"}),!n.props.noValidate){var t=n.validate(n.state.formData),r=t.errors,i=t.errorSchema;if(Object.keys(r).length>0)return void(0,m.setState)(n,{errors:r,errorSchema:i},function(){n.props.onError?n.props.onError(r):console.error("Form validation failed",r)})}n.props.onSubmit&&n.props.onSubmit(n.state),n.setState({status:"initial",errors:[],errorSchema:{}})},n.state=n.getStateFromProps(e),n}return a(t,e),l(t,[{key:"componentWillReceiveProps",value:function(e){this.setState(this.getStateFromProps(e))}},{key:"getStateFromProps",value:function(e){var t=this.state||{},n="schema"in e?e.schema:this.props.schema,r="uiSchema"in e?e.uiSchema:this.props.uiSchema,i=void 0!==e.formData,o=e.liveValidate||this.props.liveValidate,a=i&&!e.noValidate&&o,s=n.definitions,l=(0,m.getDefaultFormState)(n,e.formData,s),u=a?this.validate(l,n):{errors:t.errors||[],errorSchema:t.errorSchema||{}},c=u.errors,d=u.errorSchema;return{status:"initial",schema:n,uiSchema:r,idSchema:(0,m.toIdSchema)(n,r["ui:rootFieldId"],s),formData:l,edit:i,errors:c,errorSchema:d}}},{key:"shouldComponentUpdate",value:function(e,t){return(0,m.shouldRender)(this,e,t)}},{key:"validate",value:function(e,t){var n=this.props,r=n.validate,i=n.transformErrors;return(0,y.default)(e,t||this.props.schema,r,i)}},{key:"renderErrors",value:function(){var e=this.state,t=e.status,n=e.errors,r=this.props,i=r.ErrorList,o=r.showErrorList;return"editing"!==t&&n.length&&0!=o?c.default.createElement(i,{errors:n}):null}},{key:"getRegistry",value:function(){var e=(0,m.getDefaultRegistry)(),t=e.fields,n=e.widgets;return{fields:s({},t,this.props.fields),widgets:s({},n,this.props.widgets),ArrayFieldTemplate:this.props.ArrayFieldTemplate,FieldTemplate:this.props.FieldTemplate,definitions:this.props.schema.definitions||{},formContext:this.props.formContext||{}}}},{key:"render",value:function(){var e=this.props,t=e.children,n=e.safeRenderCompletion,r=e.id,i=e.className,o=e.name,a=e.method,s=e.target,l=e.action,u=e.autocomplete,d=e.enctype,f=e.acceptcharset,p=e.noHtml5Validate,h=this.state,m=h.schema,g=h.uiSchema,y=h.formData,v=h.errorSchema,b=h.idSchema,_=this.getRegistry(),E=_.fields.SchemaField;return c.default.createElement("form",{className:i||"rjsf",id:r,name:o,method:a,target:s,action:l,autoComplete:u,encType:d,acceptCharset:f,noValidate:p,onSubmit:this.onSubmit},this.renderErrors(),c.default.createElement(E,{schema:m,uiSchema:g,errorSchema:v,idSchema:b,formData:y,onChange:this.onChange,onBlur:this.onBlur,registry:_,safeRenderCompletion:n}),t||c.default.createElement("p",null,c.default.createElement("button",{type:"submit",className:"btn btn-info"},"Submit")))}}]),t}(u.Component);v.defaultProps={uiSchema:{},noValidate:!1,liveValidate:!1,safeRenderCompletion:!1,noHtml5Validate:!1,ErrorList:h.default},t.default=v,v.propTypes={schema:f.default.object.isRequired,uiSchema:f.default.object,formData:f.default.any,widgets:f.default.objectOf(f.default.oneOfType([f.default.func,f.default.object])),fields:f.default.objectOf(f.default.func),ArrayFieldTemplate:f.default.func,FieldTemplate:f.default.func,ErrorList:f.default.func,onChange:f.default.func,onError:f.default.func,showErrorList:f.default.bool,onSubmit:f.default.func,id:f.default.string,className:f.default.string,name:f.default.string,method:f.default.string,target:f.default.string,action:f.default.string,autocomplete:f.default.string,enctype:f.default.string,acceptcharset:f.default.string,noValidate:f.default.bool,noHtml5Validate:f.default.bool,liveValidate:f.default.bool,validate:f.default.func,transformErrors:f.default.func,safeRenderCompletion:f.default.bool,formContext:f.default.object}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function u(e){var t=e.TitleField,n=e.idSchema,r=e.title,i=e.required;if(!r)return b.default.createElement("div",null);var o=n.$id+"__title";return b.default.createElement(t,{id:o,title:r,required:i})}function c(e){var t=e.DescriptionField,n=e.idSchema,r=e.description;if(!r)return b.default.createElement("div",null);var i=n.$id+"__description";return b.default.createElement(t,{id:i,description:r})}function d(e){var t=e.type,n=void 0===t?"default":t,r=e.icon,i=e.className,o=l(e,["type","icon","className"]);return b.default.createElement("button",y({type:"button",className:"btn btn-"+n+" "+i},o),b.default.createElement("i",{className:"glyphicon glyphicon-"+r}))}function f(e){var t={flex:1,paddingLeft:6,paddingRight:6,fontWeight:"bold"};return b.default.createElement("div",{key:e.index,className:e.className},b.default.createElement("div",{className:e.hasToolbar?"col-xs-9":"col-xs-12"},e.children),e.hasToolbar&&b.default.createElement("div",{className:"col-xs-3 array-item-toolbox"},b.default.createElement("div",{className:"btn-group",style:{display:"flex",justifyContent:"space-around"}},(e.hasMoveUp||e.hasMoveDown)&&b.default.createElement(d,{icon:"arrow-up",className:"array-item-move-up",tabIndex:"-1",style:t,disabled:e.disabled||e.readonly||!e.hasMoveUp,onClick:e.onReorderClick(e.index,e.index-1)}),(e.hasMoveUp||e.hasMoveDown)&&b.default.createElement(d,{icon:"arrow-down",className:"array-item-move-down",tabIndex:"-1",style:t,disabled:e.disabled||e.readonly||!e.hasMoveDown,onClick:e.onReorderClick(e.index,e.index+1)}),e.hasRemove&&b.default.createElement(d,{type:"danger",icon:"remove",className:"array-item-remove",tabIndex:"-1",style:t,disabled:e.disabled||e.readonly,onClick:e.onDropIndexClick(e.index)}))))}function p(e){return b.default.createElement("fieldset",{className:e.className},b.default.createElement(u,{key:"array-field-title-"+e.idSchema.$id,TitleField:e.TitleField,idSchema:e.idSchema,title:e.title,required:e.required}),e.schema.description&&b.default.createElement("div",{className:"field-description",key:"field-description-"+e.idSchema.$id},e.schema.description),b.default.createElement("div",{className:"row array-item-list",key:"array-item-list-"+e.idSchema.$id},e.items&&e.items.map(f)),e.canAdd&&b.default.createElement(m,{onClick:e.onAddClick,disabled:e.disabled||e.readonly}))}function h(e){return b.default.createElement("fieldset",{className:e.className},b.default.createElement(u,{key:"array-field-title-"+e.idSchema.$id,TitleField:e.TitleField,idSchema:e.idSchema,title:e.title,required:e.required}),e.schema.description&&b.default.createElement(c,{key:"array-field-description-"+e.idSchema.$id,DescriptionField:e.DescriptionField,idSchema:e.idSchema,description:e.schema.description}),b.default.createElement("div",{className:"row array-item-list",key:"array-item-list-"+e.idSchema.$id},e.items&&e.items.map(function(e){return f(e)})),e.canAdd&&b.default.createElement(m,{onClick:e.onAddClick,disabled:e.disabled||e.readonly}))}function m(e){var t=e.onClick,n=e.disabled;return b.default.createElement("div",{className:"row"},b.default.createElement("p",{className:"col-xs-3 col-xs-offset-9 array-item-add text-right"},b.default.createElement(d,{type:"info",icon:"plus",className:"btn-add col-xs-12",tabIndex:"0",onClick:t,disabled:n})))}Object.defineProperty(t,"__esModule",{value:!0});var g=function(){function e(e,t){for(var n=0;n0,canMoveDown:n=O.length,s=a?w:O[n],l=o.$id+"_"+n,u=(0,S.toIdSchema)(s,l,v),d=a?r.additionalItems||{}:Array.isArray(r.items)?r.items[n]:r.items||{},f=i?i[n]:void 0;return e.renderArrayFieldItem({index:n,canRemove:a,canMoveUp:n>=O.length+1,canMoveDown:a&&n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e){var t=e.schema,n=e.name,r=e.uiSchema,o=e.idSchema,s=e.formData,u=e.registry,c=void 0===u?(0,d.getDefaultRegistry)():u,f=e.required,p=e.disabled,h=e.readonly,m=e.autofocus,g=e.onChange,y=t.title,v=c.widgets,b=c.formContext,_=(0,d.getUiOptions)(r),E=_.widget,S=void 0===E?"checkbox":E,O=i(_,["widget"]),w=(0,d.getWidget)(t,S,v),T=(0,d.optionsList)({enum:[!0,!1],enumNames:t.enumNames||["yes","no"]});return l.default.createElement(w,{options:a({},O,{enumOptions:T}),schema:t,id:o&&o.$id,onChange:g,label:void 0===y?n:y,value:s,required:f,disabled:p,readonly:h,registry:c,formContext:b,autofocus:m})}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function l(e,t,n){var r=t["ui:field"];if("function"==typeof r)return r;if("string"==typeof r&&r in n)return n[r];var i=w[e.type];return i in n?n[i]:S.default}function u(e){var t=e.label,n=e.required,r=e.id;return t?y.default.createElement("label",{className:"control-label",htmlFor:r},n?t+O:t):y.default.createElement("div",null)}function c(e){var t=e.help;return t?"string"==typeof t?y.default.createElement("p",{className:"help-block"},t):y.default.createElement("div",{className:"help-block"},t):y.default.createElement("div",null)}function d(e){var t=e.errors,n=void 0===t?[]:t;return 0===n.length?y.default.createElement("div",null):y.default.createElement("div",null,y.default.createElement("p",null),y.default.createElement("ul",{className:"error-detail bs-callout bs-callout-info"},n.map(function(e,t){return y.default.createElement("li",{className:"text-danger",key:t},e)})))}function f(e){var t=e.id,n=e.classNames,r=e.label,i=e.children,o=e.errors,a=e.help,s=e.description,l=e.hidden,c=e.required,d=e.displayLabel;return l?i:y.default.createElement("div",{className:n},d&&y.default.createElement(u,{label:r,required:c,id:t}),d&&s?s:null,i,o,a)}function p(e){var t=e.uiSchema,n=e.errorSchema,r=e.idSchema,i=e.name,o=e.required,a=e.registry,u=void 0===a?(0,_.getDefaultRegistry)():a,p=u.definitions,h=u.fields,g=u.formContext,v=u.FieldTemplate,b=void 0===v?f:v,E=(0,_.retrieveSchema)(e.schema,p),S=l(E,t,h),O=h.DescriptionField,w=Boolean(e.disabled||t["ui:disabled"]),T=Boolean(e.readonly||t["ui:readonly"]),P=Boolean(e.autofocus||t["ui:autofocus"]);if(0===Object.keys(E).length)return y.default.createElement("div",null);var A=(0,_.getUiOptions)(t),x=A.label,C=void 0===x||x;"array"===E.type&&(C=(0,_.isMultiSelect)(E)||(0,_.isFilesArray)(E,t)),"object"===E.type&&(C=!1),"boolean"!==E.type||t["ui:widget"]||(C=!1),t["ui:field"]&&(C=!1);var k=n.__errors,D=s(n,["__errors"]),M=y.default.createElement(S,m({},e,{schema:E,uiSchema:m({},t,{classNames:void 0}),disabled:w,readonly:T,autofocus:P,errorSchema:D,formContext:g})),R=E.type,I=r.$id,N=t["ui:title"]||e.schema.title||E.title||i,F=t["ui:description"]||e.schema.description||E.description,L=k,j=t["ui:help"],B="hidden"===t["ui:widget"],U=["form-group","field","field-"+R,L&&L.length>0?"field-error has-error has-danger":"",t.classNames].join(" ").trim(),z={description:y.default.createElement(O,{id:I+"__description",description:F,formContext:g}),rawDescription:F,help:y.default.createElement(c,{help:j}),rawHelp:"string"==typeof j?j:void 0,errors:y.default.createElement(d,{errors:L}),rawErrors:L,id:I,label:N,hidden:B,required:o,readonly:T,displayLabel:C,classNames:U,formContext:g,fields:h,schema:E,uiSchema:t};return y.default.createElement(b,z,M)}Object.defineProperty(t,"__esModule",{value:!0});var h=function(){function e(e,t){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e){var t=e.schema,n=e.name,r=e.uiSchema,o=e.idSchema,s=e.formData,u=e.required,c=e.disabled,f=e.readonly,p=e.autofocus,h=e.onChange,m=e.onBlur,g=e.registry,y=void 0===g?(0,d.getDefaultRegistry)():g,v=t.title,b=t.format,_=y.widgets,E=y.formContext,S=Array.isArray(t.enum)&&(0,d.optionsList)(t),O=b||(S?"select":"text"),w=(0,d.getUiOptions)(r),T=w.widget,P=void 0===T?O:T,A=w.placeholder,x=void 0===A?"":A,C=i(w,["widget","placeholder"]),k=(0,d.getWidget)(t,P,_);return l.default.createElement(k,{options:a({},C,{enumOptions:S}),schema:t,id:o&&o.$id,label:void 0===v?n:v,value:s,onChange:h,onBlur:m,required:u,disabled:c,readonly:f,formContext:E,autofocus:p,registry:y,placeholder:x})}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;tn.indexOf(t)})}function o(e,t){return t.filter(function(t){return t!==e})}function a(e){var t=e.id,n=e.disabled,r=e.options,a=e.value,s=e.autofocus,u=e.readonly,c=e.onChange,d=r.enumOptions,f=r.inline;return l.default.createElement("div",{className:"checkboxes",id:t},d.map(function(e,r){var p=-1!==a.indexOf(e.value),h=n||u?"disabled":"",m=l.default.createElement("span",null,l.default.createElement("input",{type:"checkbox",id:t+"_"+r,checked:p,disabled:n||u,autoFocus:s&&0===r,onChange:function(t){var n=d.map(function(e){return e.value});c(t.target.checked?i(e.value,a,n):o(e.value,a))}}),l.default.createElement("span",null,e.label));return f?l.default.createElement("label",{key:r,className:"checkbox-inline "+h},m):l.default.createElement("div",{key:r,className:"checkbox "+h},l.default.createElement("label",null,m))}))}Object.defineProperty(t,"__esModule",{value:!0});var s=n(0),l=r(s),u=n(1),c=r(u);a.defaultProps={autofocus:!1,options:{inline:!1}},a.propTypes={schema:c.default.object.isRequired,id:c.default.string.isRequired,options:c.default.shape({enumOptions:c.default.array,inline:c.default.bool}).isRequired,value:c.default.any,required:c.default.bool,readonly:c.default.bool,disabled:c.default.bool,multiple:c.default.bool,autofocus:c.default.bool,onChange:c.default.func},t.default=a},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.disabled,n=e.readonly;return s.default.createElement(d.default,o({type:"color"},e,{disabled:t||n}))}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"root",n=[];return"__errors"in e&&(n=n.concat(e.__errors.map(function(e){return{stack:t+": "+e}}))),Object.keys(e).reduce(function(t,n){return"__errors"!==n&&(t=t.concat(o(e[n],n))),t},n)}function a(e){var t={__errors:[],addError:function(e){this.__errors.push(e)}};return(0,p.isObject)(e)?Object.keys(e).reduce(function(t,n){return u({},t,r({},n,a(e[n])))},t):Array.isArray(e)?e.reduce(function(e,t,n){return u({},e,r({},n,a(t)))},t):t}function s(e){return Object.keys(e).reduce(function(t,n){return"addError"===n?t:"__errors"===n?u({},t,r({},n,e[n])):u({},t,r({},n,s(e[n])))},{})}function l(e,t,n,r){var l=(0,f.validate)(e,t),u=l.errors;"function"==typeof r&&(u=r(u));var c=i(u);if("function"!=typeof n)return{errors:u,errorSchema:c};var d=n(e,a(e)),h=s(d),m=(0,p.mergeObjects)(c,h,!0);return{errors:o(m),errorSchema:m}}Object.defineProperty(t,"__esModule",{value:!0});var u=Object.assign||function(e){for(var t=1;t0?(0,_.default)(document.body).add(r.props.bodyOpenClassName):(0,_.default)(document.body).remove(r.props.bodyOpenClassName),e.ariaHideApp&&w.toggle(e.isOpen,e.appElement),r.portal=x(r,f.default.createElement(S.default,u({defaultStyles:t.defaultStyles},e)),r.node)},i=n,a(r,i)}return s(t,e),c(t,[{key:"componentDidMount",value:function(){this.node=document.createElement("div"),this.node.className=this.props.portalClassName,this.props.isOpen&&P.add(this),l(this.props.parentSelector).appendChild(this.node),this.renderPortal(this.props)}},{key:"componentWillReceiveProps",value:function(e){var t=e.isOpen;if(this.props.isOpen||t){t&&P.add(this),t||P.remove(this);var n=l(this.props.parentSelector),r=l(e.parentSelector);r!==n&&(n.removeChild(this.node),r.appendChild(this.node)),this.renderPortal(e)}}},{key:"componentWillUpdate",value:function(e){e.portalClassName!==this.props.portalClassName&&(this.node.className=e.portalClassName)}},{key:"componentWillUnmount",value:function(){var e=this;if(this.node){P.remove(this),this.props.ariaHideApp&&w.show(this.props.appElement);var t=this.portal.state,n=Date.now(),r=t.isOpen&&this.props.closeTimeoutMS&&(t.closesAt||n+this.props.closeTimeoutMS);r?(t.beforeClose||this.portal.closeWithTimeout(),setTimeout(function(){return e.removePortal},r-n)):this.removePortal()}}},{key:"render",value:function(){return null}}],[{key:"setAppElement",value:function(e){w.setElement(e||k)}},{key:"injectCSS",value:function(){console.warn("React-Modal: injectCSS has been deprecated and no longer has any effect. It will be removed in a later version")}}]),t}(d.Component);D.propTypes={isOpen:g.default.bool.isRequired,style:g.default.shape({content:g.default.object,overlay:g.default.object}),portalClassName:g.default.string,bodyOpenClassName:g.default.string,className:g.default.oneOfType([g.default.string,g.default.object]),overlayClassName:g.default.oneOfType([g.default.string,g.default.object]),appElement:g.default.instanceOf(C),onAfterOpen:g.default.func,onRequestClose:g.default.func,closeTimeoutMS:g.default.number,ariaHideApp:g.default.bool,shouldCloseOnOverlayClick:g.default.bool,parentSelector:g.default.func,role:g.default.string,contentLabel:g.default.string.isRequired},D.defaultProps={isOpen:!1,portalClassName:"ReactModalPortal",bodyOpenClassName:"ReactModal__Body--open",ariaHideApp:!0,closeTimeoutMS:0,shouldCloseOnOverlayClick:!0,parentSelector:function(){return document.body}},D.defaultStyles={overlay:{position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(255, 255, 255, 0.75)"},content:{position:"absolute",top:"40px",left:"40px",right:"40px",bottom:"40px",border:"1px solid #ccc",background:"#fff",overflow:"auto",WebkitOverflowScrolling:"touch",borderRadius:"4px",outline:"none",padding:"20px"}},t.default=D},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=Object.assign||function(e){for(var t=1;t0?n.closeWithTimeout():n.closeWithoutTimeout()},n.focusContent=function(){return n.content&&!n.contentHasFocus()&&n.content.focus()},n.closeWithTimeout=function(){var e=Date.now()+n.props.closeTimeoutMS;n.setState({beforeClose:!0,closesAt:e},function(){n.closeTimer=setTimeout(n.closeWithoutTimeout,n.state.closesAt-Date.now())})},n.closeWithoutTimeout=function(){n.setState({beforeClose:!1,isOpen:!1,afterOpen:!1,closesAt:null},n.afterClose)},n.handleKeyDown=function(e){e.keyCode===v&&(0,g.default)(n.content,e),e.keyCode===b&&(e.preventDefault(),n.requestClose(e))},n.handleOverlayOnClick=function(e){null===n.shouldClose&&(n.shouldClose=!0),n.shouldClose&&n.props.shouldCloseOnOverlayClick&&(n.ownerHandlesClose()?n.requestClose(e):n.focusContent()),n.shouldClose=null},n.handleContentOnClick=function(){n.shouldClose=!1},n.requestClose=function(e){return n.ownerHandlesClose()&&n.props.onRequestClose(e)},n.ownerHandlesClose=function(){return n.props.onRequestClose},n.shouldBeClosed=function(){return!n.state.isOpen&&!n.state.beforeClose},n.contentHasFocus=function(){return document.activeElement===n.content||n.content.contains(document.activeElement)},n.buildClassName=function(e,t){var r="object"===(void 0===t?"undefined":l(t))?t:{base:y[e],afterOpen:y[e]+"--after-open",beforeClose:y[e]+"--before-close"},i=r.base;return n.state.afterOpen&&(i=i+" "+r.afterOpen),n.state.beforeClose&&(i=i+" "+r.beforeClose),"string"==typeof t&&t?i+" "+t:i},n.state={afterOpen:!1,beforeClose:!1},n.shouldClose=null,n}return a(t,e),u(t,[{key:"componentDidMount",value:function(){this.props.isOpen&&(this.setFocusAfterRender(!0),this.open())}},{key:"componentWillReceiveProps",value:function(e){!this.props.isOpen&&e.isOpen?(this.setFocusAfterRender(!0),this.open()):this.props.isOpen&&!e.isOpen&&this.close()}},{key:"componentDidUpdate",value:function(){this.focusAfterRender&&(this.focusContent(),this.setFocusAfterRender(!1))}},{key:"componentWillUnmount",value:function(){clearTimeout(this.closeTimer)}},{key:"render",value:function(){var e=this.props,t=e.className,n=e.overlayClassName,r=e.defaultStyles,i=t?{}:r.content,o=n?{}:r.overlay;return this.shouldBeClosed()?d.default.createElement("div",null):d.default.createElement("div",{ref:this.setOverlayRef,className:this.buildClassName("overlay",n),style:s({},o,this.props.style.overlay),onClick:this.handleOverlayOnClick},d.default.createElement("div",{ref:this.setContentRef,style:s({},i,this.props.style.content),className:this.buildClassName("content",t),tabIndex:"-1",onKeyDown:this.handleKeyDown,onClick:this.handleContentOnClick,role:this.props.role,"aria-label":this.props.contentLabel},this.props.children))}}]),t}(c.Component);_.defaultProps={style:{overlay:{},content:{}}},_.propTypes={isOpen:f.PropTypes.bool.isRequired,defaultStyles:f.PropTypes.shape({content:f.PropTypes.object,overlay:f.PropTypes.object}),style:f.PropTypes.shape({content:f.PropTypes.object,overlay:f.PropTypes.object}),className:f.PropTypes.oneOfType([f.PropTypes.string,f.PropTypes.object]),overlayClassName:f.PropTypes.oneOfType([f.PropTypes.string,f.PropTypes.object]),onAfterOpen:f.PropTypes.func,onRequestClose:f.PropTypes.func,closeTimeoutMS:f.PropTypes.number,shouldCloseOnOverlayClick:f.PropTypes.bool,role:f.PropTypes.string,contentLabel:f.PropTypes.string,children:f.PropTypes.node},t.default=_},function(e,t,n){"use strict";function r(e){var t=e;if("string"==typeof t){var n=document.querySelectorAll(t);t="length"in n?n[0]:n}return u=t||u}function i(e){if(!e&&!u)throw new Error(["react-modal: You must set an element with","`Modal.setAppElement(el)` to make this accessible"])}function o(e){i(e),(e||u).setAttribute("aria-hidden","true")}function a(e){i(e),(e||u).removeAttribute("aria-hidden")}function s(e,t){(e?o:a)(t)}function l(){u=document.body}Object.defineProperty(t,"__esModule",{value:!0}),t.setElement=r,t.validateElement=i,t.hide=o,t.show=a,t.toggle=s,t.resetForTesting=l;var u="undefined"!=typeof document?document.body:null},function(e,t,n){"use strict";function r(){p=!0}function i(){if(p){if(p=!1,!f)return;setTimeout(function(){if(!f.contains(document.activeElement)){((0,c.default)(f)[0]||f).focus()}},0)}}function o(){d.push(document.activeElement)}function a(){var e=null;try{return e=d.pop(),void e.focus()}catch(t){console.warn(["You tried to return focus to",e,"but it is not in the DOM anymore"].join(" "))}}function s(e){f=e,window.addEventListener?(window.addEventListener("blur",r,!1),document.addEventListener("focus",i,!0)):(window.attachEvent("onBlur",r),document.attachEvent("onFocus",i))}function l(){f=null,window.addEventListener?(window.removeEventListener("blur",r),document.removeEventListener("focus",i)):(window.detachEvent("onBlur",r),document.detachEvent("onFocus",i))}Object.defineProperty(t,"__esModule",{value:!0}),t.handleBlur=r,t.handleFocus=i,t.markForFocusLater=o,t.returnFocus=a,t.setupScopedFocus=s,t.teardownScopedFocus=l;var u=n(219),c=function(e){return e&&e.__esModule?e:{default:e}}(u),d=[],f=null,p=!1},function(e,t,n){"use strict";function r(e){-1===a.indexOf(e)&&a.push(e)}function i(e){var t=a.indexOf(e);-1!==t&&a.splice(t,1)}function o(){return a.length}Object.defineProperty(t,"__esModule",{value:!0}),t.add=r,t.remove=i,t.count=o;var a=[]},function(e,t,n){"use strict";function r(e,t){var n=(0,o.default)(e);if(!n.length)return void t.preventDefault();n[t.shiftKey?0:n.length-1]!==document.activeElement&&e!==document.activeElement||(t.preventDefault(),n[t.shiftKey?n.length-1:0].focus())}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(219),o=function(e){return e&&e.__esModule?e:{default:e}}(i)},function(e,t,n){var r,i,o;!function(a,s){i=[e,n(553),n(554),n(555),n(556),n(558),n(557),n(559),n(560),n(561),n(562),n(563),n(564),n(565),n(566),n(567),n(568),n(569),n(570),n(571)],r=s,void 0!==(o="function"==typeof r?r.apply(t,i):r)&&(e.exports=o)}(0,function(e,t,n,r,i,o,a,s,l,u,c,d,f,p,h,m,g,y,v,b){"use strict";function _(e){return e&&e.__esModule?e:{default:e}}var E=_(t),S=_(n),O=_(r),w=_(i),T=_(o),P=_(a),A=_(s),x=_(l),C=_(u),k=_(c),D=_(d),M=_(f),R=_(p),I=_(h),N=_(m),F=_(g),L=_(y),j=_(v),B=_(b);e.exports={BarLoader:E.default,BeatLoader:S.default,BounceLoader:O.default,CircleLoader:w.default,ClipLoader:T.default,ClimbingBoxLoader:P.default,DotLoader:A.default,FadeLoader:x.default,GridLoader:C.default,HashLoader:k.default,MoonLoader:D.default,PacmanLoader:M.default,PropagateLoader:R.default,PulseLoader:I.default,RingLoader:N.default,RiseLoader:F.default,RotateLoader:L.default,ScaleLoader:j.default,SyncLoader:B.default}})},function(e,t,n){var r,i,o;!function(a,s){i=[t,n(0),n(1),n(10),n(11),n(221)],r=s,void 0!==(o="function"==typeof r?r.apply(t,i):r)&&(e.exports=o)}(0,function(e,t,n,r,i,o){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(e,"__esModule",{value:!0});var c=a(t),d=a(n),f=a(r),p=a(i),h=function(){function e(e,t){for(var n=0;nd?h=d:this.setState({position:a,resized:!0}),this.props.onChange&&this.props.onChange(h),this.setState({draggedSize:h}),n.setState({size:h})}}}}},{key:"onMouseUp",value:function(){this.props.allowResize&&this.state.active&&("function"==typeof this.props.onDragFinished&&this.props.onDragFinished(this.state.draggedSize),this.setState({active:!1}))}},{key:"setSize",value:function(e,t){var n="first"===this.props.primary?this.pane1:this.pane2,r=void 0;n&&(r=e.size||t&&t.draggedSize||e.defaultSize||e.minSize,n.setState({size:r}),e.size!==t.draggedSize&&this.setState({draggedSize:r}))}},{key:"render",value:function(){var e=this,t=this.props,n=t.split,r=t.allowResize,i=r?"":"disabled",o=l({},this.props.style||{},{display:"flex",flex:1,position:"relative",outline:"none",overflow:"hidden",MozUserSelect:"text",WebkitUserSelect:"text",msUserSelect:"text",userSelect:"text"});"vertical"===n?l(o,{flexDirection:"row",height:"100%",position:"absolute",left:0,right:0}):l(o,{flexDirection:"column",height:"100%",minHeight:"100%",position:"absolute",top:0,bottom:0,width:"100%"});var a=this.props.children,s=["SplitPane",this.props.className,n,i],u=this.props.prefixer.prefix(l({},this.props.paneStyle||{},this.props.pane1Style||{})),c=this.props.prefixer.prefix(l({},this.props.paneStyle||{},this.props.pane2Style||{}));return d.default.createElement("div",{className:s.join(" "),style:this.props.prefixer.prefix(o),ref:function(t){e.splitPane=t}},d.default.createElement(b.default,{ref:function(t){e.pane1=t},key:"pane1",className:"Pane1",style:u,split:n,size:"first"===this.props.primary?this.props.size||this.props.defaultSize||this.props.minSize:void 0},a[0]),d.default.createElement(E.default,{ref:function(t){e.resizer=t},key:"resizer",className:i,resizerClassName:this.props.resizerClassName,onMouseDown:this.onMouseDown,onTouchStart:this.onTouchStart,onTouchEnd:this.onMouseUp,style:this.props.resizerStyle||{},split:n}),d.default.createElement(b.default,{ref:function(t){e.pane2=t},key:"pane2",className:"Pane2",style:c,split:n,size:"second"===this.props.primary?this.props.size||this.props.defaultSize||this.props.minSize:void 0},a[1]))}}]),t}(c.Component);S.propTypes={primary:c.PropTypes.oneOf(["first","second"]),minSize:c.PropTypes.oneOfType([d.default.PropTypes.string,d.default.PropTypes.number]),maxSize:c.PropTypes.oneOfType([d.default.PropTypes.string,d.default.PropTypes.number]),defaultSize:c.PropTypes.oneOfType([d.default.PropTypes.string,d.default.PropTypes.number]),size:c.PropTypes.oneOfType([d.default.PropTypes.string,d.default.PropTypes.number]),allowResize:c.PropTypes.bool,split:c.PropTypes.oneOf(["vertical","horizontal"]),onDragStarted:c.PropTypes.func,onDragFinished:c.PropTypes.func,onChange:c.PropTypes.func,prefixer:c.PropTypes.instanceOf(m.default).isRequired,style:y.default,resizerStyle:y.default,paneStyle:y.default,pane1Style:y.default,pane2Style:y.default,className:c.PropTypes.string,resizerClassName:c.PropTypes.string,children:c.PropTypes.arrayOf(c.PropTypes.node).isRequired},S.defaultProps={split:"vertical",minSize:50,allowResize:!0,prefixer:new m.default({userAgent:"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Safari/537.2"}),primary:"first"},t.default=S,e.exports=t.default},function(e,t){e.exports=["alignContent","MozAlignContent","WebkitAlignContent","MSAlignContent","OAlignContent","alignItems","MozAlignItems","WebkitAlignItems","MSAlignItems","OAlignItems","alignSelf","MozAlignSelf","WebkitAlignSelf","MSAlignSelf","OAlignSelf","all","MozAll","WebkitAll","MSAll","OAll","animation","MozAnimation","WebkitAnimation","MSAnimation","OAnimation","animationDelay","MozAnimationDelay","WebkitAnimationDelay","MSAnimationDelay","OAnimationDelay","animationDirection","MozAnimationDirection","WebkitAnimationDirection","MSAnimationDirection","OAnimationDirection","animationDuration","MozAnimationDuration","WebkitAnimationDuration","MSAnimationDuration","OAnimationDuration","animationFillMode","MozAnimationFillMode","WebkitAnimationFillMode","MSAnimationFillMode","OAnimationFillMode","animationIterationCount","MozAnimationIterationCount","WebkitAnimationIterationCount","MSAnimationIterationCount","OAnimationIterationCount","animationName","MozAnimationName","WebkitAnimationName","MSAnimationName","OAnimationName","animationPlayState","MozAnimationPlayState","WebkitAnimationPlayState","MSAnimationPlayState","OAnimationPlayState","animationTimingFunction","MozAnimationTimingFunction","WebkitAnimationTimingFunction","MSAnimationTimingFunction","OAnimationTimingFunction","backfaceVisibility","MozBackfaceVisibility","WebkitBackfaceVisibility","MSBackfaceVisibility","OBackfaceVisibility","background","MozBackground","WebkitBackground","MSBackground","OBackground","backgroundAttachment","MozBackgroundAttachment","WebkitBackgroundAttachment","MSBackgroundAttachment","OBackgroundAttachment","backgroundBlendMode","MozBackgroundBlendMode","WebkitBackgroundBlendMode","MSBackgroundBlendMode","OBackgroundBlendMode","backgroundClip","MozBackgroundClip","WebkitBackgroundClip","MSBackgroundClip","OBackgroundClip","backgroundColor","MozBackgroundColor","WebkitBackgroundColor","MSBackgroundColor","OBackgroundColor","backgroundImage","MozBackgroundImage","WebkitBackgroundImage","MSBackgroundImage","OBackgroundImage","backgroundOrigin","MozBackgroundOrigin","WebkitBackgroundOrigin","MSBackgroundOrigin","OBackgroundOrigin","backgroundPosition","MozBackgroundPosition","WebkitBackgroundPosition","MSBackgroundPosition","OBackgroundPosition","backgroundRepeat","MozBackgroundRepeat","WebkitBackgroundRepeat","MSBackgroundRepeat","OBackgroundRepeat","backgroundSize","MozBackgroundSize","WebkitBackgroundSize","MSBackgroundSize","OBackgroundSize","blockSize","MozBlockSize","WebkitBlockSize","MSBlockSize","OBlockSize","border","MozBorder","WebkitBorder","MSBorder","OBorder","borderBlockEnd","MozBorderBlockEnd","WebkitBorderBlockEnd","MSBorderBlockEnd","OBorderBlockEnd","borderBlockEndColor","MozBorderBlockEndColor","WebkitBorderBlockEndColor","MSBorderBlockEndColor","OBorderBlockEndColor","borderBlockEndStyle","MozBorderBlockEndStyle","WebkitBorderBlockEndStyle","MSBorderBlockEndStyle","OBorderBlockEndStyle","borderBlockEndWidth","MozBorderBlockEndWidth","WebkitBorderBlockEndWidth","MSBorderBlockEndWidth","OBorderBlockEndWidth","borderBlockStart","MozBorderBlockStart","WebkitBorderBlockStart","MSBorderBlockStart","OBorderBlockStart","borderBlockStartColor","MozBorderBlockStartColor","WebkitBorderBlockStartColor","MSBorderBlockStartColor","OBorderBlockStartColor","borderBlockStartStyle","MozBorderBlockStartStyle","WebkitBorderBlockStartStyle","MSBorderBlockStartStyle","OBorderBlockStartStyle","borderBlockStartWidth","MozBorderBlockStartWidth","WebkitBorderBlockStartWidth","MSBorderBlockStartWidth","OBorderBlockStartWidth","borderBottom","MozBorderBottom","WebkitBorderBottom","MSBorderBottom","OBorderBottom","borderBottomColor","MozBorderBottomColor","WebkitBorderBottomColor","MSBorderBottomColor","OBorderBottomColor","borderBottomLeftRadius","MozBorderBottomLeftRadius","WebkitBorderBottomLeftRadius","MSBorderBottomLeftRadius","OBorderBottomLeftRadius","borderBottomRightRadius","MozBorderBottomRightRadius","WebkitBorderBottomRightRadius","MSBorderBottomRightRadius","OBorderBottomRightRadius","borderBottomStyle","MozBorderBottomStyle","WebkitBorderBottomStyle","MSBorderBottomStyle","OBorderBottomStyle","borderBottomWidth","MozBorderBottomWidth","WebkitBorderBottomWidth","MSBorderBottomWidth","OBorderBottomWidth","borderCollapse","MozBorderCollapse","WebkitBorderCollapse","MSBorderCollapse","OBorderCollapse","borderColor","MozBorderColor","WebkitBorderColor","MSBorderColor","OBorderColor","borderImage","MozBorderImage","WebkitBorderImage","MSBorderImage","OBorderImage","borderImageOutset","MozBorderImageOutset","WebkitBorderImageOutset","MSBorderImageOutset","OBorderImageOutset","borderImageRepeat","MozBorderImageRepeat","WebkitBorderImageRepeat","MSBorderImageRepeat","OBorderImageRepeat","borderImageSlice","MozBorderImageSlice","WebkitBorderImageSlice","MSBorderImageSlice","OBorderImageSlice","borderImageSource","MozBorderImageSource","WebkitBorderImageSource","MSBorderImageSource","OBorderImageSource","borderImageWidth","MozBorderImageWidth","WebkitBorderImageWidth","MSBorderImageWidth","OBorderImageWidth","borderInlineEnd","MozBorderInlineEnd","WebkitBorderInlineEnd","MSBorderInlineEnd","OBorderInlineEnd","borderInlineEndColor","MozBorderInlineEndColor","WebkitBorderInlineEndColor","MSBorderInlineEndColor","OBorderInlineEndColor","borderInlineEndStyle","MozBorderInlineEndStyle","WebkitBorderInlineEndStyle","MSBorderInlineEndStyle","OBorderInlineEndStyle","borderInlineEndWidth","MozBorderInlineEndWidth","WebkitBorderInlineEndWidth","MSBorderInlineEndWidth","OBorderInlineEndWidth","borderInlineStart","MozBorderInlineStart","WebkitBorderInlineStart","MSBorderInlineStart","OBorderInlineStart","borderInlineStartColor","MozBorderInlineStartColor","WebkitBorderInlineStartColor","MSBorderInlineStartColor","OBorderInlineStartColor","borderInlineStartStyle","MozBorderInlineStartStyle","WebkitBorderInlineStartStyle","MSBorderInlineStartStyle","OBorderInlineStartStyle","borderInlineStartWidth","MozBorderInlineStartWidth","WebkitBorderInlineStartWidth","MSBorderInlineStartWidth","OBorderInlineStartWidth","borderLeft","MozBorderLeft","WebkitBorderLeft","MSBorderLeft","OBorderLeft","borderLeftColor","MozBorderLeftColor","WebkitBorderLeftColor","MSBorderLeftColor","OBorderLeftColor","borderLeftStyle","MozBorderLeftStyle","WebkitBorderLeftStyle","MSBorderLeftStyle","OBorderLeftStyle","borderLeftWidth","MozBorderLeftWidth","WebkitBorderLeftWidth","MSBorderLeftWidth","OBorderLeftWidth","borderRadius","MozBorderRadius","WebkitBorderRadius","MSBorderRadius","OBorderRadius","borderRight","MozBorderRight","WebkitBorderRight","MSBorderRight","OBorderRight","borderRightColor","MozBorderRightColor","WebkitBorderRightColor","MSBorderRightColor","OBorderRightColor","borderRightStyle","MozBorderRightStyle","WebkitBorderRightStyle","MSBorderRightStyle","OBorderRightStyle","borderRightWidth","MozBorderRightWidth","WebkitBorderRightWidth","MSBorderRightWidth","OBorderRightWidth","borderSpacing","MozBorderSpacing","WebkitBorderSpacing","MSBorderSpacing","OBorderSpacing","borderStyle","MozBorderStyle","WebkitBorderStyle","MSBorderStyle","OBorderStyle","borderTop","MozBorderTop","WebkitBorderTop","MSBorderTop","OBorderTop","borderTopColor","MozBorderTopColor","WebkitBorderTopColor","MSBorderTopColor","OBorderTopColor","borderTopLeftRadius","MozBorderTopLeftRadius","WebkitBorderTopLeftRadius","MSBorderTopLeftRadius","OBorderTopLeftRadius","borderTopRightRadius","MozBorderTopRightRadius","WebkitBorderTopRightRadius","MSBorderTopRightRadius","OBorderTopRightRadius","borderTopStyle","MozBorderTopStyle","WebkitBorderTopStyle","MSBorderTopStyle","OBorderTopStyle","borderTopWidth","MozBorderTopWidth","WebkitBorderTopWidth","MSBorderTopWidth","OBorderTopWidth","borderWidth","MozBorderWidth","WebkitBorderWidth","MSBorderWidth","OBorderWidth","bottom","MozBottom","WebkitBottom","MSBottom","OBottom","boxDecorationBreak","MozBoxDecorationBreak","WebkitBoxDecorationBreak","MSBoxDecorationBreak","OBoxDecorationBreak","boxShadow","MozBoxShadow","WebkitBoxShadow","MSBoxShadow","OBoxShadow","boxSizing","MozBoxSizing","WebkitBoxSizing","MSBoxSizing","OBoxSizing","breakAfter","MozBreakAfter","WebkitBreakAfter","MSBreakAfter","OBreakAfter","breakBefore","MozBreakBefore","WebkitBreakBefore","MSBreakBefore","OBreakBefore","breakInside","MozBreakInside","WebkitBreakInside","MSBreakInside","OBreakInside","captionSide","MozCaptionSide","WebkitCaptionSide","MSCaptionSide","OCaptionSide","caretColor","MozCaretColor","WebkitCaretColor","MSCaretColor","OCaretColor","ch","MozCh","WebkitCh","MSCh","OCh","clear","MozClear","WebkitClear","MSClear","OClear","clip","MozClip","WebkitClip","MSClip","OClip","clipPath","MozClipPath","WebkitClipPath","MSClipPath","OClipPath","cm","MozCm","WebkitCm","MSCm","OCm","color","MozColor","WebkitColor","MSColor","OColor","columnCount","MozColumnCount","WebkitColumnCount","MSColumnCount","OColumnCount","columnFill","MozColumnFill","WebkitColumnFill","MSColumnFill","OColumnFill","columnGap","MozColumnGap","WebkitColumnGap","MSColumnGap","OColumnGap","columnRule","MozColumnRule","WebkitColumnRule","MSColumnRule","OColumnRule","columnRuleColor","MozColumnRuleColor","WebkitColumnRuleColor","MSColumnRuleColor","OColumnRuleColor","columnRuleStyle","MozColumnRuleStyle","WebkitColumnRuleStyle","MSColumnRuleStyle","OColumnRuleStyle","columnRuleWidth","MozColumnRuleWidth","WebkitColumnRuleWidth","MSColumnRuleWidth","OColumnRuleWidth","columnSpan","MozColumnSpan","WebkitColumnSpan","MSColumnSpan","OColumnSpan","columnWidth","MozColumnWidth","WebkitColumnWidth","MSColumnWidth","OColumnWidth","columns","MozColumns","WebkitColumns","MSColumns","OColumns","content","MozContent","WebkitContent","MSContent","OContent","counterIncrement","MozCounterIncrement","WebkitCounterIncrement","MSCounterIncrement","OCounterIncrement","counterReset","MozCounterReset","WebkitCounterReset","MSCounterReset","OCounterReset","cursor","MozCursor","WebkitCursor","MSCursor","OCursor","deg","MozDeg","WebkitDeg","MSDeg","ODeg","direction","MozDirection","WebkitDirection","MSDirection","ODirection","display","MozDisplay","WebkitDisplay","MSDisplay","ODisplay","dpcm","MozDpcm","WebkitDpcm","MSDpcm","ODpcm","dpi","MozDpi","WebkitDpi","MSDpi","ODpi","dppx","MozDppx","WebkitDppx","MSDppx","ODppx","em","MozEm","WebkitEm","MSEm","OEm","emptyCells","MozEmptyCells","WebkitEmptyCells","MSEmptyCells","OEmptyCells","ex","MozEx","WebkitEx","MSEx","OEx","filter","MozFilter","WebkitFilter","MSFilter","OFilter","flexBasis","MozFlexBasis","WebkitFlexBasis","MSFlexBasis","OFlexBasis","flexDirection","MozFlexDirection","WebkitFlexDirection","MSFlexDirection","OFlexDirection","flexFlow","MozFlexFlow","WebkitFlexFlow","MSFlexFlow","OFlexFlow","flexGrow","MozFlexGrow","WebkitFlexGrow","MSFlexGrow","OFlexGrow","flexShrink","MozFlexShrink","WebkitFlexShrink","MSFlexShrink","OFlexShrink","flexWrap","MozFlexWrap","WebkitFlexWrap","MSFlexWrap","OFlexWrap","float","MozFloat","WebkitFloat","MSFloat","OFloat","font","MozFont","WebkitFont","MSFont","OFont","fontFamily","MozFontFamily","WebkitFontFamily","MSFontFamily","OFontFamily","fontFeatureSettings","MozFontFeatureSettings","WebkitFontFeatureSettings","MSFontFeatureSettings","OFontFeatureSettings","fontKerning","MozFontKerning","WebkitFontKerning","MSFontKerning","OFontKerning","fontLanguageOverride","MozFontLanguageOverride","WebkitFontLanguageOverride","MSFontLanguageOverride","OFontLanguageOverride","fontSize","MozFontSize","WebkitFontSize","MSFontSize","OFontSize","fontSizeAdjust","MozFontSizeAdjust","WebkitFontSizeAdjust","MSFontSizeAdjust","OFontSizeAdjust","fontStretch","MozFontStretch","WebkitFontStretch","MSFontStretch","OFontStretch","fontStyle","MozFontStyle","WebkitFontStyle","MSFontStyle","OFontStyle","fontSynthesis","MozFontSynthesis","WebkitFontSynthesis","MSFontSynthesis","OFontSynthesis","fontVariant","MozFontVariant","WebkitFontVariant","MSFontVariant","OFontVariant","fontVariantAlternates","MozFontVariantAlternates","WebkitFontVariantAlternates","MSFontVariantAlternates","OFontVariantAlternates","fontVariantCaps","MozFontVariantCaps","WebkitFontVariantCaps","MSFontVariantCaps","OFontVariantCaps","fontVariantEastAsian","MozFontVariantEastAsian","WebkitFontVariantEastAsian","MSFontVariantEastAsian","OFontVariantEastAsian","fontVariantLigatures","MozFontVariantLigatures","WebkitFontVariantLigatures","MSFontVariantLigatures","OFontVariantLigatures","fontVariantNumeric","MozFontVariantNumeric","WebkitFontVariantNumeric","MSFontVariantNumeric","OFontVariantNumeric","fontVariantPosition","MozFontVariantPosition","WebkitFontVariantPosition","MSFontVariantPosition","OFontVariantPosition","fontWeight","MozFontWeight","WebkitFontWeight","MSFontWeight","OFontWeight","fr","MozFr","WebkitFr","MSFr","OFr","grad","MozGrad","WebkitGrad","MSGrad","OGrad","grid","MozGrid","WebkitGrid","MSGrid","OGrid","gridArea","MozGridArea","WebkitGridArea","MSGridArea","OGridArea","gridAutoColumns","MozGridAutoColumns","WebkitGridAutoColumns","MSGridAutoColumns","OGridAutoColumns","gridAutoFlow","MozGridAutoFlow","WebkitGridAutoFlow","MSGridAutoFlow","OGridAutoFlow","gridAutoRows","MozGridAutoRows","WebkitGridAutoRows","MSGridAutoRows","OGridAutoRows","gridColumn","MozGridColumn","WebkitGridColumn","MSGridColumn","OGridColumn","gridColumnEnd","MozGridColumnEnd","WebkitGridColumnEnd","MSGridColumnEnd","OGridColumnEnd","gridColumnGap","MozGridColumnGap","WebkitGridColumnGap","MSGridColumnGap","OGridColumnGap","gridColumnStart","MozGridColumnStart","WebkitGridColumnStart","MSGridColumnStart","OGridColumnStart","gridGap","MozGridGap","WebkitGridGap","MSGridGap","OGridGap","gridRow","MozGridRow","WebkitGridRow","MSGridRow","OGridRow","gridRowEnd","MozGridRowEnd","WebkitGridRowEnd","MSGridRowEnd","OGridRowEnd","gridRowGap","MozGridRowGap","WebkitGridRowGap","MSGridRowGap","OGridRowGap","gridRowStart","MozGridRowStart","WebkitGridRowStart","MSGridRowStart","OGridRowStart","gridTemplate","MozGridTemplate","WebkitGridTemplate","MSGridTemplate","OGridTemplate","gridTemplateAreas","MozGridTemplateAreas","WebkitGridTemplateAreas","MSGridTemplateAreas","OGridTemplateAreas","gridTemplateColumns","MozGridTemplateColumns","WebkitGridTemplateColumns","MSGridTemplateColumns","OGridTemplateColumns","gridTemplateRows","MozGridTemplateRows","WebkitGridTemplateRows","MSGridTemplateRows","OGridTemplateRows","height","MozHeight","WebkitHeight","MSHeight","OHeight","hyphens","MozHyphens","WebkitHyphens","MSHyphens","OHyphens","hz","MozHz","WebkitHz","MSHz","OHz","imageOrientation","MozImageOrientation","WebkitImageOrientation","MSImageOrientation","OImageOrientation","imageRendering","MozImageRendering","WebkitImageRendering","MSImageRendering","OImageRendering","imageResolution","MozImageResolution","WebkitImageResolution","MSImageResolution","OImageResolution","imeMode","MozImeMode","WebkitImeMode","MSImeMode","OImeMode","in","MozIn","WebkitIn","MSIn","OIn","inherit","MozInherit","WebkitInherit","MSInherit","OInherit","initial","MozInitial","WebkitInitial","MSInitial","OInitial","inlineSize","MozInlineSize","WebkitInlineSize","MSInlineSize","OInlineSize","isolation","MozIsolation","WebkitIsolation","MSIsolation","OIsolation","justifyContent","MozJustifyContent","WebkitJustifyContent","MSJustifyContent","OJustifyContent","khz","MozKhz","WebkitKhz","MSKhz","OKhz","left","MozLeft","WebkitLeft","MSLeft","OLeft","letterSpacing","MozLetterSpacing","WebkitLetterSpacing","MSLetterSpacing","OLetterSpacing","lineBreak","MozLineBreak","WebkitLineBreak","MSLineBreak","OLineBreak","lineHeight","MozLineHeight","WebkitLineHeight","MSLineHeight","OLineHeight","listStyle","MozListStyle","WebkitListStyle","MSListStyle","OListStyle","listStyleImage","MozListStyleImage","WebkitListStyleImage","MSListStyleImage","OListStyleImage","listStylePosition","MozListStylePosition","WebkitListStylePosition","MSListStylePosition","OListStylePosition","listStyleType","MozListStyleType","WebkitListStyleType","MSListStyleType","OListStyleType","margin","MozMargin","WebkitMargin","MSMargin","OMargin","marginBlockEnd","MozMarginBlockEnd","WebkitMarginBlockEnd","MSMarginBlockEnd","OMarginBlockEnd","marginBlockStart","MozMarginBlockStart","WebkitMarginBlockStart","MSMarginBlockStart","OMarginBlockStart","marginBottom","MozMarginBottom","WebkitMarginBottom","MSMarginBottom","OMarginBottom","marginInlineEnd","MozMarginInlineEnd","WebkitMarginInlineEnd","MSMarginInlineEnd","OMarginInlineEnd","marginInlineStart","MozMarginInlineStart","WebkitMarginInlineStart","MSMarginInlineStart","OMarginInlineStart","marginLeft","MozMarginLeft","WebkitMarginLeft","MSMarginLeft","OMarginLeft","marginRight","MozMarginRight","WebkitMarginRight","MSMarginRight","OMarginRight","marginTop","MozMarginTop","WebkitMarginTop","MSMarginTop","OMarginTop","mask","MozMask","WebkitMask","MSMask","OMask","maskClip","MozMaskClip","WebkitMaskClip","MSMaskClip","OMaskClip","maskComposite","MozMaskComposite","WebkitMaskComposite","MSMaskComposite","OMaskComposite","maskImage","MozMaskImage","WebkitMaskImage","MSMaskImage","OMaskImage","maskMode","MozMaskMode","WebkitMaskMode","MSMaskMode","OMaskMode","maskOrigin","MozMaskOrigin","WebkitMaskOrigin","MSMaskOrigin","OMaskOrigin","maskPosition","MozMaskPosition","WebkitMaskPosition","MSMaskPosition","OMaskPosition","maskRepeat","MozMaskRepeat","WebkitMaskRepeat","MSMaskRepeat","OMaskRepeat","maskSize","MozMaskSize","WebkitMaskSize","MSMaskSize","OMaskSize","maskType","MozMaskType","WebkitMaskType","MSMaskType","OMaskType","maxBlockSize","MozMaxBlockSize","WebkitMaxBlockSize","MSMaxBlockSize","OMaxBlockSize","maxHeight","MozMaxHeight","WebkitMaxHeight","MSMaxHeight","OMaxHeight","maxInlineSize","MozMaxInlineSize","WebkitMaxInlineSize","MSMaxInlineSize","OMaxInlineSize","maxWidth","MozMaxWidth","WebkitMaxWidth","MSMaxWidth","OMaxWidth","minBlockSize","MozMinBlockSize","WebkitMinBlockSize","MSMinBlockSize","OMinBlockSize","minHeight","MozMinHeight","WebkitMinHeight","MSMinHeight","OMinHeight","minInlineSize","MozMinInlineSize","WebkitMinInlineSize","MSMinInlineSize","OMinInlineSize","minWidth","MozMinWidth","WebkitMinWidth","MSMinWidth","OMinWidth","mixBlendMode","MozMixBlendMode","WebkitMixBlendMode","MSMixBlendMode","OMixBlendMode","mm","MozMm","WebkitMm","MSMm","OMm","ms","MozMs","WebkitMs","MSMs","OMs","objectFit","MozObjectFit","WebkitObjectFit","MSObjectFit","OObjectFit","objectPosition","MozObjectPosition","WebkitObjectPosition","MSObjectPosition","OObjectPosition","offsetBlockEnd","MozOffsetBlockEnd","WebkitOffsetBlockEnd","MSOffsetBlockEnd","OOffsetBlockEnd","offsetBlockStart","MozOffsetBlockStart","WebkitOffsetBlockStart","MSOffsetBlockStart","OOffsetBlockStart","offsetInlineEnd","MozOffsetInlineEnd","WebkitOffsetInlineEnd","MSOffsetInlineEnd","OOffsetInlineEnd","offsetInlineStart","MozOffsetInlineStart","WebkitOffsetInlineStart","MSOffsetInlineStart","OOffsetInlineStart","opacity","MozOpacity","WebkitOpacity","MSOpacity","OOpacity","order","MozOrder","WebkitOrder","MSOrder","OOrder","orphans","MozOrphans","WebkitOrphans","MSOrphans","OOrphans","outline","MozOutline","WebkitOutline","MSOutline","OOutline","outlineColor","MozOutlineColor","WebkitOutlineColor","MSOutlineColor","OOutlineColor","outlineOffset","MozOutlineOffset","WebkitOutlineOffset","MSOutlineOffset","OOutlineOffset","outlineStyle","MozOutlineStyle","WebkitOutlineStyle","MSOutlineStyle","OOutlineStyle","outlineWidth","MozOutlineWidth","WebkitOutlineWidth","MSOutlineWidth","OOutlineWidth","overflow","MozOverflow","WebkitOverflow","MSOverflow","OOverflow","overflowWrap","MozOverflowWrap","WebkitOverflowWrap","MSOverflowWrap","OOverflowWrap","overflowX","MozOverflowX","WebkitOverflowX","MSOverflowX","OOverflowX","overflowY","MozOverflowY","WebkitOverflowY","MSOverflowY","OOverflowY","padding","MozPadding","WebkitPadding","MSPadding","OPadding","paddingBlockEnd","MozPaddingBlockEnd","WebkitPaddingBlockEnd","MSPaddingBlockEnd","OPaddingBlockEnd","paddingBlockStart","MozPaddingBlockStart","WebkitPaddingBlockStart","MSPaddingBlockStart","OPaddingBlockStart","paddingBottom","MozPaddingBottom","WebkitPaddingBottom","MSPaddingBottom","OPaddingBottom","paddingInlineEnd","MozPaddingInlineEnd","WebkitPaddingInlineEnd","MSPaddingInlineEnd","OPaddingInlineEnd","paddingInlineStart","MozPaddingInlineStart","WebkitPaddingInlineStart","MSPaddingInlineStart","OPaddingInlineStart","paddingLeft","MozPaddingLeft","WebkitPaddingLeft","MSPaddingLeft","OPaddingLeft","paddingRight","MozPaddingRight","WebkitPaddingRight","MSPaddingRight","OPaddingRight","paddingTop","MozPaddingTop","WebkitPaddingTop","MSPaddingTop","OPaddingTop","pageBreakAfter","MozPageBreakAfter","WebkitPageBreakAfter","MSPageBreakAfter","OPageBreakAfter","pageBreakBefore","MozPageBreakBefore","WebkitPageBreakBefore","MSPageBreakBefore","OPageBreakBefore","pageBreakInside","MozPageBreakInside","WebkitPageBreakInside","MSPageBreakInside","OPageBreakInside","pc","MozPc","WebkitPc","MSPc","OPc","perspective","MozPerspective","WebkitPerspective","MSPerspective","OPerspective","perspectiveOrigin","MozPerspectiveOrigin","WebkitPerspectiveOrigin","MSPerspectiveOrigin","OPerspectiveOrigin","pointerEvents","MozPointerEvents","WebkitPointerEvents","MSPointerEvents","OPointerEvents","position","MozPosition","WebkitPosition","MSPosition","OPosition","pt","MozPt","WebkitPt","MSPt","OPt","px","MozPx","WebkitPx","MSPx","OPx","q","MozQ","WebkitQ","MSQ","OQ","quotes","MozQuotes","WebkitQuotes","MSQuotes","OQuotes","rad","MozRad","WebkitRad","MSRad","ORad","rem","MozRem","WebkitRem","MSRem","ORem","resize","MozResize","WebkitResize","MSResize","OResize","revert","MozRevert","WebkitRevert","MSRevert","ORevert","right","MozRight","WebkitRight","MSRight","ORight","rubyAlign","MozRubyAlign","WebkitRubyAlign","MSRubyAlign","ORubyAlign","rubyMerge","MozRubyMerge","WebkitRubyMerge","MSRubyMerge","ORubyMerge","rubyPosition","MozRubyPosition","WebkitRubyPosition","MSRubyPosition","ORubyPosition","s","MozS","WebkitS","MSS","OS","scrollBehavior","MozScrollBehavior","WebkitScrollBehavior","MSScrollBehavior","OScrollBehavior","scrollSnapCoordinate","MozScrollSnapCoordinate","WebkitScrollSnapCoordinate","MSScrollSnapCoordinate","OScrollSnapCoordinate","scrollSnapDestination","MozScrollSnapDestination","WebkitScrollSnapDestination","MSScrollSnapDestination","OScrollSnapDestination","scrollSnapType","MozScrollSnapType","WebkitScrollSnapType","MSScrollSnapType","OScrollSnapType","shapeImageThreshold","MozShapeImageThreshold","WebkitShapeImageThreshold","MSShapeImageThreshold","OShapeImageThreshold","shapeMargin","MozShapeMargin","WebkitShapeMargin","MSShapeMargin","OShapeMargin","shapeOutside","MozShapeOutside","WebkitShapeOutside","MSShapeOutside","OShapeOutside","tabSize","MozTabSize","WebkitTabSize","MSTabSize","OTabSize","tableLayout","MozTableLayout","WebkitTableLayout","MSTableLayout","OTableLayout","textAlign","MozTextAlign","WebkitTextAlign","MSTextAlign","OTextAlign","textAlignLast","MozTextAlignLast","WebkitTextAlignLast","MSTextAlignLast","OTextAlignLast","textCombineUpright","MozTextCombineUpright","WebkitTextCombineUpright","MSTextCombineUpright","OTextCombineUpright","textDecoration","MozTextDecoration","WebkitTextDecoration","MSTextDecoration","OTextDecoration","textDecorationColor","MozTextDecorationColor","WebkitTextDecorationColor","MSTextDecorationColor","OTextDecorationColor","textDecorationLine","MozTextDecorationLine","WebkitTextDecorationLine","MSTextDecorationLine","OTextDecorationLine","textDecorationStyle","MozTextDecorationStyle","WebkitTextDecorationStyle","MSTextDecorationStyle","OTextDecorationStyle","textEmphasis","MozTextEmphasis","WebkitTextEmphasis","MSTextEmphasis","OTextEmphasis","textEmphasisColor","MozTextEmphasisColor","WebkitTextEmphasisColor","MSTextEmphasisColor","OTextEmphasisColor","textEmphasisPosition","MozTextEmphasisPosition","WebkitTextEmphasisPosition","MSTextEmphasisPosition","OTextEmphasisPosition","textEmphasisStyle","MozTextEmphasisStyle","WebkitTextEmphasisStyle","MSTextEmphasisStyle","OTextEmphasisStyle","textIndent","MozTextIndent","WebkitTextIndent","MSTextIndent","OTextIndent","textOrientation","MozTextOrientation","WebkitTextOrientation","MSTextOrientation","OTextOrientation","textOverflow","MozTextOverflow","WebkitTextOverflow","MSTextOverflow","OTextOverflow","textRendering","MozTextRendering","WebkitTextRendering","MSTextRendering","OTextRendering","textShadow","MozTextShadow","WebkitTextShadow","MSTextShadow","OTextShadow","textTransform","MozTextTransform","WebkitTextTransform","MSTextTransform","OTextTransform","textUnderlinePosition","MozTextUnderlinePosition","WebkitTextUnderlinePosition","MSTextUnderlinePosition","OTextUnderlinePosition","top","MozTop","WebkitTop","MSTop","OTop","touchAction","MozTouchAction","WebkitTouchAction","MSTouchAction","OTouchAction","transform","MozTransform","WebkitTransform","msTransform","OTransform","transformBox","MozTransformBox","WebkitTransformBox","MSTransformBox","OTransformBox","transformOrigin","MozTransformOrigin","WebkitTransformOrigin","MSTransformOrigin","OTransformOrigin","transformStyle","MozTransformStyle","WebkitTransformStyle","MSTransformStyle","OTransformStyle","transition","MozTransition","WebkitTransition","MSTransition","OTransition","transitionDelay","MozTransitionDelay","WebkitTransitionDelay","MSTransitionDelay","OTransitionDelay","transitionDuration","MozTransitionDuration","WebkitTransitionDuration","MSTransitionDuration","OTransitionDuration","transitionProperty","MozTransitionProperty","WebkitTransitionProperty","MSTransitionProperty","OTransitionProperty","transitionTimingFunction","MozTransitionTimingFunction","WebkitTransitionTimingFunction","MSTransitionTimingFunction","OTransitionTimingFunction","turn","MozTurn","WebkitTurn","MSTurn","OTurn","unicodeBidi","MozUnicodeBidi","WebkitUnicodeBidi","MSUnicodeBidi","OUnicodeBidi","unset","MozUnset","WebkitUnset","MSUnset","OUnset","verticalAlign","MozVerticalAlign","WebkitVerticalAlign","MSVerticalAlign","OVerticalAlign","vh","MozVh","WebkitVh","MSVh","OVh","visibility","MozVisibility","WebkitVisibility","MSVisibility","OVisibility","vmax","MozVmax","WebkitVmax","MSVmax","OVmax","vmin","MozVmin","WebkitVmin","MSVmin","OVmin","vw","MozVw","WebkitVw","MSVw","OVw","whiteSpace","MozWhiteSpace","WebkitWhiteSpace","MSWhiteSpace","OWhiteSpace","widows","MozWidows","WebkitWidows","MSWidows","OWidows","width","MozWidth","WebkitWidth","MSWidth","OWidth","willChange","MozWillChange","WebkitWillChange","MSWillChange","OWillChange","wordBreak","MozWordBreak","WebkitWordBreak","MSWordBreak","OWordBreak","wordSpacing","MozWordSpacing","WebkitWordSpacing","MSWordSpacing","OWordSpacing","wordWrap","MozWordWrap","WebkitWordWrap","MSWordWrap","OWordWrap","writingMode","MozWritingMode","WebkitWritingMode","MSWritingMode","OWritingMode","zIndex","MozZIndex","WebkitZIndex","MSZIndex","OZIndex","fontSize","MozFontSize","WebkitFontSize","MSFontSize","OFontSize","flex","MozFlex","WebkitFlex","MSFlex","OFlex","fr","MozFr","WebkitFr","MSFr","OFr"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var l=n(1),u=r(l),c=n(0),d=r(c),f=n(223),p=n(578),h=r(p),m=n(222),g=function(e){function t(n){o(this,t);var r=a(this,e.call(this,n));return r.handleSelected=function(e,n,i){if("function"!=typeof r.props.onSelect||!1!==r.props.onSelect(e,n,i)){var o={focus:"keydown"===i.type};t.inUncontrolledMode(r.props)&&(o.selectedIndex=e),r.setState(o)}},r.state=t.copyPropsToState(r.props,{},r.props.defaultFocus),r}return s(t,e),t.prototype.componentWillReceiveProps=function(e){if(t.inUncontrolledMode(e)!==t.inUncontrolledMode(this.props))throw new Error("Switching between controlled mode (by using `selectedIndex`) and uncontrolled mode is not supported in `Tabs`.\nFor more information about controlled and uncontrolled mode of react-tabs see the README.");this.setState(function(n){return t.copyPropsToState(e,n)})},t.inUncontrolledMode=function(e){return null===e.selectedIndex},t.copyPropsToState=function(e,n){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i={focus:r};if(t.inUncontrolledMode(e)){var o=(0,m.getTabsCount)(e.children)-1,a=null;a=null!=n.selectedIndex?Math.min(n.selectedIndex,o):e.defaultIndex||0,i.selectedIndex=a}return i},t.prototype.render=function(){var e=this.props,t=e.children,n=(e.defaultIndex,e.defaultFocus,i(e,["children","defaultIndex","defaultFocus"]));return n.focus=this.state.focus,n.onSelect=this.handleSelected,null!=this.state.selectedIndex&&(n.selectedIndex=this.state.selectedIndex),d.default.createElement(h.default,n,t)},t}(c.Component);g.defaultProps={defaultFocus:!1,forceRenderTabPanel:!1,selectedIndex:null,defaultIndex:null},t.default=g,g.propTypes={children:f.childrenPropType,className:u.default.oneOfType([u.default.string,u.default.array,u.default.object]),defaultFocus:u.default.bool,defaultIndex:u.default.number,disabledTabClassName:u.default.string,forceRenderTabPanel:u.default.bool,onSelect:f.onSelectPropType,selectedIndex:f.selectedIndexPropType,selectedTabClassName:u.default.string,selectedTabPanelClassName:u.default.string}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e){return"LI"===e.nodeName&&"tab"===e.getAttribute("role")}function u(e){return"true"===e.getAttribute("aria-disabled")}t.__esModule=!0;var c=Object.assign||function(e){for(var t=1;t=this.getTabsCount()||this.props.onSelect(e,this.props.selectedIndex,t))},t.prototype.getNextTab=function(e){for(var t=this.getTabsCount(),n=e+1;ne;)if(!u(this.getTab(t)))return t;return e},t.prototype.getTabsCount=function(){return(0,P.getTabsCount)(this.props.children)},t.prototype.getPanelsCount=function(){return(0,P.getPanelsCount)(this.props.children)},t.prototype.getTab=function(e){return this.tabNodes["tabs-"+e]},t.prototype.getChildren=function(){var e=this,t=0,n=this.props,r=n.children,i=n.disabledTabClassName,o=n.focus,a=n.forceRenderTabPanel,s=n.selectedIndex,l=n.selectedTabClassName,u=n.selectedTabPanelClassName;this.tabIds=this.tabIds||[],this.panelIds=this.panelIds||[];for(var c=this.tabIds.length-this.getTabsCount();c++<0;)this.tabIds.push((0,v.default)()),this.panelIds.push((0,v.default)());return(0,A.deepMap)(r,function(n){var r=n;if(n.type===O.default){var c=0,d=!1;x&&(d=h.default.Children.toArray(n.props.children).filter(function(e){return e.type===E.default}).some(function(t,n){return document.activeElement===e.getTab(n)})),r=(0,p.cloneElement)(n,{children:(0,A.deepMap)(n.props.children,function(t){var n="tabs-"+c,r=s===c,a={tabRef:function(t){e.tabNodes[n]=t},id:e.tabIds[c],panelId:e.panelIds[c],selected:r,focus:r&&(o||d)};return l&&(a.selectedClassName=l),i&&(a.disabledClassName=i),c++,(0,p.cloneElement)(t,a)})})}else if(n.type===T.default){var f={id:e.panelIds[t],tabId:e.tabIds[t],selected:s===t};a&&(f.forceRender=a),u&&(f.selectedClassName=u),t++,r=(0,p.cloneElement)(n,f)}return r})},t.prototype.isTabFromContainer=function(e){if(!l(e))return!1;var t=e.parentElement;do{if(t===this.node)return!0;if(t.getAttribute("data-tabs"))break;t=t.parentElement}while(t);return!1},t.prototype.render=function(){var e=this,t=this.props,n=(t.children,t.className),r=(t.disabledTabClassName,t.focus,t.forceRenderTabPanel,t.onSelect,t.selectedIndex,t.selectedTabClassName,t.selectedTabPanelClassName,i(t,["children","className","disabledTabClassName","focus","forceRenderTabPanel","onSelect","selectedIndex","selectedTabClassName","selectedTabPanelClassName"]));return h.default.createElement("div",c({},r,{className:(0,g.default)(n),onClick:this.handleClick,onKeyDown:this.handleKeyDown,ref:function(t){e.node=t},"data-tabs":!0}),this.getChildren())},t}(p.Component);C.defaultProps={className:"react-tabs",focus:!1},t.default=C,C.propTypes={children:b.childrenPropType,className:f.default.oneOfType([f.default.string,f.default.array,f.default.object]),disabledTabClassName:f.default.string,focus:f.default.bool,forceRenderTabPanel:f.default.bool,onSelect:f.default.func.isRequired,selectedIndex:f.default.number.isRequired,selectedTabClassName:f.default.string,selectedTabPanelClassName:f.default.string}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){function t(){return(c.length-1)*(i||0)+c[c.length-1].actions.length}function n(){if(null!=s&&null!=i){var e=t()-s,n=Math.floor(e/i);n>0&&(c.splice(0,n),d+=n*i)}}var r=e.snapshotInterval,i=void 0===r?20:r,o=e.limit,s=void 0===o?200:o,u=void 0,c=[],d=0;return{enhancer:function(e){return function(t,r,o){if(u)throw new Error("redux-action-log enhancer can not be re-used");u=e(t,r,o);var a=u,s=a.dispatch;return c.push({state:r,actions:[]}),(0,l.default)({},u,{dispatch:function(e){var t=c[c.length-1],r={action:e,timestamp:Date.now()};return t.actions.length===i?c.push({state:u.getState(),actions:[r]}):t.actions.push(r),n(),s(e)}})}},setLimit:function(e){s=e,n()},getLog:function(){var e;return{initialState:c[0].state,skipped:d,actions:(e=[]).concat.apply(e,(0,a.default)(c.map(function(e){return e.actions})))}},clear:function(){d+=t(),c=[{state:u.getState(),actions:[]}]}}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(123),a=r(o),s=n(17),l=r(s);t.createActionLog=i},function(e,t,n){(function(e){!function(e,n){n(t)}(0,function(t){"use strict";function n(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}function r(e,t){Object.defineProperty(this,"kind",{value:e,enumerable:!0}),t&&t.length&&Object.defineProperty(this,"path",{value:t,enumerable:!0})}function i(e,t,n){i.super_.call(this,"E",e),Object.defineProperty(this,"lhs",{value:t,enumerable:!0}),Object.defineProperty(this,"rhs",{value:n,enumerable:!0})}function o(e,t){o.super_.call(this,"N",e),Object.defineProperty(this,"rhs",{value:t,enumerable:!0})}function a(e,t){a.super_.call(this,"D",e),Object.defineProperty(this,"lhs",{value:t,enumerable:!0})}function s(e,t,n){s.super_.call(this,"A",e),Object.defineProperty(this,"index",{value:t,enumerable:!0}),Object.defineProperty(this,"item",{value:n,enumerable:!0})}function l(e,t,n){var r=e.slice((n||t)+1||e.length);return e.length=t<0?e.length+t:t,e.push.apply(e,r),e}function u(e){var t=void 0===e?"undefined":k(e);return"object"!==t?t:e===Math?"math":null===e?"null":Array.isArray(e)?"array":"[object Date]"===Object.prototype.toString.call(e)?"date":"function"==typeof e.toString&&/^\/.*\//.test(e.toString())?"regexp":"object"}function c(e,t,n,r,d,f,p){d=d||[],p=p||[];var h=d.slice(0);if(void 0!==f){if(r){if("function"==typeof r&&r(h,f))return;if("object"===(void 0===r?"undefined":k(r))){if(r.prefilter&&r.prefilter(h,f))return;if(r.normalize){var m=r.normalize(h,f,e,t);m&&(e=m[0],t=m[1])}}}h.push(f)}"regexp"===u(e)&&"regexp"===u(t)&&(e=e.toString(),t=t.toString());var g=void 0===e?"undefined":k(e),y=void 0===t?"undefined":k(t),v="undefined"!==g||p&&p[p.length-1].lhs&&p[p.length-1].lhs.hasOwnProperty(f),b="undefined"!==y||p&&p[p.length-1].rhs&&p[p.length-1].rhs.hasOwnProperty(f);if(!v&&b)n(new o(h,t));else if(!b&&v)n(new a(h,e));else if(u(e)!==u(t))n(new i(h,e,t));else if("date"===u(e)&&e-t!=0)n(new i(h,e,t));else if("object"===g&&null!==e&&null!==t)if(p.filter(function(t){return t.lhs===e}).length)e!==t&&n(new i(h,e,t));else{if(p.push({lhs:e,rhs:t}),Array.isArray(e)){var _;for(e.length,_=0;_=t.length?n(new s(h,_,new a(void 0,e[_]))):c(e[_],t[_],n,r,h,_,p);for(;_=0?(c(e[i],t[i],n,r,h,i,p),S=l(S,a)):c(e[i],void 0,n,r,h,i,p)}),S.forEach(function(e){c(void 0,t[e],n,r,h,e,p)})}p.length=p.length-1}else e!==t&&("number"===g&&isNaN(e)&&isNaN(t)||n(new i(h,e,t)))}function d(e,t,n,r){return r=r||[],c(e,t,function(e){e&&r.push(e)},n),r.length?r:void 0}function f(e,t,n){if(n.path&&n.path.length){var r,i=e[t],o=n.path.length-1;for(r=0;r0&&void 0!==arguments[0]?arguments[0]:{},t=Object.assign({},I,e),n=t.logger,r=t.stateTransformer,i=t.errorTransformer,o=t.predicate,a=t.logErrors,s=t.diffPredicate;if(void 0===n)return function(){return function(e){return function(t){return e(t)}}};if(e.getState&&e.dispatch)return console.error("[redux-logger] redux-logger not installed. Make sure to pass logger instance as middleware:\n// Logger with default options\nimport { logger } from 'redux-logger'\nconst store = createStore(\n reducer,\n applyMiddleware(logger)\n)\n// Or you can create your own logger with custom options http://bit.ly/redux-logger-options\nimport createLogger from 'redux-logger'\nconst logger = createLogger({\n // ...options\n});\nconst store = createStore(\n reducer,\n applyMiddleware(logger)\n)\n"),function(){return function(e){return function(t){return e(t)}}};var l=[];return function(e){var n=e.getState;return function(e){return function(u){if("function"==typeof o&&!o(n,u))return e(u);var c={};l.push(c),c.started=C.now(),c.startedTime=new Date,c.prevState=r(n()),c.action=u;var d=void 0;if(a)try{d=e(u)}catch(e){c.error=i(e)}else d=e(u);c.took=C.now()-c.started,c.nextState=r(n());var f=t.diff&&"function"==typeof s?s(n,u):t.diff;if(S(l,Object.assign({},t,{diff:f})),l.length=0,c.error)throw c.error;return d}}}}var w,T,P=function(e,t){return new Array(t+1).join(e)},A=function(e,t){return P("0",t-e.toString().length)+e},x=function(e){return A(e.getHours(),2)+":"+A(e.getMinutes(),2)+":"+A(e.getSeconds(),2)+"."+A(e.getMilliseconds(),3)},C="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance:Date,k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},D=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:{},t=e.dispatch,n=e.getState;return"function"==typeof t||"function"==typeof n?O()({dispatch:t,getState:n}):void console.error("\n[redux-logger v3] BREAKING CHANGE\n[redux-logger v3] Since 3.0.0 redux-logger exports by default logger with default settings.\n[redux-logger v3] Change\n[redux-logger v3] import createLogger from 'redux-logger'\n[redux-logger v3] to\n[redux-logger v3] import { createLogger } from 'redux-logger'\n")};t.defaults=I,t.createLogger=O,t.logger=N,t.default=N,Object.defineProperty(t,"__esModule",{value:!0})})}).call(t,n(89))},function(e,t){e.exports=function(e,t,n,r){var i=n?n.call(r,e,t):void 0;if(void 0!==i)return!!i;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),a=Object.keys(t);if(o.length!==a.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(226),t.setImmediate=setImmediate,t.clearImmediate=clearImmediate},function(e,t){e.exports=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var t=document.activeElement,n=[],r=0;r=0?--a:r&&r.indexOf(o)>=0&&++a}return t}function o(e){for(var t=[],n=0,r=e.length,o=0;o' after between selector: "+e;return t=t.map(a),n=a(e.slice(1).trim()),n.between?{between:t,stream:n}:(n.between=t,n)}function l(e){var t,n,o={source:c},a=[],s=[0,0],l=0,d=0,f=e.length,v=0;if(e[f-1]===g){if(!((v=e.lastIndexOf(m))>=0))throw"Unmatched right brace: "+e;try{s=u(e.substring(v+1,f-1))}catch(t){throw"Invalid throttle specification: "+e}e=e.slice(0,v).trim(),f=e.length,v=0}if(!f)throw e;if(e[0]===b&&(l=++v),t=i(e,v,y),t1?(o.type=a[1],l?o.markname=a[0].slice(1):r(a[0])?o.marktype=a[0]:o.source=a[0]):o.type=a[0],"!"===o.type.slice(-1)&&(o.consume=!0,o.type=o.type.slice(0,-1)),null!=n&&(o.filter=n),s[0]&&(o.throttle=s[0]),s[1]&&(o.debounce=s[1]),o}function u(e){var t=e.split(v);if(!e.length||t.length>2)throw e;return t.map(function(t){var n=+t;if(n!==n)throw e;return n})}t.a=function(e,t,n){return c=t||f,d=n||S,o(e.trim()).map(a)};var c,d,f="view",p="[",h="]",m="{",g="}",y=":",v=",",b="@",_=">",E=/[[\]{}]/,S={"*":1,arc:1,area:1,group:1,image:1,line:1,path:1,rect:1,rule:1,shape:1,symbol:1,text:1,trail:1}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(228);n.d(t,"ASTNode",function(){return r.a});var i=n(590);n.d(t,"parse",function(){return i.a});var o=n(589);n.d(t,"codegen",function(){return o.a});var a=n(230);n.d(t,"functions",function(){return a.a});var s=n(229);n.d(t,"constants",function(){return s.a})},function(e,t,n){"use strict";var r=n(229),i=n(230),o=n(164);t.a=function(e){function t(e){if(n.i(o.isString)(e))return e;var t=y[e.type];return null==t&&n.i(o.error)("Unsupported type: "+e.type),t(e)}function a(e){var n={code:t(e),globals:Object.keys(p),fields:Object.keys(h)};return p={},h={},n}e=e||{};var s=e.whitelist?n.i(o.toSet)(e.whitelist):{},l=e.blacklist?n.i(o.toSet)(e.blacklist):{},u=e.constants||r.a,c=(e.functions||i.a)(t),d=e.globalvar,f=e.fieldvar,p={},h={},m=0,g=n.i(o.isFunction)(d)?d:function(e){return d+'["'+e+'"]'},y={Literal:function(e){return e.raw},Identifier:function(e){var t=e.name;return m>0?t:l.hasOwnProperty(t)?n.i(o.error)("Illegal identifier: "+t):u.hasOwnProperty(t)?u[t]:s.hasOwnProperty(t)?t:(p[t]=1,g(t))},MemberExpression:function(e){var n=!e.computed,r=t(e.object);n&&(m+=1);var i=t(e.property);return r===f&&(h[i]=1),n&&(m-=1),r+(n?"."+i:"["+i+"]")},CallExpression:function(e){"Identifier"!==e.callee.type&&n.i(o.error)("Illegal callee type: "+e.callee.type);var r=e.callee.name,i=e.arguments,a=c.hasOwnProperty(r)&&c[r];return a||n.i(o.error)("Unrecognized function: "+r),n.i(o.isFunction)(a)?a(i):a+"("+i.map(t).join(",")+")"},ArrayExpression:function(e){return"["+e.elements.map(t).join(",")+"]"},BinaryExpression:function(e){return"("+t(e.left)+e.operator+t(e.right)+")"},UnaryExpression:function(e){return"("+e.operator+t(e.argument)+")"},ConditionalExpression:function(e){return"("+t(e.test)+"?"+t(e.consequent)+":"+t(e.alternate)+")"},LogicalExpression:function(e){return"("+t(e.left)+e.operator+t(e.right)+")"},ObjectExpression:function(e){return"{"+e.properties.map(t).join(",")+"}"},Property:function(e){m+=1;var n=t(e.key);return m-=1,n+":"+t(e.value)}};return a.functions=c,a.constants=u,a}},function(e,t,n){"use strict";function r(e,t){if(!e)throw new Error("ASSERT: "+t)}function i(e){return e>=48&&e<=57}function o(e){return"0123456789abcdefABCDEF".indexOf(e)>=0}function a(e){return"01234567".indexOf(e)>=0}function s(e){return 32===e||9===e||11===e||12===e||160===e||e>=5760&&[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279].indexOf(e)>=0}function l(e){return 10===e||13===e||8232===e||8233===e}function u(e){return 36===e||95===e||e>=65&&e<=90||e>=97&&e<=122||92===e||e>=128&&He.test(String.fromCharCode(e))}function c(e){return 36===e||95===e||e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||92===e||e>=128&&Ge.test(String.fromCharCode(e))}function d(){for(var e;ce1114111||"}"!==e)&&U({},Re,Ve),t<=65535?String.fromCharCode(t):(n=55296+(t-65536>>10),r=56320+(t-65536&1023),String.fromCharCode(n,r))}function h(){var e,t;for(e=ue.charCodeAt(ce++),t=String.fromCharCode(e),92===e&&(117!==ue.charCodeAt(ce)&&U({},Re,Ve),++ce,e=f("u"),e&&"\\"!==e&&u(e.charCodeAt(0))||U({},Re,Ve),t=e);ce>>="===(r=ue.substr(ce,4))?(ce+=4,{type:_e,value:r,start:i,end:ce}):">>>"===(n=r.substr(0,3))||"<<="===n||">>="===n?(ce+=3,{type:_e,value:n,start:i,end:ce}):(t=n.substr(0,2),a===t[1]&&"+-<>&|".indexOf(a)>=0||"=>"===t?(ce+=2,{type:_e,value:t,start:i,end:ce}):"<>=!+-*%&|^/".indexOf(a)>=0?(++ce,{type:_e,value:a,start:i,end:ce}):void U({},Re,Ve))}function v(e){for(var t="";ce=0&&ce=0&&(n=n.replace(/\\u\{([0-9a-fA-F]+)\}/g,function(e,t){if(parseInt(t,16)<=1114111)return"x";U({},Be)}).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"x"));try{new RegExp(n)}catch(e){U({},Be)}try{return new RegExp(e,t)}catch(e){return null}}function O(){var e,t,n,i,o;for(e=ue[ce],r("/"===e,"Regular expression literal must start with a slash"),t=ue[ce++],n=!1,i=!1;ce=0&&U({},Be,n),{value:n,literal:t}}function T(){var e,t,n,r;return fe=null,d(),e=ce,t=O(),n=w(),r=S(t.value,n.value),{literal:t.literal+n.literal,value:r,regex:{pattern:t.value,flags:n.value},start:e,end:ce}}function P(e){return e.type===ge||e.type===ye||e.type===he||e.type===ve}function A(){var e;return d(),ce>=de?{type:me,start:ce,end:ce}:(e=ue.charCodeAt(ce),u(e)?g():40===e||41===e||59===e?y():39===e||34===e?E():46===e?i(ue.charCodeAt(ce+1))?_():y():i(e)?_():y())}function x(){var e;return e=fe,ce=e.end,fe=A(),ce=e.end,e}function C(){var e;e=ce,fe=A(),ce=e}function k(e){var t=new pe.a(Se);return t.elements=e,t}function D(e,t,n){var r=new pe.a("||"===e||"&&"===e?xe:Oe);return r.operator=e,r.left=t,r.right=n,r}function M(e,t){var n=new pe.a(we);return n.callee=e,n.arguments=t,n}function R(e,t,n){var r=new pe.a(Te);return r.test=e,r.consequent=t,r.alternate=n,r}function I(e){var t=new pe.a(Pe);return t.name=e,t}function N(e){var t=new pe.a(Ae);return t.value=e.value,t.raw=ue.slice(e.start,e.end),e.regex&&("//"===t.raw&&(t.raw="/(?:)/"),t.regex=e.regex),t}function F(e,t,n){var r=new pe.a(Ce);return r.computed="["===e,r.object=t,r.property=n,r.computed||(n.member=!0),r}function L(e){var t=new pe.a(ke);return t.properties=e,t}function j(e,t,n){var r=new pe.a(De);return r.key=t,r.value=n,r.kind=e,r}function B(e,t){var n=new pe.a(Me);return n.operator=e,n.argument=t,n.prefix=!0,n}function U(e,t){var n,i=Array.prototype.slice.call(arguments,2),o=t.replace(/%(\d)/g,function(e,t){return r(t":case"<=":case">=":case"instanceof":case"in":t=7;break;case"<<":case">>":case">>>":t=8;break;case"+":case"-":t=9;break;case"*":case"/":case"%":t=11}return t}function oe(){var e,t,n,r,i,o,a,s,l,u;if(e=fe,l=re(),r=fe,0===(i=ie(r)))return l;for(r.prec=i,x(),t=[e,fe],a=re(),o=[l,r,a];(i=ie(fe))>0;){for(;o.length>2&&i<=o[o.length-2].prec;)a=o.pop(),s=o.pop().value,l=o.pop(),t.pop(),n=D(s,l,a),o.push(n);r=x(),r.prec=i,o.push(r),t.push(fe),n=re(),o.push(n)}for(u=o.length-1,n=o[u],t.pop();u>1;)t.pop(),n=D(o[u-1].value,o[u-2],n),u-=2;return n}function ae(){var e,t,n;return e=oe(),V("?")&&(x(),t=ae(),W(":"),n=ae(),e=R(e,t,n)),e}function se(){var e=ae();if(V(","))throw new Error(qe);return e}var le,ue,ce,de,fe,pe=n(228),he=1,me=2,ge=3,ye=4,ve=5,be=6,_e=7,Ee=8;le={},le[he]="Boolean",le[me]="",le[ge]="Identifier",le[ye]="Keyword",le[ve]="Null",le[be]="Numeric",le[_e]="Punctuator",le[Ee]="String",le[9]="RegularExpression";var Se="ArrayExpression",Oe="BinaryExpression",we="CallExpression",Te="ConditionalExpression",Pe="Identifier",Ae="Literal",xe="LogicalExpression",Ce="MemberExpression",ke="ObjectExpression",De="Property",Me="UnaryExpression",Re="Unexpected token %0",Ie="Unexpected number",Ne="Unexpected string",Fe="Unexpected identifier",Le="Unexpected reserved word",je="Unexpected end of input",Be="Invalid regular expression",Ue="Invalid regular expression: missing /",ze="Octal literals are not allowed in strict mode.",We="Duplicate data property in object literal not allowed in strict mode",Ve="ILLEGAL",qe="Disabled.",He=new RegExp("[ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠ-ࢲऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々-〇〡-〩〱-〵〸-〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞭꞰꞱꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭟꭤꭥꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]"),Ge=new RegExp("[ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮ̀-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ҃-҇Ҋ-ԯԱ-Ֆՙա-և֑-ׇֽֿׁׂׅׄא-תװ-ײؐ-ؚؠ-٩ٮ-ۓە-ۜ۟-۪ۨ-ۼۿܐ-݊ݍ-ޱ߀-ߵߺࠀ-࠭ࡀ-࡛ࢠ-ࢲࣤ-ॣ०-९ॱ-ঃঅ-ঌএঐও-নপ-রলশ-হ়-ৄেৈো-ৎৗড়ঢ়য়-ৣ০-ৱਁ-ਃਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹ਼ਾ-ੂੇੈੋ-੍ੑਖ਼-ੜਫ਼੦-ੵઁ-ઃઅ-ઍએ-ઑઓ-નપ-રલળવ-હ઼-ૅે-ૉો-્ૐૠ-ૣ૦-૯ଁ-ଃଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହ଼-ୄେୈୋ-୍ୖୗଡ଼ଢ଼ୟ-ୣ୦-୯ୱஂஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹா-ூெ-ைொ-்ௐௗ௦-௯ఀ-ఃఅ-ఌఎ-ఐఒ-నప-హఽ-ౄె-ైొ-్ౕౖౘౙౠ-ౣ౦-౯ಁ-ಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹ಼-ೄೆ-ೈೊ-್ೕೖೞೠ-ೣ೦-೯ೱೲഁ-ഃഅ-ഌഎ-ഐഒ-ഺഽ-ൄെ-ൈൊ-ൎൗൠ-ൣ൦-൯ൺ-ൿංඃඅ-ඖක-නඳ-රලව-ෆ්ා-ුූෘ-ෟ෦-෯ෲෳก-ฺเ-๎๐-๙ກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ູົ-ຽເ-ໄໆ່-ໍ໐-໙ໜ-ໟༀ༘༙༠-༩༹༵༷༾-ཇཉ-ཬཱ-྄྆-ྗྙ-ྼ࿆က-၉ၐ-ႝႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ፝-፟ᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-᜔ᜠ-᜴ᝀ-ᝓᝠ-ᝬᝮ-ᝰᝲᝳក-៓ៗៜ៝០-៩᠋-᠍᠐-᠙ᠠ-ᡷᢀ-ᢪᢰ-ᣵᤀ-ᤞᤠ-ᤫᤰ-᤻᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧙ᨀ-ᨛᨠ-ᩞ᩠-᩿᩼-᪉᪐-᪙ᪧ᪰-᪽ᬀ-ᭋ᭐-᭙᭫-᭳ᮀ-᯳ᰀ-᰷᱀-᱉ᱍ-ᱽ᳐-᳔᳒-ᳶ᳸᳹ᴀ-᷵᷼-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ‌‍‿⁀⁔ⁱⁿₐ-ₜ⃐-⃥⃜⃡-⃰ℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ⵿-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⷠ-ⷿⸯ々-〇〡-〯〱-〵〸-〼ぁ-ゖ゙゚ゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘫꙀ-꙯ꙴ-꙽ꙿ-ꚝꚟ-꛱ꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞭꞰꞱꟷ-ꠧꡀ-ꡳꢀ-꣄꣐-꣙꣠-ꣷꣻ꤀-꤭ꤰ-꥓ꥠ-ꥼꦀ-꧀ꧏ-꧙ꧠ-ꧾꨀ-ꨶꩀ-ꩍ꩐-꩙ꩠ-ꩶꩺ-ꫂꫛ-ꫝꫠ-ꫯꫲ-꫶ꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭟꭤꭥꯀ-ꯪ꯬꯭꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻ︀-️︠-︭︳︴﹍-﹏ﹰ-ﹴﹶ-ﻼ0-9A-Z_a-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]"),Qe={if:1,in:1,do:1,var:1,for:1,new:1,try:1,let:1,this:1,else:1,case:1,void:1,with:1,enum:1,while:1,break:1,catch:1,throw:1,const:1,yield:1,class:1,super:1,return:1,typeof:1,delete:1,switch:1,export:1,import:1,public:1,static:1,default:1,finally:1,extends:1,package:1,private:1,function:1,continue:1,debugger:1,interface:1,protected:1,instanceof:1,implements:1},Ye={if:1,this:1};t.a=function(e){ue=e,ce=0,de=ue.length,fe=null,C();var t=se();if(fe.type!==me)throw new Error("Unexpect token after expression.");return t}},function(e,t,n){"use strict";function r(e){return function(t,n){return n[e]&&t.push(n[e].combine()),t}}function i(e){return[].concat(e.x?[].concat(e.x.reduce(o,[]),e.x.reduce(a,[])):[],e.y?[].concat(e.y.reduce(o,[]),e.y.reduce(a,[])):[])}Object.defineProperty(t,"__esModule",{value:!0});var o=r("main"),a=r("grid");t.assembleAxes=i},function(e,t,n){"use strict";function r(e,t,n){return n.bin?(e[s.field(n,{})]=!0,e[s.field(n,{binSuffix:"end"})]=!0,c.binRequiresRange(n,t)&&(e[s.field(n,{binSuffix:"range"})]=!0)):e[s.field(n)]=!0,e}function i(e,t){for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];for(var i in r)r.hasOwnProperty(i)&&(n in e?e[n][i]=r[i]:e[n]={op:r[i]})}}Object.defineProperty(t,"__esModule",{value:!0});var o=n(4),a=n(3),s=n(9),l=n(7),u=n(2),c=n(26),d=n(38),f=function(e){function t(t,n){var r=e.call(this)||this;return r.dimensions=t,r.measures=n,r}return o.__extends(t,e),t.prototype.clone=function(){return new t(o.__assign({},this.dimensions),u.duplicate(this.measures))},t.makeFromEncoding=function(e){var n=!1;e.forEachFieldDef(function(e){e.aggregate&&(n=!0)});var i={},o={};return n?(e.forEachFieldDef(function(t,n){t.aggregate?"count"===t.aggregate?(i["*"]=i["*"]||{},i["*"].count=s.field(t,{aggregate:"count"})):(i[t.field]=i[t.field]||{},i[t.field][t.aggregate]=s.field(t),a.isScaleChannel(n)&&"unaggregated"===e.scaleDomain(n)&&(i[t.field].min=s.field(t,{aggregate:"min"}),i[t.field].max=s.field(t,{aggregate:"max"}))):r(o,n,t)}),u.keys(o).length+u.keys(i).length===0?null:new t(o,i)):null},t.makeFromTransform=function(e){for(var n={},r={},i=0,o=e.summarize;i 0"}})},t}(s.DataFlowNode);t.NonPositiveFilterNode=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),i=n(3),o=n(5),a=n(16),s=n(2),l=n(38),u=function(e){function t(t){var n=e.call(this)||this;return n._filteredFields=t,n}return r.__extends(t,e),t.prototype.clone=function(){return new t(s.duplicate(this._filteredFields))},t.make=function(e){var n=e.reduceFieldDef(function(t,n,r){if("filter"===e.config.invalidValues&&!n.aggregate&&n.field){var a=i.isScaleChannel(r)&&e.getScaleComponent(r);if(a){var s=a.get("type");o.hasContinuousDomain(s)&&(t[n.field]=n)}}return t},{});return 0===s.keys(n).length?null:new t(n)},Object.defineProperty(t.prototype,"filteredFields",{get:function(){return this._filteredFields},enumerable:!0,configurable:!0}),t.prototype.merge=function(e){var t=this,n=s.keys(this._filteredFields).map(function(e){return e+" "+s.hash(t._filteredFields[e])}),i=s.keys(e.filteredFields).map(function(t){return t+" "+s.hash(e.filteredFields[t])});s.differArray(n,i)||(this._filteredFields=r.__assign({},this._filteredFields,e._filteredFields),e.remove())},t.prototype.assemble=function(){var e=this,t=s.keys(this._filteredFields).reduce(function(t,n){var r=e._filteredFields[n];return null!==r&&(t.push("datum["+s.stringValue(r.field)+"] !== null"),s.contains([a.QUANTITATIVE,a.TEMPORAL],r.type)&&t.push("!isNaN(datum["+s.stringValue(r.field)+"])")),t},[]);return t.length>0?{type:"filter",expr:t.join(" && ")}:null},t}(l.DataFlowNode);t.NullFilterNode=u},function(e,t,n){"use strict";function r(e){function n(r){if(!(r instanceof p.FacetNode)){var i=r.clone();if(i instanceof f.OutputNode){var o=t.FACET_SCALE_PREFIX+i.getSource();i.setSource(o),e.model.component.data.outputNodes[o]=i}else(i instanceof d.AggregateNode||i instanceof y.StackNode)&&i.addDimensions(e.fields);return c.flatten(r.children.map(n)).forEach(function(e){return e.parent=i}),[i]}return c.flatten(r.children.map(n))}return n}function i(e){if(e instanceof p.FacetNode)if(1!==e.numChildren()||e.children[0]instanceof f.OutputNode){o(e.model.component.data.main);var t=c.flatten(e.children.map(r(e)));t.forEach(function(t){return t.parent=e.model.component.data.main})}else{var n=e.children[0];(n instanceof d.AggregateNode||n instanceof y.StackNode)&&n.addDimensions(e.fields),n.swapWithParent(),i(e)}else e.children.forEach(i)}function o(e){if(e instanceof f.OutputNode&&e.type===u.MAIN&&1===e.numChildren()){var t=e.children[0];t instanceof p.FacetNode||(t.swapWithParent(),o(e))}}function a(e){e instanceof h.NonPositiveFilterNode&&c.every(c.vals(e.filter),function(e){return!1===e})&&e.remove(),e instanceof m.NullFilterNode&&c.every(c.vals(e.filteredFields),function(e){return null===e})&&e.remove(),e instanceof f.OutputNode&&!e.isRequired()&&e.remove(),e.children.forEach(a)}function s(e){function t(e){0===e.numChildren()?n.push(e):e.children.forEach(t)}var n=[];return e.forEach(t),n}function l(e){var t=c.vals(e.sources);t.forEach(a),t=t.filter(function(e){return e.numChildren()>0}),s(t).forEach(g.iterateFromLeaves(g.removeUnusedSubtrees)),t=t.filter(function(e){return e.numChildren()>0}),s(t).forEach(g.iterateFromLeaves(g.moveParseUp)),s(t).forEach(g.removeDuplicateTimeUnits),t.forEach(i),c.keys(e.sources).forEach(function(t){0===e.sources[t].numChildren()&&delete e.sources[t]})}Object.defineProperty(t,"__esModule",{value:!0});var u=n(55),c=n(2),d=n(592),f=n(38),p=n(593),h=n(595),m=n(596),g=n(598),y=n(600);t.FACET_SCALE_PREFIX="scale_",t.optimizeDataflow=l},function(e,t,n){"use strict";function r(e){function t(n){if(!(n instanceof d.SourceNode)){var r=n.parent;e(n)&&t(r)}}return t}function i(e){var t=e.parent;if(e instanceof c.ParseNode){if(t instanceof d.SourceNode)return!1;if(t.numChildren()>1)return!0;if(t instanceof c.ParseNode)t.merge(e);else{if(l.hasIntersection(t.producedFields(),e.dependentFields()))return!0;e.swapWithParent()}}return!0}function o(e){return!(e instanceof u.OutputNode||e.numChildren()>0)&&(e.remove(),!0)}function a(e){var t={};return r(function(e){if(e instanceof f.TimeUnitNode){var n=e.producedFields();l.keys(n).every(function(e){return!!t[e]})?e.remove():t=s.__assign({},t,n)}return!0})(e)}Object.defineProperty(t,"__esModule",{value:!0});var s=n(4),l=n(2),u=n(38),c=n(594),d=n(599),f=n(232);t.iterateFromLeaves=r,t.moveParseUp=i,t.removeUnusedSubtrees=o,t.removeDuplicateTimeUnits=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),i=n(55),o=n(2),a=n(38),s=function(e){function t(t){var n=e.call(this)||this;if(t=t||{name:"source"},i.isInlineData(t))n._data={values:t.values};else if(i.isUrlData(t)){var a=/(?:\.([^.]+))?$/.exec(t.url)[1];o.contains(["json","csv","tsv","topojson"],a)||(a="json");var s=t.format||{},l=s.type||t.formatType,u=s.property,c=s.feature,d=s.mesh,f=r.__assign({type:l||a},u?{property:u}:{},c?{feature:c}:{},d?{mesh:d}:{});n._data={url:t.url,format:f}}else i.isNamedData(t)&&(n._name=t.name,n._data={});return n}return r.__extends(t,e),Object.defineProperty(t.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),t.prototype.hasName=function(){return!!this._name},Object.defineProperty(t.prototype,"dataName",{get:function(){return this._name},set:function(e){this._name=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parent",{set:function(e){throw new Error("Source nodes have to be roots.")},enumerable:!0,configurable:!0}),t.prototype.remove=function(){throw new Error("Source nodes are roots and cannot be removed.")},t.prototype.hash=function(){return i.isInlineData(this._data)?o.hash(this._data):i.isUrlData(this._data)?this._data.url+" "+o.hash(this._data.format):this._name},t.prototype.assemble=function(){return r.__assign({name:this._name},this._data,{transform:[]})},t}(a.DataFlowNode);t.SourceNode=s},function(e,t,n){"use strict";function r(e){return e.stack.stackBy.reduce(function(e,t){var n=t.fieldDef,r=a.field(n);return r&&e.push(r),e},[])}Object.defineProperty(t,"__esModule",{value:!0});var i=n(4),o=n(35),a=n(9),s=n(2),l=n(26),u=n(38),c=function(e){function t(t){var n=e.call(this)||this;return n._stack=t,n}return i.__extends(t,e),t.prototype.clone=function(){return new t(s.duplicate(this._stack))},t.make=function(e){var n=e.stack;if(!n)return null;var i;n.groupbyChannel&&(i=e.fieldDef(n.groupbyChannel));var o,a=r(e),s=e.encoding.order;return o=s?l.sortParams(s):a.reduce(function(e,t){return e.field.push(t),e.order.push("descending"),e},{field:[],order:[]}),new t({dimensionFieldDef:i,field:e.field(n.fieldChannel),facetby:[],stackby:a,sort:o,offset:n.offset,impute:n.impute})},Object.defineProperty(t.prototype,"stack",{get:function(){return this._stack},enumerable:!0,configurable:!0}),t.prototype.addDimensions=function(e){this._stack.facetby=this._stack.facetby.concat(e)},t.prototype.dependentFields=function(){var e={};e[this._stack.field]=!0,this.getGroupbyFields().forEach(function(t){return e[t]=!0}),this._stack.facetby.forEach(function(t){return e[t]=!0});var t=this._stack.sort.field;return o.isArray(t)?t.forEach(function(t){return e[t]=!0}):e[t]=!0,e},t.prototype.producedFields=function(){var e={};return e[this._stack.field+"_start"]=!0,e[this._stack.field+"_end"]=!0,e},t.prototype.getGroupbyFields=function(){var e=this._stack,t=e.dimensionFieldDef,n=e.impute;return t?t.bin?n?[a.field(t,{binSuffix:"mid"})]:[a.field(t,{}),a.field(t,{binSuffix:"end"})]:[a.field(t)]:[]},t.prototype.assemble=function(){var e=[],t=this._stack,n=t.facetby,r=t.field,i=t.dimensionFieldDef,o=t.impute,s=t.offset,l=t.sort,u=t.stackby;if(o&&i){var c=i?a.field(i,{binSuffix:"mid"}):void 0;i.bin&&e.push({type:"formula",expr:"("+a.field(i,{expr:"datum"})+"+"+a.field(i,{expr:"datum",binSuffix:"end"})+")/2",as:c}),e.push({type:"impute",field:r,groupby:u,key:c,method:"value",value:0})}return e.push({type:"stack",groupby:this.getGroupbyFields().concat(n),field:r,sort:l,as:[r+"_start",r+"_end"],offset:s}),e},t}(u.DataFlowNode);t.StackNode=c},function(e,t,n){"use strict";function r(e){return"top"===e||"left"===e?"header":"footer"}function i(e,t){var n=e.component.layoutHeaders[t].title,r="row"===t?"vertical":void 0;return{name:e.getName(t+"_title"),role:t+"-title",type:"group",marks:[{type:"text",role:t+"-title-text",style:"guide-title",encode:{update:a.__assign({align:{value:"center"},text:{value:n}},"vertical"===r?{angle:{value:270}}:{})}}]}}function o(e,t,n,r,i){if(i){var o=null;if(r.facetFieldDef&&i.labels){var u=r.facetFieldDef,c=u.header?u.header.format:void 0;o={text:l.formatSignalRef(u,c,"parent",e.config),offset:10,orient:"row"===t?"left":"top",style:"guide-label",encode:{update:a.__assign({fontWeight:{value:"normal"},angle:{value:0},fontSize:{value:10}},"row"===t?{align:{value:"right"},baseline:{value:"middle"}}:{})}}}var d=i.axes,f=d&&d.length>0;if(o||f){var p="row"===t?"height":"width";return a.__assign({name:e.getName(t+"_"+n),type:"group",role:t+"-"+n},r.facetFieldDef?{from:{data:e.getName(t+"_domain")},sort:{field:s.field(r.facetFieldDef,{expr:"datum"}),order:r.facetFieldDef.header&&r.facetFieldDef.sort||"ascending"}}:{},o?{title:o}:{},i.sizeSignal?{encode:{update:(h={},h[p]=i.sizeSignal,h)}}:{},f?{axes:d}:{})}}return null;var h}Object.defineProperty(t,"__esModule",{value:!0});var a=n(4),s=n(9),l=n(26);t.HEADER_CHANNELS=["row","column"],t.HEADER_TYPES=["header","footer"],t.getHeaderType=r,t.getTitleGroup=i,t.getHeaderGroup=o},function(e,t,n){"use strict";function r(e){return[].concat(i(e,"width"),i(e,"height"))}function i(e,t){var n="width"===t?"x":"y",r=e.component.layoutSize.get(t);if(!r||"merged"===r)return[];var i=e.getSizeSignalRef(t).signal;if("range-step"===r){var c=e.getScaleComponent(n);if(c){var d=c.get("type"),f=c.get("range");if(s.hasDiscreteDomain(d)&&l.isVgRangeStep(f)){var p=e.scaleName(n);if(u.isFacetModel(e.parent)){if("independent"===e.parent.component.resolve.scale[n])return[o(p,f)]}return[o(p,f),{name:i,update:a(p,c,"domain('"+p+"').length")}]}}throw new Error("layout size is range step although there is no rangeStep.")}return[{name:i,update:""+r}]}function o(e,t){return{name:e+"_step",value:t.step}}function a(e,t,n){var r=t.get("type"),i=t.get("padding"),o=t.get("paddingOuter");o=void 0!==o?o:i;var a=t.get("paddingInner");return a="band"===r?void 0!==a?a:i:1,"bandspace("+n+", "+a+", "+o+") * "+e+"_step"}Object.defineProperty(t,"__esModule",{value:!0});var s=n(5),l=n(45),u=n(33);t.assembleLayoutSignals=r,t.sizeSignals=i,t.sizeExpr=a},function(e,t,n){"use strict";function r(e){var t=e.component.legends,n={};return o.keys(t).forEach(function(r){var o=e.getScaleComponent(r),s=i(o.domains);if(n[s])for(var l=0,u=n[s];l0?o:void 0}}function i(e,t,n,r,i){var o={};if("gradient"===i.get("type")){var s=n.encoding.opacity;l.isValueDef(s)&&(o.opacity={value:s.value})}return o=a.__assign({},o,t),d.keys(o).length>0?o:void 0}function o(e,t,n,r,i){var o=n.legend(r),s=n.config,u={};if(l.isTimeFieldDef(e)){var p=n.getScaleComponent(r).get("type")===c.ScaleType.UTC;t=a.__assign({text:{signal:f.timeFormatExpression("datum.value",e.timeUnit,o.format,s.legend.shortTimeLabels,s.timeFormat,p)}},t)}return u=a.__assign({},u,t),d.keys(u).length>0?u:void 0}Object.defineProperty(t,"__esModule",{value:!0});var a=n(4),s=n(3),l=n(9),u=n(34),c=n(5),d=n(2),f=n(26),p=n(43);t.symbols=r,t.gradient=i,t.labels=o},function(e,t,n){"use strict";function r(e){var t=e.values;return t&&a.isDateTime(t[0])?t.map(function(e){return{signal:a.dateTimeExpr(e,!0)}}):t}function i(e,t,n){if(t===o.COLOR&&("quantitative"===e&&!s.isBinScale(n)||"temporal"===e&&l.contains(["time","utc"],n)))return"gradient"}Object.defineProperty(t,"__esModule",{value:!0});var o=n(3),a=n(108),s=n(5),l=n(2);t.values=r,t.type=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),i=n(43);t.area={vgMark:"area",encodeEntry:function(e){return r.__assign({},i.pointPosition("x",e,"zeroOrMin"),i.pointPosition("y",e,"zeroOrMin"),i.pointPosition2(e,"zeroOrMin"),i.color(e),i.text(e,"tooltip"),i.nonPosition("opacity",e),i.markDefProperties(e.markDef,["orient","interpolate","tension"]))}}},function(e,t,n){"use strict";function r(e,t){var n=e.config,r=e.width,i=e.markDef.orient,s=e.encoding.size,c=e.encoding.x,f=e.scaleName(l.X),m=e.getScaleComponent(l.X);if("horizontal"===i)return a.__assign({},p.pointPosition("x",e,"zeroOrMin"),p.pointPosition2(e,"zeroOrMin"));if(u.isFieldDef(c)){var g=m.get("type");if(c.bin&&!s&&!d.hasDiscreteDomain(g))return p.binnedPosition(c,"x",e.scaleName("x"),n.bar.binSpacing,m.get("reverse"));if(g===d.ScaleType.BAND)return p.bandPosition(c,"x",e)}return p.centeredBandPosition("x",e,a.__assign({},h.mid(r)),o(f,m,n))}function i(e,t){var n=e.config,r=e.encoding,i=e.height,s=e.markDef.orient,c=r.size,f=r.y,m=e.scaleName(l.Y),g=e.getScaleComponent(l.Y);if("vertical"===s)return a.__assign({},p.pointPosition("y",e,"zeroOrMin"),p.pointPosition2(e,"zeroOrMin"));if(u.isFieldDef(f)){var y=g.get("type");if(f.bin&&!c&&!d.hasDiscreteDomain(y))return p.binnedPosition(f,"y",e.scaleName("y"),n.bar.binSpacing,g.get("reverse"));if(y===d.ScaleType.BAND)return p.bandPosition(f,"y",e)}return p.centeredBandPosition("y",e,h.mid(i),o(m,g,n))}function o(e,t,n){if(n.bar.discreteBandSize)return{value:n.bar.discreteBandSize};if(t){var r=t.get("type");if(r!==d.ScaleType.POINT)return r===d.ScaleType.BAND?h.band(e):{value:n.bar.continuousBandSize};var i=t.get("range");if(f.isVgRangeStep(i)&&s.isNumber(i.step))return{value:i.step-1};c.warn(c.message.BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL)}return n.scale.rangeStep&&null!==n.scale.rangeStep?{value:n.scale.rangeStep-1}:{value:20}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(4),s=n(35),l=n(3),u=n(9),c=n(7),d=n(5),f=n(45),p=n(43),h=n(63);t.bar={vgMark:"rect",encodeEntry:function(e){var t=e.stack;return a.__assign({},r(e,t),i(e,t),p.color(e),p.text(e,"tooltip"),p.nonPosition("opacity",e))}}},function(e,t,n){"use strict";function r(e,t,n,r){var i=e.orient||m.getMarkConfig("orient",e,r);e.orient=s(e.type,t,n,i),void 0!==i&&i!==e.orient&&c.warn(c.message.orientOverridden(e.orient,i)),void 0===e.filled&&(e.filled=a(e,r))}function i(e,t,n,r){var i=m.getMarkConfig("opacity",e,r);if(!t.opacity&&void 0===i){var a=o(e.type,t,n);void 0!==a&&(t.opacity={value:a})}return t}function o(e,t,n){if(h.contains([d.POINT,d.TICK,d.CIRCLE,d.SQUARE],e)&&!l.isAggregate(t))return.7}function a(e,t){var n=m.getMarkConfig("filled",e,t),r=e.type;return void 0!==n?n:r!==d.POINT&&r!==d.LINE&&r!==d.RULE}function s(e,t,n,r){switch(e){case d.POINT:case d.CIRCLE:case d.SQUARE:case d.TEXT:case d.RECT:return}var i=t.y&&t.y2,o=t.x&&t.x2;switch(e){case d.TICK:var a=n.x?n.x.get("type"):null,s=n.y?n.y.get("type"):null;return!f.hasDiscreteDomain(a)&&(!t.y||f.hasDiscreteDomain(s)||u.isFieldDef(t.y)&&t.y.bin)?"vertical":"horizontal";case d.RULE:case d.BAR:case d.AREA:if(i)return"vertical";if(o)return"horizontal";if(e===d.RULE){if(t.x&&!t.y)return"vertical";if(t.y&&!t.x)return"horizontal"}case d.LINE:var l=u.isFieldDef(t.x)&&u.isContinuous(t.x),h=u.isFieldDef(t.y)&&u.isContinuous(t.y);if(l&&!h)return"horizontal";if(!l&&h)return"vertical";if(l&&h){var m=t.x,g=t.y,y=m.type===p.TEMPORAL,v=g.type===p.TEMPORAL;return y&&!v?"vertical":!y&&v?"horizontal":!m.aggregate&&g.aggregate?"vertical":m.aggregate&&!g.aggregate?"horizontal":r||(e===d.LINE&&t.order||c.warn(c.message.unclearOrientContinuous(e)),"vertical")}return void c.warn(c.message.unclearOrientDiscreteOrEmpty(e))}return"vertical"}Object.defineProperty(t,"__esModule",{value:!0});var l=n(44),u=n(9),c=n(7),d=n(34),f=n(5),p=n(16),h=n(2),m=n(26);t.normalizeMarkDef=r,t.initEncoding=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),i=n(43),o=n(63);t.line={vgMark:"line",encodeEntry:function(e){var t=e.width,n=e.height;return r.__assign({},i.pointPosition("x",e,o.mid(t)),i.pointPosition("y",e,o.mid(n)),i.color(e),i.text(e,"tooltip"),i.nonPosition("opacity",e),i.nonPosition("size",e,{vgChannel:"strokeWidth"}),i.markDefProperties(e.markDef,["interpolate","tension"]))}}},function(e,t,n){"use strict";function r(e){if(_.isUnitModel(e))O.normalizeMarkDef(e.markDef,e.encoding,e.component.scales,e.config);else for(var t=0,n=e.children;t0?D:"")+e.requestDataName(p.MAIN)},encode:{update:k[t].encodeEntry(e)}})];return n.length>0?[{name:e.getName("pathgroup"),type:"group",from:{facet:{name:D+e.requestDataName(p.MAIN),data:e.requestDataName(p.MAIN),groupby:n}},encode:{update:{width:{field:{group:"width"}},height:{field:{group:"height"}}}},marks:s}]:s}function a(e){if("line"===e.mark()&&e.channelHasField("order"))return b.sortParams(e.encoding.order,{expr:"datum"});var t="horizontal"===e.markDef.orient?"y":"x",n=e.sort(t);return{field:y.isSortField(n)?m.field({aggregate:h.isAggregate(e.encoding)?n.op:void 0,field:n.field},{expr:"datum"}):e.field(t,{binSuffix:e.stack&&e.stack.impute?"mid":void 0,expr:"datum"}),order:"descending"}}function s(e){var t=e.mark(),n=b.getStyles(e.markDef),r=void 0!==e.markDef.clip?!!e.markDef.clip:u(e),i=[];return i.push(c.__assign({name:e.getName("marks"),type:k[t].vgMark},r?{clip:!0}:{},n?{style:n}:{},{from:{data:e.requestDataName(p.MAIN)},encode:{update:k[t].encodeEntry(e)}})),i}function l(e){return f.NONSPATIAL_CHANNELS.reduce(function(t,n){var r=e.encoding;if("order"===n)return t;if("detail"===n){var i=r[n];i&&(d.isArray(i)?i:[i]).forEach(function(e){e.aggregate||t.push(m.field(e,{}))})}else{var o=m.getFieldDef(r[n]);o&&!o.aggregate&&t.push(m.field(o,{}))}return t},[])}function u(e){var t=e.getScaleComponent("x"),n=e.getScaleComponent("y");return!!(t&&t.get("domainRaw")||n&&n.get("domainRaw"))}Object.defineProperty(t,"__esModule",{value:!0});var c=n(4),d=n(35),f=n(3),p=n(55),h=n(44),m=n(9),g=n(34),y=n(239),v=n(2),b=n(26),_=n(33),E=n(607),S=n(608),O=n(609),w=n(610),T=n(612),P=n(613),A=n(614),x=n(615),C=n(616),k={area:E.area,bar:S.bar,line:w.line,point:T.point,text:x.text,tick:C.tick,rect:P.rect,rule:A.rule,circle:T.circle,square:T.square};t.parseMarkDef=r,t.parseMarkGroup=i;var D="faceted_path_";t.getPathSort=a},function(e,t,n){"use strict";function r(e,t){var n=e.config,r=e.width,a=e.height;return o.__assign({},s.pointPosition("x",e,l.mid(r)),s.pointPosition("y",e,l.mid(a)),s.color(e),s.text(e,"tooltip"),s.nonPosition("size",e),i(e,n,t),s.nonPosition("opacity",e))}function i(e,t,n){return n?{shape:{value:n}}:s.nonPosition("shape",e,{defaultValue:a.getMarkConfig("shape",e.markDef,t)})}Object.defineProperty(t,"__esModule",{value:!0});var o=n(4),a=n(26),s=n(43),l=n(63);t.shapeMixins=i,t.point={vgMark:"symbol",encodeEntry:function(e){return r(e)}},t.circle={vgMark:"symbol",encodeEntry:function(e){return r(e,"circle")}},t.square={vgMark:"symbol",encodeEntry:function(e){return r(e,"square")}}},function(e,t,n){"use strict";function r(e){var t=e.encoding.x,n=e.encoding.x2,r=e.getScaleComponent(a.X),i=r?r.get("type"):void 0;if(s.isFieldDef(t)&&t.bin&&!n)return d.binnedPosition(t,"x",e.scaleName("x"),0,r.get("reverse"));if(s.isFieldDef(t)&&r&&c.hasDiscreteDomain(i)){if(i===c.ScaleType.BAND)return d.bandPosition(t,"x",e);throw new Error(l.message.scaleTypeNotWorkWithMark(u.RECT,i))}return o.__assign({},d.pointPosition("x",e,"zeroOrMax"),d.pointPosition2(e,"zeroOrMin","x2"))}function i(e){var t=e.encoding.y,n=e.encoding.y2,r=e.getScaleComponent(a.Y),i=r?r.get("type"):void 0;if(s.isFieldDef(t)&&t.bin&&!n)return d.binnedPosition(t,"y",e.scaleName("y"),0,r.get("reverse"));if(s.isFieldDef(t)&&r&&c.hasDiscreteDomain(i)){if(i===c.ScaleType.BAND)return d.bandPosition(t,"y",e);throw new Error(l.message.scaleTypeNotWorkWithMark(u.RECT,i))}return o.__assign({},d.pointPosition("y",e,"zeroOrMax"),d.pointPosition2(e,"zeroOrMin","y2"))}Object.defineProperty(t,"__esModule",{value:!0});var o=n(4),a=n(3),s=n(9),l=n(7),u=n(34),c=n(5),d=n(43);t.rect={vgMark:"rect",encodeEntry:function(e){return o.__assign({},r(e),i(e),d.color(e),d.text(e,"tooltip"),d.nonPosition("opacity",e))}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),i=n(43),o=n(63);t.rule={vgMark:"rule",encodeEntry:function(e){var t=(e.config,e.markDef),n=e.width,a=e.height,s=t.orient;return r.__assign({},i.pointPosition("x",e,"horizontal"===s?"zeroOrMin":o.mid(n)),i.pointPosition("y",e,"vertical"===s?"zeroOrMin":o.mid(a)),i.pointPosition2(e,"zeroOrMax"),i.color(e),i.text(e,"tooltip"),i.nonPosition("opacity",e),i.nonPosition("size",e,{vgChannel:"strokeWidth"}))}}},function(e,t,n){"use strict";function r(e,t){return l.isFieldDef(t)&&t.type===u.QUANTITATIVE?{field:{group:"width"},offset:-5}:{value:e.scale.textXRangeStep/2}}function i(e,t,n){if(void 0===c.getMarkConfig("align",e,n))return s.channelHasField(t,a.X)?"center":"right"}Object.defineProperty(t,"__esModule",{value:!0});var o=n(4),a=n(3),s=n(44),l=n(9),u=n(16),c=n(26),d=n(43),f=n(63);t.text={vgMark:"text",encodeEntry:function(e){var t=e.config,n=e.encoding,a=e.height,s=n.text;return o.__assign({},d.pointPosition("x",e,r(t,s)),d.pointPosition("y",e,f.mid(a)),d.text(e),d.color(e),d.text(e,"tooltip"),d.nonPosition("opacity",e),d.nonPosition("size",e,{vgChannel:"fontSize"}),d.valueIfDefined("align",i(e.markDef,n,t)))}}},function(e,t,n){"use strict";function r(e){var t=e.config,n=e.markDef.orient,r=e.getScaleComponent("horizontal"===n?"x":"y");if(void 0!==t.tick.bandSize)return t.tick.bandSize;var i=r?r.get("range"):void 0,a=i&&o.isVgRangeStep(i)?i.step:t.scale.rangeStep;if("number"!=typeof a)throw new Error("Function does not handle non-numeric rangeStep");return a/1.5}Object.defineProperty(t,"__esModule",{value:!0});var i=n(4),o=n(45),a=n(43),s=n(63);t.tick={vgMark:"rect",encodeEntry:function(e){var t=e.config,n=e.markDef,o=e.width,l=e.height,u=n.orient,c="horizontal"===u?"width":"height",d="horizontal"===u?"height":"width";return i.__assign({},a.pointPosition("x",e,s.mid(o),"xc"),a.pointPosition("y",e,s.mid(l),"yc"),a.nonPosition("size",e,{defaultValue:r(e),vgChannel:c}),(f={},f[d]={value:t.tick.thickness},f),a.color(e),a.nonPosition("opacity",e));var f}}},function(e,t,n){"use strict";function r(e){return c.isLayerModel(e)||c.isConcatModel(e)||c.isRepeatModel(e)?e.children.reduce(function(e,t){return e.concat(r(t))},i(e)):i(e)}function i(e){return l.keys(e.component.scales).reduce(function(t,n){var r=e.component.scales[n];if(r.merged)return t;var i=r.combine(),s=i.domainRaw,l=i.range,u=i.name,c=i.type,p=(i.domainRaw,i.range,a.__rest(i,["name","type","domainRaw","range"]));return l=o(l,u,e,n),s&&d.isRawSelectionDomain(s)&&(s=d.selectionScaleDomain(e,s)),t.push(a.__assign({name:u,type:c,domain:f.assembleDomain(e,n)},s?{domainRaw:s}:{},{range:l},p)),t},[])}function o(e,t,n,r){if("x"===r||"y"===r){if(u.isVgRangeStep(e))return{step:{signal:t+"_step"}};if(s.isArray(e)&&2===e.length){var i=e[0],o=e[1];if(0===i&&u.isVgSignalRef(o))return[0,{signal:n.getSizeName(o.signal)}];if(u.isVgSignalRef(i)&&0===o)return[{signal:n.getSizeName(i.signal)},0]}}return e}Object.defineProperty(t,"__esModule",{value:!0});var a=n(4),s=n(35),l=n(2),u=n(45),c=n(33),d=n(22),f=n(106);t.assembleScales=r,t.assembleScalesForModel=i,t.assembleScaleRange=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),i=n(54),o=function(e){function t(t,n){var r=e.call(this,{},{name:t})||this;return r.merged=!1,r.domains=[],r.setWithExplicit("type",n),r}return r.__extends(t,e),t}(i.Split);t.ScaleComponent=o},function(e,t,n){"use strict";function r(e){i(e),m.parseScaleDomain(e);for(var t=0,n=u.NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES;t-1?e[r]=n:h.warn(h.message.incompatibleChannel(r,t.BOXPLOT)),e},{})})}function o(e,t){e=i(e);var n=e.mark,o=(e.encoding,e.selection),s=u.__rest(e,["mark","encoding","selection"]),d=void 0;r(n)&&n.extent&&c.isNumber(n.extent)&&(d=n.extent);var f=a(e),p=l(e,f,d),h=p.transform,m=p.continuousAxisChannelDef,g=p.continuousAxis,y=p.encodingWithoutContinuousAxis,v=y.size,b=(y.color,u.__rest(y,["size","color"])),_=v?{size:v}:{size:{value:t.box.size}},E={};return m.scale&&(E.scale=m.scale),m.axis&&(E.axis=m.axis),u.__assign({},s,{transform:h,layer:[{mark:{type:"rule",style:"boxWhisker"},encoding:u.__assign((S={},S[g]=u.__assign({field:"lowerWhisker",type:m.type},E),S[g+"2"]={field:"lowerBox",type:m.type},S),b)},{mark:{type:"rule",style:"boxWhisker"},encoding:u.__assign((O={},O[g]={field:"upperBox",type:m.type},O[g+"2"]={field:"upperWhisker",type:m.type},O),b)},u.__assign({},o?{selection:o}:{},{mark:{type:"bar",style:"box"},encoding:u.__assign((w={},w[g]={field:"lowerBox",type:m.type},w[g+"2"]={field:"upperBox",type:m.type},w),y,_)}),{mark:{type:"tick",style:"boxMid"},encoding:u.__assign((T={},T[g]={field:"midBox",type:m.type},T),b,_)}]});var S,O,w,T}function a(e){var n=e.mark,i=e.encoding;u.__rest(e,["mark","encoding"]);if(p.isFieldDef(i.x)&&p.isContinuous(i.x)){if(p.isFieldDef(i.y)&&p.isContinuous(i.y)){if(void 0===i.x.aggregate&&i.y.aggregate===t.BOXPLOT)return"vertical";if(void 0===i.y.aggregate&&i.x.aggregate===t.BOXPLOT)return"horizontal";if(i.x.aggregate===t.BOXPLOT&&i.y.aggregate===t.BOXPLOT)throw new Error("Both x and y cannot have aggregate");return r(n)&&n.orient?n.orient:"vertical"}return"horizontal"}if(p.isFieldDef(i.y)&&p.isContinuous(i.y))return"vertical";throw new Error("Need a valid continuous axis for boxplots")}function s(e,n){var r,i,o=(e.mark,e.encoding);u.__rest(e,["mark","encoding"]);if("vertical"===n?(i="y",r=o.y):(i="x",r=o.x),r&&r.aggregate){var a=r.aggregate,s=u.__rest(r,["aggregate"]);a!==t.BOXPLOT&&h.warn("Continuous axis should not have customized aggregation function "+a),r=s}return{continuousAxisChannelDef:r,continuousAxis:i}}function l(e,n,r){var i=s(e,n),o=i.continuousAxisChannelDef,a=i.continuousAxis,l=e.encoding,u=void 0===r,c=[{aggregate:"q1",field:o.field,as:"lowerBox"},{aggregate:"q3",field:o.field,as:"upperBox"},{aggregate:"median",field:o.field,as:"midBox"}],d=[];u?(c.push({aggregate:"min",field:o.field,as:"lowerWhisker"}),c.push({aggregate:"max",field:o.field,as:"upperWhisker"})):d=[{calculate:"datum.upperBox - datum.lowerBox",as:"IQR"},{calculate:"datum.lowerBox - datum.IQR * "+r,as:"lowerWhisker"},{calculate:"datum.upperBox + datum.IQR * "+r,as:"lowerWhisker"}];var h=[],m=[],g=[],y={};return f.forEach(l,function(e,n){if(n!==a)if(p.isFieldDef(e)){if(e.aggregate&&e.aggregate!==t.BOXPLOT)c.push({aggregate:e.aggregate,field:e.field,as:p.field(e)});else if(void 0===e.aggregate){var r=p.field(e),i=e.bin;if(i){var o=e.field;m.push({bin:i,field:o,as:r})}else if(e.timeUnit){var s=e.timeUnit,u=e.field;g.push({timeUnit:s,field:u,as:r})}h.push(r)}y[n]={field:p.field(e),type:e.type}}else y[n]=l[n]}),{transform:[].concat(m,g,[{summarize:c,groupby:h}],d),continuousAxisChannelDef:o,continuousAxis:a,encodingWithoutContinuousAxis:y}}Object.defineProperty(t,"__esModule",{value:!0});var u=n(4),c=n(35),d=n(44),f=n(44),p=n(9),h=n(7);t.BOXPLOT="box-plot",t.isBoxPlotDef=r,t.BOXPLOT_STYLES=["boxWhisker","box","boxMid"],t.VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX={box:["size"]};var m=["x","y","color","detail","opacity","size"];t.filterUnsupportedChannels=i,t.normalizeBoxPlot=o},function(e,t,n){"use strict";function r(e){var t=(e.mark,e.selection,e.encoding),n=i.__rest(e,["mark","selection","encoding"]),r=(t.size,i.__rest(t,["size"])),o=(t.x2,t.y2,i.__rest(t,["x2","y2"])),a=(o.x,o.y,i.__rest(o,["x","y"]));if(!t.x2&&!t.y2)throw new Error("Neither x2 or y2 provided");return i.__assign({},n,{layer:[{mark:"rule",encoding:r},{mark:"tick",encoding:o},{mark:"tick",encoding:t.x2?i.__assign({x:t.x2,y:t.y},a):i.__assign({x:t.x,y:t.y2},a)}]})}Object.defineProperty(t,"__esModule",{value:!0});var i=n(4);t.ERRORBAR="error-bar",t.normalizeErrorBar=r},function(e,t,n){"use strict";function r(e,t){c[e]=t}function i(e){delete c[e]}function o(e,t){var n=s.isMarkDef(e.mark)?e.mark.type:e.mark,r=c[n];if(r)return r(e,t);throw new Error("Unregistered composite mark "+n)}Object.defineProperty(t,"__esModule",{value:!0});var a=n(4),s=n(34),l=n(627),u=n(628),c={};t.add=r,t.remove=i,t.COMPOSITE_MARK_STYLES=l.BOXPLOT_STYLES,t.VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX=a.__assign({},l.VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX),r(l.BOXPLOT,l.normalizeBoxPlot),r(u.ERRORBAR,u.normalizeErrorBar),t.normalize=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SELECTION_ID="_vgsid_",t.defaultConfig={single:{on:"click",fields:[t.SELECTION_ID],resolve:"global"},multi:{on:"click",fields:[t.SELECTION_ID],toggle:"event.shiftKey",resolve:"global"},interval:{on:"[mousedown, window:mouseup] > window:mousemove!",encodings:["x","y"],translate:"[mousedown, window:mouseup] > window:mousemove!",zoom:"wheel!",mark:{fill:"#333",fillOpacity:.125,stroke:"white"},resolve:"global"}}},function(e,t,n){"use strict";function r(e,n,r){var f=u.isMarkDef(e)?e.type:e;if(!d.contains(t.STACKABLE_MARKS,f))return null;if(!a.isAggregate(n))return null;var p=o.NONSPATIAL_CHANNELS.reduce(function(e,t){if(a.channelHasField(n,t)){var r=n[t];(d.isArray(r)?r:[r]).forEach(function(n){var r=s.getFieldDef(n);r.aggregate||e.push({channel:t,fieldDef:r})})}return e},[]);if(0===p.length)return null;var h=s.isFieldDef(n.x),m=s.isFieldDef(n.y),g=s.isFieldDef(n.x)&&!!n.x.aggregate;if(g!==(s.isFieldDef(n.y)&&!!n.y.aggregate)){var y=g?o.X:o.Y,v=n[y],b=v.aggregate,_=v.scale,E=null;return E=void 0!==v.stack?v.stack:d.contains(t.STACK_BY_DEFAULT_MARKS,f)&&void 0===r?"zero":r,E&&"none"!==E?_&&_.type&&_.type!==c.ScaleType.LINEAR?(l.warn(l.message.cannotStackNonLinearScale(_.type)),null):a.channelHasField(n,y===o.X?o.X2:o.Y2)?(l.warn(l.message.cannotStackRangedMark(y)),null):d.contains(i.SUM_OPS,b)?{groupbyChannel:g?m?o.Y:null:h?o.X:null,fieldChannel:y,impute:d.contains(["area","line"],f),stackBy:p,offset:E}:(l.warn(l.message.cannotStackNonSummativeAggregate(b)),null):null}return null}Object.defineProperty(t,"__esModule",{value:!0});var i=n(62),o=n(3),a=n(44),s=n(9),l=n(7),u=n(34),c=n(5),d=n(2);t.STACKABLE_MARKS=[u.BAR,u.AREA,u.RULE,u.POINT,u.CIRCLE,u.SQUARE,u.LINE,u.TEXT,u.TICK],t.STACK_BY_DEFAULT_MARKS=[u.BAR,u.AREA],t.stack=r},function(e,t,n){"use strict";function r(e){var t=e.anchor,n=e.offset,r=e.orient,o=e.color,a=i.__rest(e,["anchor","offset","orient","color"]);return{mark:i.__assign({},a,o?{fill:o}:{}),nonMark:i.__assign({},t?{anchor:t}:{},n?{offset:n}:{},r?{orient:r}:{})}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(4);t.extractTitleConfig=r},function(e,t,n){"use strict";n.d(t,"a",function(){return a}),n.d(t,"b",function(){return s}),n.d(t,"c",function(){return l}),n.d(t,"d",function(){return u}),n.d(t,"e",function(){return c}),n.d(t,"f",function(){return d});var r=n(87),i=n(241),o=[],a=n.i(i.a)("id"),s=n.i(r.a)(function(e){return e},o,"identity"),l=n.i(r.a)(function(){return 0},o,"zero"),u=n.i(r.a)(function(){return 1},o,"one"),c=n.i(r.a)(function(){return!0},o,"true"),d=n.i(r.a)(function(){return!1},o,"false")},function(e,t,n){"use strict";var r=n(87),i=n(161),o=n(163),a=n(110),s=n(111);t.a=function(e,t){var l,u,c,d,f,p,h,m,g,y=[],v=(e=n.i(i.a)(e)).map(function(e,t){return null==e?null:(y.push(t),n.i(o.a)(e)?e:n.i(a.a)(e).map(s.a).join("]["))}),b=y.length-1,_=n.i(i.a)(t),E="var u,v;return ";if(b<0)return null;for(u=0;u<=b;++u)l=y[u],c=v[l],n.i(o.a)(c)?(p="f"+l,d="(u=this."+p+"(a))",f="(v=this."+p+"(b))",(h=h||{})[p]=c):(d="(u=a["+c+"])",f="(v=b["+c+"])"),p="((v=v instanceof Date?+v:v),(u=u instanceof Date?+u:u))","descending"!==_[l]?(g=1,m=-1):(g=-1,m=1),E+="("+d+"<"+f+"||u==null)&&v!=null?"+m+":(u>v||v==null)&&u!=null?"+g+":"+p+"!==u&&v===v?"+m+":v!==v&&u===u?"+g+(l=r){n=i=r;break}for(o=a=s;++sr&&(n=r,o=s),i=r){n=i=r;break}for(o=a=s;++sr&&(n=r,o=s),i=o&&r("error","ERROR",arguments),this},warn:function(){return t>=a&&r("warn","WARN",arguments),this},info:function(){return t>=s&&r("log","INFO",arguments),this},debug:function(){return t>=l&&r("log","DEBUG",arguments),this}}}},function(e,t,n){"use strict";t.a=function(e,t,n,r){var i=t.length,o=n.length;if(!o)return t;if(!i)return n;for(var a=r||new t.constructor(i+o),s=0,l=0,u=0;s0?n[l++]:t[s++];for(;sv||v==null)&&u!=null?"+h+":"+f+"!==u&&v===v?"+p+":v!==v&&u===u?"+h+(s=r){n=i=r;break}for(o=a=s;++sr&&(n=r,o=s),i=r){n=i=r;break}for(o=a=s;++sr&&(n=r,o=s),i=o&&r("warn","WARN",arguments),this},info:function(){return t>=a&&r("log","INFO",arguments),this},debug:function(){return t>=s&&r("log","DEBUG",arguments),this}}}},function(e,t,n){"use strict";t.a=function(e,t,n,r){var i=t.length,o=n.length;if(!o)return t;if(!i)return n;for(var a=r||new t.constructor(i+o),s=0,l=0,u=0;s0?n[l++]:t[s++];for(;s-1?t:e}function p(e,t){t=t||{};var n=t.body;if(e instanceof p){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new i(e.headers)),this.method=e.method,this.mode=e.mode,n||null==e._bodyInit||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new i(t.headers)),this.method=f(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function h(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),i=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(i))}}),t}function m(e){var t=new i;return e.split(/\r?\n/).forEach(function(e){var n=e.split(":"),r=n.shift().trim();if(r){var i=n.join(":").trim();t.append(r,i)}}),t}function g(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new i(t.headers),this.url=t.url||"",this._initBody(e)}if(!e.fetch){var y={searchParams:"URLSearchParams"in e,iterable:"Symbol"in e&&"iterator"in Symbol,blob:"FileReader"in e&&"Blob"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in e,arrayBuffer:"ArrayBuffer"in e};if(y.arrayBuffer)var v=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],b=function(e){return e&&DataView.prototype.isPrototypeOf(e)},_=ArrayBuffer.isView||function(e){return e&&v.indexOf(Object.prototype.toString.call(e))>-1};i.prototype.append=function(e,r){e=t(e),r=n(r);var i=this.map[e];this.map[e]=i?i+","+r:r},i.prototype.delete=function(e){delete this.map[t(e)]},i.prototype.get=function(e){return e=t(e),this.has(e)?this.map[e]:null},i.prototype.has=function(e){return this.map.hasOwnProperty(t(e))},i.prototype.set=function(e,r){this.map[t(e)]=n(r)},i.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},i.prototype.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),r(e)},i.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),r(e)},i.prototype.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),r(e)},y.iterable&&(i.prototype[Symbol.iterator]=i.prototype.entries);var E=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];p.prototype.clone=function(){return new p(this,{body:this._bodyInit})},d.call(p.prototype),d.call(g.prototype),g.prototype.clone=function(){return new g(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new i(this.headers),url:this.url})},g.error=function(){var e=new g(null,{status:0,statusText:""});return e.type="error",e};var S=[301,302,303,307,308];g.redirect=function(e,t){if(-1===S.indexOf(t))throw new RangeError("Invalid status code");return new g(null,{status:t,headers:{location:e}})},e.Headers=i,e.Request=p,e.Response=g,e.fetch=function(e,t){return new Promise(function(n,r){var i=new p(e,t),o=new XMLHttpRequest;o.onload=function(){var e={status:o.status,statusText:o.statusText,headers:m(o.getAllResponseHeaders()||"")};e.url="responseURL"in o?o.responseURL:e.headers.get("X-Request-URL");var t="response"in o?o.response:o.responseText;n(new g(t,e))},o.onerror=function(){r(new TypeError("Network request failed"))},o.ontimeout=function(){r(new TypeError("Network request failed"))},o.open(i.method,i.url,!0),"include"===i.credentials&&(o.withCredentials=!0),"responseType"in o&&y.blob&&(o.responseType="blob"),i.headers.forEach(function(e,t){o.setRequestHeader(t,e)}),o.send(void 0===i._bodyInit?null:i._bodyInit)})},e.fetch.polyfill=!0}}("undefined"!=typeof self?self:this)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SET_APPLICATION_STATE="SET_APPLICATION_STATE"},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(119),a=n(731),s=n(19),l=n(150),u=n(572),c=n(39),d=n(12),f=n(66);n(281);var p=n(683),h=n(687),m=n(693),g=n(695),y=n(697),v=n(698),b=n(702),_=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){var e,t,n=this.props,r=n.dataset,o=n.config,a=o.hideHeader,s=o.hideFooter;return r.isLoading||(r.data?(e=i.createElement(u,{split:"vertical",defaultSize:200,minSize:175,maxSize:350},i.createElement(p.DataPane,null),i.createElement(u,{split:"vertical",defaultSize:235,minSize:200,maxSize:350},i.createElement(h.EncodingPane,null),i.createElement(b.ViewPane,null))),s||(t=i.createElement(m.Footer,null))):e=i.createElement(y.LoadData,null)),i.createElement("div",{className:"voyager"},i.createElement(v.LogPane,null),!a&&i.createElement(g.Header,null),i.createElement(l.ClipLoader,{color:c.SPINNER_COLOR,loading:r.isLoading}),e,t)},t}(i.PureComponent);t.AppRoot=s.connect(function(e){return{dataset:f.selectDataset(e),config:d.selectConfig(e)}})(o.DragDropContext(a.default)(_))},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),i=this&&this.__assign||Object.assign||function(e){for(var t,n=1,r=arguments.length;n
"+JSON.stringify(t,null,2)+"
"),s.document.close()},t.prototype.onClearAll=function(){this.props.handleAction({type:u.BOOKMARK_CLEAR_ALL})},t.prototype.openModal=function(){this.setState({modalIsOpen:!0})},t.prototype.closeModal=function(){this.setState({modalIsOpen:!1})},t.prototype.renderBookmarks=function(e){var t=this,n=this.props.data,r=e.list.map(function(t){return e.dict[t].plot}),i=r.map(function(e,r){var i=e.spec,a=e.fieldInfos;return o.createElement(p.Plot,{bookmark:t.props.bookmark,closeModal:t.closeModal.bind(t),data:n,filters:[],key:r,fieldInfos:a,handleAction:t.props.handleAction,isPlotListItem:!0,showBookmarkButton:!0,showSpecifyButton:!0,spec:i})});return o.createElement("div",null,i.length>0?i:o.createElement("div",{styleName:"vis-list-empty"},"You have no bookmarks"))},t}(o.PureComponent);t.BookmarkBase=m;var g=a(m,h);t.BookmarkPane=l.connect(function(e){return{bookmark:f.selectBookmark(e),data:d.selectData(e)}},c.createDispatchHandler())(g)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(31),o=n(59),a=n(6),s=n(74),l=n(0),u=n(8),c=n(19),d=n(64),f=n(20),p=n(256),h=n(39),m=n(46),g=n(12),y=n(58),v=n(118),b=n(284),_=n(684),E=function(e){function t(t){var n=e.call(this,t)||this;return n.onAdd=n.onAdd.bind(n),n.onFilterToggle=n.onFilterToggle.bind(n),n}return r(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.fieldDefs,r=t.schema,i=n.map(function(t){var n;a.isWildcard(t.field)||(n=r.primitiveType(t.field));var i=e.getValidTypes(n).length<2,o=a.isWildcard(t.field)?s(t):t.field;return l.createElement("div",{key:o,styleName:"field-list-item"},e.renderComponent(t,i,n))});return l.createElement("div",{styleName:"field-list"},i)},t.prototype.onAdd=function(e){(0,this.props.handleAction)({type:f.SPEC_FIELD_AUTO_ADD,payload:{fieldDef:e}})},t.prototype.onFilterToggle=function(e){(0,this.props.handleAction)({type:p.FILTER_TOGGLE,payload:{filter:this.getFilter(e)}})},t.prototype.getFilter=function(e){var t=this.props.schema;if(!a.isWildcard(e.field)){var n=t.domain({field:e.field});return m.createDefaultFilter(e,n)}},t.prototype.renderComponent=function(e,t,n){if(t)return this.renderField(e);var r=this.renderTypeChanger(e,n);return this.renderField(e,r)},t.prototype.renderTypeChanger=function(e,t){var n=this.props.handleAction;if(!a.isWildcard(e.field))return l.createElement(_.TypeChanger,{field:e.field,type:e.type,validTypes:this.getValidTypes(t),handleAction:n})},t.prototype.renderField=function(e,t){var n=this.props,r=n.schema,i=n.filters,o={active:!a.isWildcard(e.field)&&m.filterHasField(i,e.field),onToggle:this.onFilterToggle};return l.createElement(v.Field,{fieldDef:e,isPill:!0,draggable:!0,filter:o,parentId:{type:h.FieldParentType.FIELD_LIST},caretShow:!0,popupComponent:t,onDoubleClick:this.onAdd,onAdd:this.onAdd,schema:r})},t.prototype.getValidTypes=function(e){switch(e){case o.PrimitiveType.NUMBER:case o.PrimitiveType.INTEGER:return[i.ExpandedType.QUANTITATIVE,i.ExpandedType.NOMINAL];case o.PrimitiveType.DATETIME:return[i.ExpandedType.TEMPORAL];case o.PrimitiveType.STRING:case o.PrimitiveType.BOOLEAN:return[i.ExpandedType.NOMINAL];default:return[]}},t}(l.PureComponent),S=u(E,b);t.FieldList=c.connect(function(e){return{fieldDefs:g.selectSchemaFieldDefs(e).concat([{fn:"count",field:"*",type:"quantitative"}]),schema:g.selectSchema(e),filters:y.selectFilters(e)}},d.createDispatchHandler())(S),t.PresetWildcardFieldList=c.connect(function(e){return{fieldDefs:g.selectPresetWildcardFields(e),schema:g.selectSchema(e)}},d.createDispatchHandler())(S)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(19),s=n(12),l=n(260),u=n(283),c=n(682),d=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){var e=this.props.data.name,t=this.props.data.schema.fieldSchemas.length,n=this.props.config,r=n.showDataSourceSelector,o=n.wildcards,a=t>0?i.createElement("div",{styleName:"data-pane-section"},i.createElement("h3",null,"Fields"),i.createElement(c.FieldList,null)):null,s="disabled"!==o&&t>0&&i.createElement("div",{styleName:"data-pane-section"},i.createElement("h3",null,"Wildcard Fields"),i.createElement(c.PresetWildcardFieldList,null));return i.createElement("div",{className:"pane",styleName:"data-pane"},i.createElement("h2",{styleName:"data-pane-title"},"Data"),i.createElement("div",null,i.createElement("span",{styleName:"current-dataset"},i.createElement("i",{className:"fa fa-database"})," ",e),i.createElement("span",{className:"right"},r?i.createElement(l.DataSelector,{title:"Change"}):null)),a,s)},t}(i.PureComponent);t.DataPaneBase=d,t.DataPane=a.connect(function(e){return{data:s.selectDataset(e),config:s.selectConfig(e)}})(o(d,u))},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(168),s=n(285),l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){var e=this,t=this.props.validTypes;return i.createElement("div",{styleName:"type-changer"},i.createElement("h4",null,"Type"),t.map(function(t){return i.createElement("label",{key:t},i.createElement("input",{type:"radio",value:t,name:"type",onChange:e.onTypeChange.bind(e),checked:e.props.type===t}),i.createElement("span",{styleName:"type"}," ",t," "))}))},t.prototype.onTypeChange=function(e){var t=e.target.value,n=this.props,r=n.handleAction,i=n.field;r({type:a.DATASET_SCHEMA_CHANGE_FIELD_TYPE,payload:{field:i,type:t}})},t}(i.PureComponent);t.TypeChangerBase=l,t.TypeChanger=o(l,s)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(6),o=n(0),a=n(8),s=n(119),l=n(94),u=n(20),c=n(39),d=n(170),f=n(118),p=n(288),h=n(686),m=n(261),g=function(e){function t(t){var n=e.call(this,t)||this;return n.popupRefHandler=function(e){n.fieldCustomizer=e},n.fieldHandler=function(e){n.encodingShelf=e},n.state={customizerIsOpened:!1},n.onWildcardAdd=n.onWildcardAdd.bind(n),n.onWildcardRemove=n.onWildcardRemove.bind(n),n.onWildcardDisable=n.onWildcardDisable.bind(n),n.onWildcardEnable=n.onWildcardEnable.bind(n),n.toggleCustomizer=n.toggleCustomizer.bind(n),n}return r(t,e),t.prototype.componentWillUpdate=function(e,t){t&&(t.customizerIsOpened?document.addEventListener("click",this.handleClickOutside.bind(this),!0):this.state.customizerIsOpened&&document.removeEventListener("click",this.handleClickOutside.bind(this),!0))},t.prototype.render=function(){var e=this.props,t=e.id,n=e.connectDropTarget,r=e.fieldDef,a=e.handleAction,s=i.isWildcard(t.channel),u=s?"any":t.channel;return n(o.createElement("div",{styleName:s?"wildcard-shelf":"encoding-shelf"},o.createElement("div",{styleName:"shelf-label"},o.createElement(l,{attachment:"top left",targetAttachment:"bottom left"},r&&!d.isWildcardChannelId(t)?o.createElement("span",{onClick:this.toggleCustomizer,ref:this.fieldHandler},u," "," ",o.createElement("i",{className:"fa fa-caret-down"})):o.createElement("span",null,u),this.state.customizerIsOpened&&o.createElement("div",{ref:this.popupRefHandler},o.createElement(h.FieldCustomizer,{shelfId:t,fieldDef:r,handleAction:a})))),r?this.renderField():this.renderFieldPlaceholder()))},t.prototype.onWildcardEnable=function(){var e=this.props,t=e.id;(0,e.handleAction)({type:u.SPEC_FUNCTION_ENABLE_WILDCARD,payload:{shelfId:t}})},t.prototype.onWildcardDisable=function(){var e=this.props,t=e.id;(0,e.handleAction)({type:u.SPEC_FUNCTION_DISABLE_WILDCARD,payload:{shelfId:t}})},t.prototype.onWildcardAdd=function(e){var t=this.props,n=t.id;(0,t.handleAction)({type:u.SPEC_FUNCTION_ADD_WILDCARD,payload:{shelfId:n,fn:e}})},t.prototype.onWildcardRemove=function(e){var t=this.props,n=t.id;(0,t.handleAction)({type:u.SPEC_FUNCTION_REMOVE_WILDCARD,payload:{shelfId:n,fn:e}})},t.prototype.onFunctionChange=function(e){var t=this.props,n=t.id;(0,t.handleAction)({type:u.SPEC_FUNCTION_CHANGE,payload:{shelfId:n,fn:e}})},t.prototype.onRemove=function(){var e=this.props,t=e.id,n=e.handleAction;this.closePopup(),n({type:u.SPEC_FIELD_REMOVE,payload:t})},t.prototype.renderField=function(){var e=this.props,t=e.id,n=e.fieldDef,r=e.schema,i="quantitative"===n.type||"temporal"===n.type,a=i?o.createElement(m.FunctionPicker,{fieldDefParts:n,onFunctionChange:this.onFunctionChange.bind(this),wildcardHandler:this}):null;return o.createElement("div",{styleName:"field-wrapper"},o.createElement(f.Field,{draggable:!0,fieldDef:n,caretShow:!0,isPill:!0,schema:r,popupComponent:a,onRemove:this.onRemove.bind(this),parentId:{type:c.FieldParentType.ENCODING_SHELF,id:t}}))},t.prototype.renderFieldPlaceholder=function(){var e=this.props,t=e.item,n=e.isOver;return o.createElement("span",{styleName:n?"placeholder-over":t?"placeholder-active":"placeholder"},"Drop a field here")},t.prototype.handleClickOutside=function(e){this.fieldCustomizer&&this.encodingShelf&&(this.fieldCustomizer.contains(e.target)||this.encodingShelf.contains(e.target))||this.closePopup()},t.prototype.closePopup=function(){this.setState({customizerIsOpened:!1})},t.prototype.toggleCustomizer=function(){this.setState({customizerIsOpened:!this.state.customizerIsOpened})},t}(o.PureComponent),y={drop:function(e,t){if(!t.didDrop()){var n=t.getItem(),r=n.fieldDef,i=n.parentId;switch(i.type){case c.FieldParentType.FIELD_LIST:e.handleAction({type:u.SPEC_FIELD_ADD,payload:{shelfId:e.id,fieldDef:r,replace:!0}});break;case c.FieldParentType.ENCODING_SHELF:e.handleAction({type:u.SPEC_FIELD_MOVE,payload:{from:i.id,to:e.id}});break;default:throw new Error("Field dragged from unregistered source type to EncodingShelf")}}}},v=function(e,t){return{connectDropTarget:e.dropTarget(),isOver:t.isOver(),item:t.getItem()}};t.EncodingShelf=s.DropTarget(c.DraggableType.FIELD,y,v)(a(g,p))},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(225),s=n(289),l=n(689),u=n(262),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){var e=this.props,t=e.shelfId,n=e.handleAction,r=e.fieldDef,o=u.getFieldPropertyGroupIndex(t,r),s=o?Object.keys(o):void 0;return i.createElement("div",{styleName:"field-customizer"},s&&i.createElement(a.Tabs,null,i.createElement(a.TabList,null,s.map(function(e,t){return i.createElement(a.Tab,{key:"tab"+t},e)})),i.createElement("div",null,s.map(function(e,s){var u=o[e];return i.createElement(a.TabPanel,{key:"tabPanel"+e+s},u.map(function(o){var a=o.prop,u=o.nestedProp;return i.createElement(l.PropertyEditor,{key:a+"_"+u+s,prop:a,nestedProp:u,shelfId:t,fieldDef:r,handleAction:n,propTab:e})}))}))))},t}(i.PureComponent);t.FieldCustomizerBase=c,t.FieldCustomizer=o(c,s)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(6),o=n(0),a=n(8),s=n(19),l=n(64),u=n(20),c=n(12),d=n(12),f=n(58),p=n(690),h=n(287),m=n(685),g=n(688),y=function(e){function t(t){var n=e.call(this,t)||this;return n.onClear=n.onClear.bind(n),n}return r(t,e),t.prototype.render=function(){var e=this.props,t=e.specPreview,n=e.spec,r=this.props.config.wildcards,i=(t||n).anyEncodings,a=["x","y"].map(this.encodingShelf,this),s=["row","column"].map(this.encodingShelf,this),l=["size","color","shape","detail","text"].map(this.encodingShelf,this),u="disabled"!==r&&o.createElement("div",{styleName:"shelf-group"},o.createElement("h3",null,"Wildcard Shelves"),i.map(function(e,t){return t}).concat([-1]).map(this.wildcardShelf,this));return o.createElement("div",{className:"pane",styleName:"encoding-pane"},o.createElement("a",{className:"right",onClick:this.onClear},o.createElement("i",{className:"fa fa-eraser"})," ","Clear"),o.createElement("h2",null,"Encoding",t&&" Preview"),o.createElement("div",{styleName:"shelf-group"},a),o.createElement("div",{styleName:"shelf-group"},o.createElement("div",{className:"right"},this.markPicker()),o.createElement("h3",null,"Mark"),l),o.createElement("div",{styleName:"shelf-group"},o.createElement("h3",null,"Facet"),s),u,o.createElement("div",{styleName:"shelf-group"},o.createElement("h3",null,"Filter"),this.filterPane()))},t.prototype.encodingShelf=function(e){var t=this.props,n=t.handleAction,r=t.spec,i=t.specPreview,a=t.schema,s=(i||r).encoding;return o.createElement(m.EncodingShelf,{key:e,id:{channel:e},fieldDef:s[e],schema:a,handleAction:n})},t.prototype.markPicker=function(){var e=this.props,t=e.handleAction,n=e.spec,r=e.specPreview,i=(r||n).mark;return o.createElement(g.MarkPicker,{mark:i,handleAction:t})},t.prototype.wildcardShelf=function(e){var t=this.props,n=t.handleAction,r=t.spec,a=t.specPreview,s=t.schema,l=(a||r).anyEncodings,u={channel:i.SHORT_WILDCARD,index:e};return o.createElement(m.EncodingShelf,{key:e,id:u,schema:s,fieldDef:l[e],handleAction:n})},t.prototype.filterPane=function(){var e=this.props,t=e.filters,n=e.schema,r=e.handleAction;return o.createElement(p.FilterPane,{filters:t,schema:n,handleAction:r})},t.prototype.onClear=function(){this.props.handleAction({type:u.SPEC_CLEAR})},t}(o.PureComponent);t.EncodingPane=s.connect(function(e){e.undoable.present;return{spec:f.selectShelfSpec(e),filters:f.selectFilters(e),schema:c.selectDataset(e).schema,fieldDefs:d.selectSchemaFieldDefs(e),specPreview:c.selectShelfPreview(e).spec,config:c.selectConfig(e)}},l.createDispatchHandler())(a(y,h))},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(6),o=n(0),a=n(8),s=n(34),l=n(291),u=n(15),c=[i.SHORT_WILDCARD].concat(s.PRIMITIVE_MARKS),d=c.map(function(e){return o.createElement("option",{key:e,value:e},e===i.SHORT_WILDCARD?"auto":e)}),f=function(e){function t(t){var n=e.call(this,t)||this;return n.onMarkChange=n.onMarkChange.bind(n),n}return r(t,e),t.prototype.render=function(){var e=this.props.mark;return o.createElement("select",{styleName:i.isWildcard(e)?"mark-picker-any":"mark-picker",value:e,onChange:this.onMarkChange},d)},t.prototype.onMarkChange=function(e){this.props.handleAction({type:u.SPEC_MARK_CHANGE_TYPE,payload:e.target.value})},t}(o.PureComponent);t.MarkPickerBase=f,t.MarkPicker=a(f,l)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(31),o=n(0),a=n(8),s=n(544),l=n(583),u=n(20),c=n(57),d=n(262),f=n(292),p=function(e){function t(t){var n=e.call(this,t)||this;return n.changeFieldProperty=n.changeFieldProperty.bind(n),n.changeFieldProperty=l.debounce(500,n.changeFieldProperty),n}return r(t,e),t.prototype.render=function(){var e=this.props,t=e.prop,n=e.nestedProp,r=e.propTab,i=e.shelfId,a=e.fieldDef;if(!c.isWildcardChannelId(i)){var l=d.generatePropertyEditorSchema(t,n,r,a,i.channel),u=l.schema,f=l.uiSchema,p=d.generateFormData(i,a);return o.createElement("div",{styleName:"property-editor"},o.createElement(s.default,{schema:u,uiSchema:f,formData:p,onChange:this.changeFieldProperty},o.createElement("button",{type:"submit",style:{display:"none"}},"Submit")))}},t.prototype.changeFieldProperty=function(e){var t=this.props,n=t.prop,r=t.nestedProp,i=t.shelfId,o=t.handleAction,a=this.parseFormDataResult(e.formData[Object.keys(e.formData)[0]]);o(r?{type:u.SPEC_FIELD_NESTED_PROP_CHANGE,payload:{shelfId:i,prop:n,nestedProp:r,value:a}}:{type:u.SPEC_FIELD_PROP_CHANGE,payload:{shelfId:i,prop:n,value:a}})},t.prototype.parseFormDataResult=function(e){var t=this.props,n=t.fieldDef,r=t.prop,o=t.nestedProp;if(""!==e){if("scale"===r){if("range"===o){var a=e.split(/\s*,\s*/);if(d.isContinuous(n)&&2!==a.length)throw new Error("Invalid format for range. Must follow format: Min Number, Max Number");return""===e?void 0:a}if("domain"===o){var s=e.split(/\s*,\s*/);if(n.type===i.ExpandedType.QUANTITATIVE&&2!==s.length)throw new Error("Invalid format for domain. Must follow format: Min Number, Max Number");if(n.type===i.ExpandedType.TEMPORAL)throw new Error("Voyager does not currently support temporal domain values");return""===e?void 0:s}}return""===e?void 0:e}},t}(o.PureComponent);t.PropertyEditorBase=p,t.PropertyEditor=a(p,f)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(31),o=n(6),a=n(0),s=n(8),l=n(119),u=n(109),c=n(23),d=n(15),f=n(39),p=n(46),h=n(261),m=n(118),g=n(294),y=n(691),v=n(692),b=function(e){function t(t){var n=e.call(this,t)||this;return n.filterModifyTimeUnit=n.filterModifyTimeUnit.bind(n),n}return r(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.filters,r=t.connectDropTarget,i=n.map(function(t,n){return e.renderFilterShelf(t,n)});return r(a.createElement("div",{styleName:"filter-pane"},i,this.renderFieldPlaceholder()))},t.prototype.filterRemove=function(e){(0,this.props.handleAction)({type:d.FILTER_REMOVE,payload:{index:e}})},t.prototype.filterModifyTimeUnit=function(e,t){var n=this.props,r=n.handleAction,i=n.schema,o=n.filters,a=i.domain({field:o[t].field});"-"===e&&(e=void 0),r({type:d.FILTER_MODIFY_TIME_UNIT,payload:{index:t,domain:a,timeUnit:e}})},t.prototype.renderFilterShelf=function(e,t){var n,r=this,o=this.props,s=o.handleAction,l=o.schema,c=l.domain({field:e.field}),d=e.field,f=e.timeUnit,g=l.fieldSchema(e.field),b={fn:f,field:d,type:g.vlType},_=function(e){r.filterModifyTimeUnit(e,t)},E=b.type===i.ExpandedType.TEMPORAL&&a.createElement(h.FunctionPicker,{fieldDefParts:{fn:f,type:i.ExpandedType.TEMPORAL},onFunctionChange:_});return u.isRangeFilter(e)?(b.type===i.ExpandedType.TEMPORAL&&(c=p.getDefaultTimeRange(c,f)),n=a.createElement(v.RangeFilterShelf,{domain:c,filter:e,index:t,renderDateTimePicker:this.renderDateTimePicker(b.type,f),handleAction:s})):u.isOneOfFilter(e)&&(f&&(c=p.getDefaultList(f)),n=a.createElement(y.OneOfFilterShelf,{domain:c,index:t,filter:e,handleAction:s})),a.createElement("div",{styleName:"filter-shelf",key:t},a.createElement(m.Field,{draggable:!1,fieldDef:b,caretShow:!0,isPill:!0,onRemove:this.filterRemove.bind(this,t),popupComponent:E}),n)},t.prototype.renderFieldPlaceholder=function(){var e,t,n=this.props,r=n.item,i=n.isOver,o=n.canDrop;return r&&!o?(e="placeholder-disabled",t="Cannot drop a field here"):(e=i?"placeholder-over":r?"placeholder-active":"placeholder",t="Drop a field here"),a.createElement("span",{styleName:e},t)},t.prototype.renderDateTimePicker=function(e,t){if(!t){if(e===i.ExpandedType.QUANTITATIVE)return!1;if(e===i.ExpandedType.TEMPORAL)return!0}switch(t){case c.TimeUnit.YEAR:case c.TimeUnit.MONTH:case c.TimeUnit.DAY:case c.TimeUnit.DATE:case c.TimeUnit.HOURS:case c.TimeUnit.MINUTES:case c.TimeUnit.SECONDS:case c.TimeUnit.MILLISECONDS:return!1;case c.TimeUnit.YEARMONTHDATE:return!0;default:throw new Error(t+" is not supported")}},t}(a.PureComponent),_={drop:function(e,t){if(!t.didDrop()){var n=t.getItem().filter;if(o.isWildcard(n.field))throw window.alert("Cannot add wildcard filter"),new Error("Cannot add wildcard filter");if(p.filterHasField(e.filters,n.field))return void window.alert("Cannot add more than one filter of the same field");e.handleAction({type:d.FILTER_ADD,payload:{filter:n}})}},canDrop:function(e,t){var n=t.getItem().fieldDef;return!o.isWildcard(n.field)&&"*"!==n.field}},E=function(e,t){return{connectDropTarget:e.dropTarget(),isOver:t.isOver(),item:t.getItem(),canDrop:t.canDrop()}};t.FilterPane=l.DropTarget(f.DraggableType.FIELD,_,E)(s(b,g))},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(15),s=n(65),l=n(295),u=function(e){function t(t){var n=e.call(this,t)||this;return n.state={hideSearchBar:!0},n}return r(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.domain,r=t.filter,o=t.index,a=n.map(function(t){return i.createElement("div",{key:t,className:"option-div",styleName:"option-row"},i.createElement("label",null,i.createElement("input",{name:o.toString(),value:t,type:"checkbox",checked:-1!==r.oneOf.indexOf(t),onChange:e.toggleCheckbox.bind(e,t)})," ",""+t),i.createElement("span",{onClick:e.onSelectOne.bind(e,t),styleName:"keep-only"},"Keep Only"))});return i.createElement("div",{id:o.toString()},i.createElement("div",{styleName:"below-header"},i.createElement("span",null,i.createElement("a",{styleName:"select-all",onClick:this.onSelectAll.bind(this)},"Select All")," /",i.createElement("a",{styleName:"clear-all",onClick:this.onClearAll.bind(this)},"Clear All")),this.state.hideSearchBar?null:i.createElement("input",{type:"text",onChange:this.onSearch.bind(this),autoFocus:!0}),i.createElement("a",{styleName:"search",onClick:this.onClickSearch.bind(this)},i.createElement("i",{className:"fa fa-search"}))),a)},t.prototype.filterModifyOneOf=function(e,t){(0,this.props.handleAction)({type:a.FILTER_MODIFY_ONE_OF,payload:{index:e,oneOf:t}})},t.prototype.toggleCheckbox=function(e){var t,n=this.props.filter.oneOf,r=n.indexOf(e);t=-1===r?s.insertItemToArray(n,n.length,e):s.removeItemFromArray(n,r).array,this.filterModifyOneOf(this.props.index,t)},t.prototype.onSelectOne=function(e){var t=this.props.index;this.filterModifyOneOf(t,[e])},t.prototype.onSelectAll=function(){var e=this.props,t=e.domain,n=e.index;this.filterModifyOneOf(n,t.slice())},t.prototype.onClearAll=function(){var e=this.props.index;this.filterModifyOneOf(e,[])},t.prototype.onClickSearch=function(){if(!this.state.hideSearchBar){var e=this.getDivs();Array.prototype.forEach.call(e,function(e){e.style.display="block"})}this.setState({hideSearchBar:!this.state.hideSearchBar})},t.prototype.onSearch=function(e){var t=this.getDivs();Array.prototype.forEach.call(t,function(t){-1===t.childNodes[0].childNodes[0].value.toLowerCase().indexOf(e.target.value.toLowerCase().trim())?t.style.display="none":t.style.display="block"})},t.prototype.getDivs=function(){return document.getElementById(this.props.index.toString()).getElementsByClassName("option-div")},t}(i.PureComponent);t.OneOfFilterShelfBase=u,t.OneOfFilterShelf=o(u,l)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(495),o=n(0),a=n(8),s=n(508),l=n(94),u=n(23),c=n(15),d=n(46),f=n(296),p=function(e){function t(t){var n=e.call(this,t)||this;return n.state={minDateTimePickerOpen:!1,maxDateTimePickerOpen:!1},n.filterModifyExtent=n.filterModifyExtent.bind(n),n.filterModifyMaxBound=n.filterModifyMaxBound.bind(n),n.filterModifyMinBound=n.filterModifyMinBound.bind(n),n.toggleMinDateTimePicker=n.toggleMinDateTimePicker.bind(n),n.toggleMaxDateTimePicker=n.toggleMaxDateTimePicker.bind(n),n}return r(t,e),t.prototype.render=function(){var e,t,n,r,a,s,l=this.props,u=l.filter,c=l.domain,f=l.renderDateTimePicker,p=i.createSliderWithTooltip,h=p(i.Range);return f?(e=this.renderDateTimePicker(new Date(d.convertToTimestamp(u.range[0])),"min"),t=this.renderDateTimePicker(new Date(d.convertToTimestamp(u.range[1])),"max"),n=d.convertToTimestamp(u.range[0]),r=d.convertToTimestamp(u.range[1]),a=Math.floor(d.convertToTimestamp(c[0])),s=Math.ceil(d.convertToTimestamp(c[1]))):(e=this.renderNumberInput("min"),t=this.renderNumberInput("max"),n=u.range[0],r=u.range[1],a=Math.floor(Number(c[0])),s=Math.ceil(Number(c[1]))),o.createElement("div",{styleName:"range-filter-pane"},o.createElement("div",null,o.createElement("div",{styleName:"bound"},e),o.createElement("div",{styleName:"bound"},t)),o.createElement(h,{allowCross:!1,defaultValue:[n,r],min:a,max:s,onAfterChange:this.filterModifyExtent.bind(this),tipFormatter:this.getFormat(f,u.timeUnit),step:this.getStep(u.timeUnit)}))},t.prototype.filterModifyExtent=function(e){var t;if(t=this.props.renderDateTimePicker?[d.convertToDateTimeObject(e[0]),d.convertToDateTimeObject(e[1])]:e,t[0]>t[1])return void window.alert("Invalid bound");var n=this.props,r=n.handleAction,i=n.index;r({type:c.FILTER_MODIFY_EXTENT,payload:{index:i,range:t}})},t.prototype.filterModifyMaxBound=function(e){var t;t=e.hasOwnProperty("target")?Number(e.target.value):e;var n=this.props,r=n.handleAction,i=n.index;if(this.props.renderDateTimePicker&&(t=d.convertToDateTimeObject(t)),tthis.props.filter.range[1])return void window.alert("Minimum bound cannot be greater than maximum bound");r({type:c.FILTER_MODIFY_MIN_BOUND,payload:{index:i,minBound:t}})},t.prototype.renderNumberInput=function(e){var t,n,r=this.props.filter;return"min"===e?(t=this.filterModifyMinBound,n=r.range[0]):"max"===e&&(t=this.filterModifyMaxBound,n=r.range[1]),o.createElement("div",null,e,":",o.createElement("a",{onClick:this.focusInput.bind(this,r.field+"_"+e)},o.createElement("i",{className:"fa fa-pencil"})),o.createElement("input",{id:r.field+"_"+e,type:"number",value:n.toString(),onChange:t}))},t.prototype.renderDateTimePicker=function(e,t){var n,r,i;return"min"===t?(n=this.filterModifyMinBound,r=this.state.minDateTimePickerOpen,i=this.toggleMinDateTimePicker):"max"===t&&(n=this.filterModifyMaxBound,r=this.state.maxDateTimePickerOpen,i=this.toggleMaxDateTimePicker),o.createElement("div",null,o.createElement(l,{attachment:"bottom center"},o.createElement("div",{styleName:"bound"},t,":",o.createElement("a",{onClick:i},o.createElement("i",{className:"fa fa-pencil"})),e.toString()),r&&o.createElement("div",{styleName:"date-time-picker-wrapper"},o.createElement(s,{defaultValue:e,timeFormat:this.showTime(this.props.filter.timeUnit),open:!1,onChange:n,disableOnClickOutside:!1}))))},t.prototype.focusInput=function(e){document.getElementById(e).focus()},t.prototype.toggleMinDateTimePicker=function(){this.setState({minDateTimePickerOpen:!this.state.minDateTimePickerOpen})},t.prototype.toggleMaxDateTimePicker=function(){this.setState({maxDateTimePickerOpen:!this.state.maxDateTimePickerOpen})},t.prototype.showTime=function(e){switch(e){case void 0:case u.TimeUnit.YEAR:case u.TimeUnit.MONTH:case u.TimeUnit.DAY:case u.TimeUnit.DATE:case u.TimeUnit.HOURS:case u.TimeUnit.MINUTES:case u.TimeUnit.SECONDS:case u.TimeUnit.MILLISECONDS:return!0;case u.TimeUnit.YEARMONTHDATE:return!1;default:throw new Error(e+" is not supported")}},t.prototype.getFormat=function(e,t){if(!t)return e?function(e){return new Date(e).toString()}:void 0;switch(t){case u.TimeUnit.YEAR:case u.TimeUnit.MONTH:case u.TimeUnit.DAY:case u.TimeUnit.DATE:case u.TimeUnit.HOURS:case u.TimeUnit.MINUTES:case u.TimeUnit.SECONDS:case u.TimeUnit.MILLISECONDS:return;case u.TimeUnit.YEARMONTHDATE:return function(e){return new Date(e).toString()};default:throw new Error(t+" is not supported")}},t.prototype.getStep=function(e){switch(e){case void 0:case u.TimeUnit.YEAR:case u.TimeUnit.MONTH:case u.TimeUnit.DAY:case u.TimeUnit.DATE:case u.TimeUnit.HOURS:case u.TimeUnit.MINUTES:case u.TimeUnit.SECONDS:case u.TimeUnit.MILLISECONDS:return 1;case u.TimeUnit.YEARMONTHDATE:return 864e5;default:throw new Error(e+" is not supported")}},t}(o.PureComponent);t.RangeFilterShelfBase=p,t.RangeFilterShelf=a(p,f)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(475),o=n(0),a=n(8),s=n(514),l=n(707),u=n(175),c=n(297),d=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return o.createElement("div",{styleName:"footer"},o.createElement("a",{onClick:this.exportLogs},"Download logs"))},t.prototype.exportLogs=function(){var e=l.constructLogString(u.actionLogs.getLog().actions),t=i.unparse(e),n="Logs_voyager_"+new Date+".csv";s(t,n)},t}(o.PureComponent);t.FooterBase=d,t.Footer=a(d,c)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(681),s=n(298),l=n(696),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return i.createElement("div",{styleName:"controls"},i.createElement(a.BookmarkPane,null),i.createElement(l.UndoRedo,null))},t}(i.PureComponent);t.ControlsBase=u,t.Controls=o(u,s)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(19),s=n(728),l=n(729),u=n(66),c=n(694),d=n(299),f=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){var e=this.props.data;return i.createElement("div",{styleName:"header"},i.createElement("img",{styleName:"voyager-logo",src:l}),e&&i.createElement(c.Controls,null),i.createElement("a",{styleName:"idl-logo",onClick:this.openLink},i.createElement("img",{src:s})))},t.prototype.openLink=function(){window.open("https://idl.cs.washington.edu/")},t}(i.PureComponent);t.HeaderBase=f,t.Header=a.connect(function(e){return{data:u.selectData(e)}})(o(f,d))},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(19),a=n(258),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){var e=this.props,t=e.canUndo,n=e.canRedo,r=e.onUndo,o=e.onRedo;return i.createElement("div",null,i.createElement("button",{onClick:r,disabled:!t},i.createElement("i",{className:"fa fa-undo"})," Undo"),i.createElement("button",{onClick:o,disabled:!n},i.createElement("i",{className:"fa fa-repeat"})," Redo"))},t}(i.PureComponent);t.UndoRedo=o.connect(function(e){return{canUndo:e.undoable.past.length>0,canRedo:e.undoable.future.length>0}},function(e){return{onUndo:function(){e({type:a.UNDO})},onRedo:function(){e({type:a.REDO})}}})(s)},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(19),s=n(12),l=n(260),u=n(300),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return this.props.config.showDataSourceSelector?i.createElement("div",{className:"pane",styleName:"load-data-pane"},"Please load a dataset"," ",i.createElement(l.DataSelector,{title:"Load"})):i.createElement("div",{className:"pane",styleName:"load-data-pane"},"Please load a dataset. (For the Electron app, please use the menu bar.)")},t}(i.PureComponent);t.LoadDataBase=c,t.LoadData=a.connect(function(e){return{config:s.selectConfig(e)}})(o(c,u))},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(19),s=n(90),l=n(64),u=n(12),c=n(301),d=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){var e=this.props.log.warnings,t=this.props.log.errors,n=e.warn.length>0||e.debug.length>0||e.info.length>0?i.createElement("div",{styleName:"warning-pane"},i.createElement("a",{styleName:"close",onClick:this.closeWarnings.bind(this)},"x"),i.createElement("ul",null,this.returnLevelWarnings(e,"warn"),this.returnLevelWarnings(e,"info"),this.returnLevelWarnings(e,"debug"))):null,r=t.length>0?i.createElement("div",{styleName:"error-pane"},i.createElement("a",{styleName:"close",onClick:this.closeErrors.bind(this)},"x"),i.createElement("ul",null,t.map(function(e,t){return i.createElement("li",{key:t},e)}))):null;return i.createElement("div",null,n,r)},t.prototype.closeWarnings=function(){this.props.handleAction({type:s.LOG_WARNINGS_CLEAR})},t.prototype.closeErrors=function(){this.props.handleAction({type:s.LOG_ERRORS_CLEAR})},t.prototype.returnLevelWarnings=function(e,t){return e[t].map(function(e,n){return i.createElement("li",{key:n},"[",t.toUpperCase(),"] ",e)})},t}(i.PureComponent);t.LogPaneBase=d,t.LogPane=a.connect(function(e){return{log:u.selectLog(e)}},l.createDispatchHandler())(o(d,c))},function(e,t,n){"use strict";var r=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(t,"__esModule",{value:!0});var i=n(0),o=n(8),a=n(94),s=n(115),l=n(303),u=function(e){function t(t){var n=e.call(this,t)||this;return n.bookmarkHandler=function(e){n.bookmarkPopup=e},n.alertHandler=function(e){n.bookmarkDialog=e},n.state={openDialog:!1},n.onBookmarkRemove=n.onBookmarkRemove.bind(n),n.onBookmarkAdd=n.onBookmarkAdd.bind(n),n.onBookmarkClick=n.onBookmarkClick.bind(n),n.onKeepBookmark=n.onKeepBookmark.bind(n),n}return r(t,e),t.prototype.componentWillUpdate=function(e,t){t&&(t.openDialog?document.addEventListener("click",this.handleClickOutside.bind(this),!0):this.state.openDialog&&document.removeEventListener("click",this.handleClickOutside.bind(this),!0))},t.prototype.render=function(){var e=this.isBookmarked()?"bookmark-command-selected":"command";return i.createElement(a,{attachment:"top right",targetAttachment:"bottom left"},i.createElement("i",{title:"Bookmark",className:"fa fa-bookmark",styleName:e,onClick:this.onBookmarkClick}),this.state.openDialog&&i.createElement("div",{styleName:"bookmark-alert",ref:this.alertHandler},i.createElement("div",{ref:this.bookmarkHandler},"Remove Bookmark?"),i.createElement("small",null,"Your notes will be lost."),i.createElement("div",null,i.createElement("a",{onClick:this.onBookmarkRemove},i.createElement("span",{styleName:"fa-span"},i.createElement("i",{className:"fa fa-trash-o"})," Remove it  ")),i.createElement("a",{onClick:this.onKeepBookmark},i.createElement("span",{styleName:"fa-span"},i.createElement("i",{className:"fa fa-bookmark"})," Keep it  ")))))},t.prototype.onKeepBookmark=function(){this.setState({openDialog:!1})},t.prototype.isBookmarked=function(){var e=this.props,t=e.bookmark,n=e.plot;return!!t.dict[JSON.stringify(n.spec)]},t.prototype.onBookmarkClick=function(){this.isBookmarked()?this.setState({openDialog:!this.state.openDialog}):this.onBookmarkAdd()},t.prototype.onBookmarkRemove=function(){this.setState({openDialog:!1}),this.props.handleAction({type:s.BOOKMARK_REMOVE_PLOT,payload:{spec:this.props.plot.spec}})},t.prototype.onBookmarkAdd=function(){this.props.handleAction({type:s.BOOKMARK_ADD_PLOT,payload:{plot:this.props.plot}})},t.prototype.handleClickOutside=function(e){this.bookmarkPopup&&this.bookmarkDialog&&(this.bookmarkDialog.contains(e.target)||this.bookmarkPopup.contains(e.target))||this.setState({openDialog:!1})},t}(i.PureComponent);t.BookmarkButtonBase=u,t.BookmarkButton=o(u,l)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(90),i=function(){function e(e){this.handleAction=e}return e.prototype.level=function(){return this},e.prototype.error=function(){for(var e=[],t=0;t0)&&i.createElement("div",{styleName:"related-views-subpane",key:t},i.createElement("div",null,i.createElement("h3",null,a),"histograms"!==t&&i.createElement("i",{title:"Specify",styleName:"command",className:"fa fa-server",onClick:e.onSpecify.bind(e,t),onMouseEnter:e.onPreviewMouseEnter.bind(e,t),onMouseLeave:e.onPreviewMouseLeave.bind(e,t)})),i.createElement(h.PlotList,{handleAction:r,bookmark:n,resultType:t,result:s}))});return i.createElement("div",null,a)},t.prototype.onSpecify=function(e){var t=this.props,n=t.handleAction,r=t.results,i=r[e].query;n({type:u.SHELF_LOAD_QUERY,payload:{query:i}})},t.prototype.onPreviewMouseEnter=function(e){var t=this.props,n=t.handleAction,r=t.results,i=r[e].query;n({type:l.SHELF_PREVIEW_QUERY,payload:{query:i}})},t.prototype.onPreviewMouseLeave=function(e){(0,this.props.handleAction)({type:l.SHELF_PREVIEW_DISABLE})},t}(i.PureComponent);t.RelatedViewsBase=g,t.RelatedViews=a.connect(function(e){return{results:c.RESULT_TYPES.reduce(function(t,n){return t[n]=p.selectResult[n](e),t},{}),bookmark:f.selectBookmark(e)}},s.createDispatchHandler())(o(g,m))},function(e,t,n){"use strict";function r(e,t,n){return new E(e,t,n)}var i=this&&this.__assign||Object.assign||function(e){for(var t,n=1,r=arguments.length;n0?l.modifyItemInArray(e,c,r(f.concat(h))):e;case s.CUSTOM_WILDCARD_REMOVE_FIELD:var m=t.payload,c=m.index,g=m.field,f=e[c].fields,y=f.filter(function(e){return e!==g});return l.modifyItemInArray(e,c,r(y));case s.CUSTOM_WILDCARD_MODIFY_DESCRIPTION:var v=t.payload,c=v.index,b=v.description,_=function(e){return o({},e,{description:b})};return l.modifyItemInArray(e,c,_)}return e}var o=this&&this.__assign||Object.assign||function(e){for(var t,n=1,r=arguments.length;n -1;\n}\nexports.contains = contains;\n/** Returns the array without the elements in item */\nfunction without(array, excludedItems) {\n return array.filter(function (item) { return !contains(excludedItems, item); });\n}\nexports.without = without;\nfunction union(array, other) {\n return array.concat(without(other, array));\n}\nexports.union = union;\n/**\n * Returns true if any item returns true.\n */\nfunction some(arr, f) {\n var i = 0;\n for (var k = 0; k < arr.length; k++) {\n if (f(arr[k], k, i++)) {\n return true;\n }\n }\n return false;\n}\nexports.some = some;\n/**\n * Returns true if all items return true.\n */\nfunction every(arr, f) {\n var i = 0;\n for (var k = 0; k < arr.length; k++) {\n if (!f(arr[k], k, i++)) {\n return false;\n }\n }\n return true;\n}\nexports.every = every;\nfunction flatten(arrays) {\n return [].concat.apply([], arrays);\n}\nexports.flatten = flatten;\n/**\n * recursively merges src into dest\n */\nfunction mergeDeep(dest) {\n var src = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n src[_i - 1] = arguments[_i];\n }\n for (var _a = 0, src_1 = src; _a < src_1.length; _a++) {\n var s = src_1[_a];\n dest = deepMerge_(dest, s);\n }\n return dest;\n}\nexports.mergeDeep = mergeDeep;\n// recursively merges src into dest\nfunction deepMerge_(dest, src) {\n if (typeof src !== 'object' || src === null) {\n return dest;\n }\n for (var p in src) {\n if (!src.hasOwnProperty(p)) {\n continue;\n }\n if (src[p] === undefined) {\n continue;\n }\n if (typeof src[p] !== 'object' || vega_util_1.isArray(src[p]) || src[p] === null) {\n dest[p] = src[p];\n }\n else if (typeof dest[p] !== 'object' || dest[p] === null) {\n dest[p] = mergeDeep(vega_util_1.isArray(src[p].constructor) ? [] : {}, src[p]);\n }\n else {\n mergeDeep(dest[p], src[p]);\n }\n }\n return dest;\n}\nfunction unique(values, f) {\n var results = [];\n var u = {};\n var v;\n for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {\n var val = values_1[_i];\n v = f(val);\n if (v in u) {\n continue;\n }\n u[v] = 1;\n results.push(val);\n }\n return results;\n}\nexports.unique = unique;\n/**\n * Returns true if the two dictionaries disagree. Applies only to defined values.\n */\nfunction differ(dict, other) {\n for (var key in dict) {\n if (dict.hasOwnProperty(key)) {\n if (other[key] && dict[key] && other[key] !== dict[key]) {\n return true;\n }\n }\n }\n return false;\n}\nexports.differ = differ;\nfunction hasIntersection(a, b) {\n for (var key in a) {\n if (key in b) {\n return true;\n }\n }\n return false;\n}\nexports.hasIntersection = hasIntersection;\nfunction differArray(array, other) {\n if (array.length !== other.length) {\n return true;\n }\n array.sort();\n other.sort();\n for (var i = 0; i < array.length; i++) {\n if (other[i] !== array[i]) {\n return true;\n }\n }\n return false;\n}\nexports.differArray = differArray;\nexports.keys = Object.keys;\nfunction vals(x) {\n var _vals = [];\n for (var k in x) {\n if (x.hasOwnProperty(k)) {\n _vals.push(x[k]);\n }\n }\n return _vals;\n}\nexports.vals = vals;\nfunction flagKeys(f) {\n return exports.keys(f);\n}\nexports.flagKeys = flagKeys;\nfunction duplicate(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\nexports.duplicate = duplicate;\nfunction isBoolean(b) {\n return b === true || b === false;\n}\nexports.isBoolean = isBoolean;\n/**\n * Convert a string into a valid variable name\n */\nfunction varName(s) {\n // Replace non-alphanumeric characters (anything besides a-zA-Z0-9_) with _\n var alphanumericS = s.replace(/\\W/g, '_');\n // Add _ if the string has leading numbers.\n return (s.match(/^\\d+/) ? '_' : '') + alphanumericS;\n}\nexports.varName = varName;\nfunction logicalExpr(op, cb) {\n if (logical_1.isLogicalNot(op)) {\n return '!(' + logicalExpr(op.not, cb) + ')';\n }\n else if (logical_1.isLogicalAnd(op)) {\n return '(' + op.and.map(function (and) { return logicalExpr(and, cb); }).join(') && (') + ')';\n }\n else if (logical_1.isLogicalOr(op)) {\n return '(' + op.or.map(function (or) { return logicalExpr(or, cb); }).join(') || (') + ')';\n }\n else {\n return cb(op);\n }\n}\nexports.logicalExpr = logicalExpr;\n/**\n * Delete nested property of an object, and delete the ancestors of the property if they become empty.\n */\nfunction deleteNestedProperty(obj, orderedProps) {\n var isEmpty = true;\n while (orderedProps.length > 0 && isEmpty) {\n var o = obj;\n for (var i = 0; i < orderedProps.length - 1; i++) {\n o = o[orderedProps[i]];\n }\n delete o[orderedProps.pop()];\n if (exports.keys(o).length !== 0) {\n isEmpty = false;\n }\n }\n}\nexports.deleteNestedProperty = deleteNestedProperty;\n\n\n/***/ }),\n/* 3 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************************!*\\\n !*** ./~/vega-lite/build/src/channel.js ***!\n \\******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/*\n * Constants and utilities for encoding channels (Visual variables)\n * such as 'x', 'y', 'color'.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nvar Channel;\n(function (Channel) {\n // Facet\n Channel.ROW = 'row';\n Channel.COLUMN = 'column';\n // Position\n Channel.X = 'x';\n Channel.Y = 'y';\n Channel.X2 = 'x2';\n Channel.Y2 = 'y2';\n // Mark property with scale\n Channel.COLOR = 'color';\n Channel.SHAPE = 'shape';\n Channel.SIZE = 'size';\n Channel.OPACITY = 'opacity';\n // Non-scale channel\n Channel.TEXT = 'text';\n Channel.ORDER = 'order';\n Channel.DETAIL = 'detail';\n Channel.TOOLTIP = 'tooltip';\n})(Channel = exports.Channel || (exports.Channel = {}));\nexports.X = Channel.X;\nexports.Y = Channel.Y;\nexports.X2 = Channel.X2;\nexports.Y2 = Channel.Y2;\nexports.ROW = Channel.ROW;\nexports.COLUMN = Channel.COLUMN;\nexports.SHAPE = Channel.SHAPE;\nexports.SIZE = Channel.SIZE;\nexports.COLOR = Channel.COLOR;\nexports.TEXT = Channel.TEXT;\nexports.DETAIL = Channel.DETAIL;\nexports.ORDER = Channel.ORDER;\nexports.OPACITY = Channel.OPACITY;\nexports.TOOLTIP = Channel.TOOLTIP;\nvar UNIT_CHANNEL_INDEX = {\n x: 1,\n y: 1,\n x2: 1,\n y2: 1,\n size: 1,\n shape: 1,\n color: 1,\n order: 1,\n opacity: 1,\n text: 1,\n detail: 1,\n tooltip: 1\n};\nvar FACET_CHANNEL_INDEX = {\n row: 1,\n column: 1\n};\nvar CHANNEL_INDEX = tslib_1.__assign({}, UNIT_CHANNEL_INDEX, FACET_CHANNEL_INDEX);\nexports.CHANNELS = util_1.flagKeys(CHANNEL_INDEX);\nvar _o = CHANNEL_INDEX.order, _d = CHANNEL_INDEX.detail, SINGLE_DEF_CHANNEL_INDEX = tslib_1.__rest(CHANNEL_INDEX, [\"order\", \"detail\"]);\n/**\n * Channels that cannot have an array of channelDef.\n * model.fieldDef, getFieldDef only work for these channels.\n *\n * (The only two channels that can have an array of channelDefs are \"detail\" and \"order\".\n * Since there can be multiple fieldDefs for detail and order, getFieldDef/model.fieldDef\n * are not applicable for them. Similarly, selection projecttion won't work with \"detail\" and \"order\".)\n */\nexports.SINGLE_DEF_CHANNELS = util_1.flagKeys(SINGLE_DEF_CHANNEL_INDEX);\nfunction isChannel(str) {\n return !!CHANNEL_INDEX[str];\n}\nexports.isChannel = isChannel;\n// CHANNELS without COLUMN, ROW\nexports.UNIT_CHANNELS = util_1.flagKeys(UNIT_CHANNEL_INDEX);\n// NONSPATIAL_CHANNELS = UNIT_CHANNELS without X, Y, X2, Y2;\nvar _x = UNIT_CHANNEL_INDEX.x, _y = UNIT_CHANNEL_INDEX.y, \n// x2 and y2 share the same scale as x and y\n_x2 = UNIT_CHANNEL_INDEX.x2, _y2 = UNIT_CHANNEL_INDEX.y2, \n// The rest of unit channels then have scale\nNONSPATIAL_CHANNEL_INDEX = tslib_1.__rest(UNIT_CHANNEL_INDEX, [\"x\", \"y\", \"x2\", \"y2\"]);\nexports.NONSPATIAL_CHANNELS = util_1.flagKeys(NONSPATIAL_CHANNEL_INDEX);\n// SPATIAL_SCALE_CHANNELS = X and Y;\nvar SPATIAL_SCALE_CHANNEL_INDEX = { x: 1, y: 1 };\nexports.SPATIAL_SCALE_CHANNELS = util_1.flagKeys(SPATIAL_SCALE_CHANNEL_INDEX);\n// NON_SPATIAL_SCALE_CHANNEL = SCALE_CHANNELS without X, Y\nvar \n// x2 and y2 share the same scale as x and y\n// text and tooltip has format instead of scale\n_t = NONSPATIAL_CHANNEL_INDEX.text, _tt = NONSPATIAL_CHANNEL_INDEX.tooltip, \n// detail and order have no scale\n_dd = NONSPATIAL_CHANNEL_INDEX.detail, _oo = NONSPATIAL_CHANNEL_INDEX.order, NONSPATIAL_SCALE_CHANNEL_INDEX = tslib_1.__rest(NONSPATIAL_CHANNEL_INDEX, [\"text\", \"tooltip\", \"detail\", \"order\"]);\nexports.NONSPATIAL_SCALE_CHANNELS = util_1.flagKeys(NONSPATIAL_SCALE_CHANNEL_INDEX);\n// Declare SCALE_CHANNEL_INDEX\nvar SCALE_CHANNEL_INDEX = tslib_1.__assign({}, SPATIAL_SCALE_CHANNEL_INDEX, NONSPATIAL_SCALE_CHANNEL_INDEX);\n/** List of channels with scales */\nexports.SCALE_CHANNELS = util_1.flagKeys(SCALE_CHANNEL_INDEX);\nfunction isScaleChannel(channel) {\n return !!SCALE_CHANNEL_INDEX[channel];\n}\nexports.isScaleChannel = isScaleChannel;\n/**\n * Return whether a channel supports a particular mark type.\n * @param channel channel name\n * @param mark the mark type\n * @return whether the mark supports the channel\n */\nfunction supportMark(channel, mark) {\n return mark in getSupportedMark(channel);\n}\nexports.supportMark = supportMark;\n/**\n * Return a dictionary showing whether a channel supports mark type.\n * @param channel\n * @return A dictionary mapping mark types to boolean values.\n */\nfunction getSupportedMark(channel) {\n switch (channel) {\n case exports.X:\n case exports.Y:\n case exports.COLOR:\n case exports.DETAIL:\n case exports.TOOLTIP:\n case exports.ORDER: // TODO: revise (order might not support rect, which is not stackable?)\n case exports.OPACITY:\n case exports.ROW:\n case exports.COLUMN:\n return {\n point: true, tick: true, rule: true, circle: true, square: true,\n bar: true, rect: true, line: true, area: true, text: true\n };\n case exports.X2:\n case exports.Y2:\n return {\n rule: true, bar: true, rect: true, area: true\n };\n case exports.SIZE:\n return {\n point: true, tick: true, rule: true, circle: true, square: true,\n bar: true, text: true, line: true\n };\n case exports.SHAPE:\n return { point: true };\n case exports.TEXT:\n return { text: true };\n }\n}\nexports.getSupportedMark = getSupportedMark;\nfunction rangeType(channel) {\n switch (channel) {\n case exports.X:\n case exports.Y:\n case exports.SIZE:\n case exports.OPACITY:\n // X2 and Y2 use X and Y scales, so they similarly have continuous range.\n case exports.X2:\n case exports.Y2:\n return 'continuous';\n case exports.ROW:\n case exports.COLUMN:\n case exports.SHAPE:\n // TEXT and TOOLTIP have no scale but have discrete output\n case exports.TEXT:\n case exports.TOOLTIP:\n return 'discrete';\n // Color can be either continuous or discrete, depending on scale type.\n case exports.COLOR:\n return 'flexible';\n // No scale, no range type.\n case exports.DETAIL:\n case exports.ORDER:\n return undefined;\n }\n /* istanbul ignore next: should never reach here. */\n throw new Error('getSupportedRole not implemented for ' + channel);\n}\nexports.rangeType = rangeType;\n\n\n/***/ }),\n/* 4 */\n/* exports provided: __extends, __assign, __rest, __decorate, __param, __metadata, __awaiter, __generator, __exportStar, __values, __read, __spread, __await, __asyncGenerator, __asyncDelegator, __asyncValues */\n/* all exports used */\n/*!******************************************!*\\\n !*** ./~/vega-lite/~/tslib/tslib.es6.js ***!\n \\******************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony export (immutable) */ __webpack_exports__[\"__extends\"] = __extends;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__assign\", function() { return __assign; });\n/* harmony export (immutable) */ __webpack_exports__[\"__rest\"] = __rest;\n/* harmony export (immutable) */ __webpack_exports__[\"__decorate\"] = __decorate;\n/* harmony export (immutable) */ __webpack_exports__[\"__param\"] = __param;\n/* harmony export (immutable) */ __webpack_exports__[\"__metadata\"] = __metadata;\n/* harmony export (immutable) */ __webpack_exports__[\"__awaiter\"] = __awaiter;\n/* harmony export (immutable) */ __webpack_exports__[\"__generator\"] = __generator;\n/* harmony export (immutable) */ __webpack_exports__[\"__exportStar\"] = __exportStar;\n/* harmony export (immutable) */ __webpack_exports__[\"__values\"] = __values;\n/* harmony export (immutable) */ __webpack_exports__[\"__read\"] = __read;\n/* harmony export (immutable) */ __webpack_exports__[\"__spread\"] = __spread;\n/* harmony export (immutable) */ __webpack_exports__[\"__await\"] = __await;\n/* harmony export (immutable) */ __webpack_exports__[\"__asyncGenerator\"] = __asyncGenerator;\n/* harmony export (immutable) */ __webpack_exports__[\"__asyncDelegator\"] = __asyncDelegator;\n/* harmony export (immutable) */ __webpack_exports__[\"__asyncValues\"] = __asyncValues;\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nfunction __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nfunction __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nfunction __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nfunction __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nfunction __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nfunction __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nfunction __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nfunction __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nfunction __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nfunction __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\n\n/***/ }),\n/* 5 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************!*\\\n !*** ./~/vega-lite/build/src/scale.js ***!\n \\****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar channel_1 = __webpack_require__(/*! ./channel */ 3);\nvar log = __webpack_require__(/*! ./log */ 7);\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nvar ScaleType;\n(function (ScaleType) {\n // Continuous - Quantitative\n ScaleType.LINEAR = 'linear';\n ScaleType.BIN_LINEAR = 'bin-linear';\n ScaleType.LOG = 'log';\n ScaleType.POW = 'pow';\n ScaleType.SQRT = 'sqrt';\n // Continuous - Time\n ScaleType.TIME = 'time';\n ScaleType.UTC = 'utc';\n // sequential\n ScaleType.SEQUENTIAL = 'sequential';\n // Quantile, Quantize, threshold\n ScaleType.QUANTILE = 'quantile';\n ScaleType.QUANTIZE = 'quantize';\n ScaleType.THRESHOLD = 'threshold';\n ScaleType.ORDINAL = 'ordinal';\n ScaleType.BIN_ORDINAL = 'bin-ordinal';\n ScaleType.POINT = 'point';\n ScaleType.BAND = 'band';\n})(ScaleType = exports.ScaleType || (exports.ScaleType = {}));\n/**\n * Index for scale categories -- only scale of the same categories can be merged together.\n * Current implementation is trying to be conservative and avoid merging scale type that might not work together\n */\nvar SCALE_CATEGORY_INDEX = {\n linear: 'numeric',\n log: 'numeric',\n pow: 'numeric',\n sqrt: 'numeric',\n 'bin-linear': 'bin-linear',\n time: 'time',\n utc: 'time',\n sequential: 'sequential',\n ordinal: 'ordinal',\n 'bin-ordinal': 'bin-ordinal',\n point: 'ordinal-position',\n band: 'ordinal-position'\n};\nexports.SCALE_TYPES = util_1.keys(SCALE_CATEGORY_INDEX);\n/**\n * Whether the two given scale types can be merged together.\n */\nfunction scaleCompatible(scaleType1, scaleType2) {\n var scaleCategory1 = SCALE_CATEGORY_INDEX[scaleType1];\n var scaleCategory2 = SCALE_CATEGORY_INDEX[scaleType2];\n return scaleCategory1 === scaleCategory2 ||\n (scaleCategory1 === 'ordinal-position' && scaleCategory2 === 'time') ||\n (scaleCategory2 === 'ordinal-position' && scaleCategory1 === 'time');\n}\nexports.scaleCompatible = scaleCompatible;\n/**\n * Index for scale predecence -- high score = higher priority for merging.\n */\nvar SCALE_PRECEDENCE_INDEX = {\n // numeric\n linear: 0,\n log: 1,\n pow: 1,\n sqrt: 1,\n // time\n time: 0,\n utc: 0,\n // ordinal-position -- these have higher precedence than continuous scales as they support more types of data\n point: 10,\n band: 11,\n // non grouped types\n 'bin-linear': 0,\n sequential: 0,\n ordinal: 0,\n 'bin-ordinal': 0,\n};\n/**\n * Return scale categories -- only scale of the same categories can be merged together.\n */\nfunction scaleTypePrecedence(scaleType) {\n return SCALE_PRECEDENCE_INDEX[scaleType];\n}\nexports.scaleTypePrecedence = scaleTypePrecedence;\nexports.CONTINUOUS_TO_CONTINUOUS_SCALES = ['linear', 'bin-linear', 'log', 'pow', 'sqrt', 'time', 'utc'];\nvar CONTINUOUS_TO_CONTINUOUS_INDEX = util_1.toSet(exports.CONTINUOUS_TO_CONTINUOUS_SCALES);\nexports.CONTINUOUS_DOMAIN_SCALES = exports.CONTINUOUS_TO_CONTINUOUS_SCALES.concat(['sequential' /* TODO add 'quantile', 'quantize', 'threshold'*/]);\nvar CONTINUOUS_DOMAIN_INDEX = util_1.toSet(exports.CONTINUOUS_DOMAIN_SCALES);\nexports.DISCRETE_DOMAIN_SCALES = ['ordinal', 'bin-ordinal', 'point', 'band'];\nvar DISCRETE_DOMAIN_INDEX = util_1.toSet(exports.DISCRETE_DOMAIN_SCALES);\nvar BIN_SCALES_INDEX = util_1.toSet(['bin-linear', 'bin-ordinal']);\nexports.TIME_SCALE_TYPES = ['time', 'utc'];\nfunction hasDiscreteDomain(type) {\n return type in DISCRETE_DOMAIN_INDEX;\n}\nexports.hasDiscreteDomain = hasDiscreteDomain;\nfunction isBinScale(type) {\n return type in BIN_SCALES_INDEX;\n}\nexports.isBinScale = isBinScale;\nfunction hasContinuousDomain(type) {\n return type in CONTINUOUS_DOMAIN_INDEX;\n}\nexports.hasContinuousDomain = hasContinuousDomain;\nfunction isContinuousToContinuous(type) {\n return type in CONTINUOUS_TO_CONTINUOUS_INDEX;\n}\nexports.isContinuousToContinuous = isContinuousToContinuous;\nexports.defaultScaleConfig = {\n textXRangeStep: 90,\n rangeStep: 21,\n pointPadding: 0.5,\n bandPaddingInner: 0.1,\n facetSpacing: 16,\n minBandSize: 2,\n minFontSize: 8,\n maxFontSize: 40,\n minOpacity: 0.3,\n maxOpacity: 0.8,\n // FIXME: revise if these *can* become ratios of rangeStep\n minSize: 9,\n minStrokeWidth: 1,\n maxStrokeWidth: 4\n};\nfunction isExtendedScheme(scheme) {\n return scheme && !!scheme['name'];\n}\nexports.isExtendedScheme = isExtendedScheme;\nfunction isSelectionDomain(domain) {\n return domain && domain['selection'];\n}\nexports.isSelectionDomain = isSelectionDomain;\nvar SCALE_PROPERTY_INDEX = {\n type: 1,\n domain: 1,\n range: 1,\n rangeStep: 1,\n scheme: 1,\n // Other properties\n reverse: 1,\n round: 1,\n // quantitative / time\n clamp: 1,\n nice: 1,\n // quantitative\n base: 1,\n exponent: 1,\n interpolate: 1,\n zero: 1,\n // band/point\n padding: 1,\n paddingInner: 1,\n paddingOuter: 1\n};\nexports.SCALE_PROPERTIES = util_1.flagKeys(SCALE_PROPERTY_INDEX);\nvar type = SCALE_PROPERTY_INDEX.type, domain = SCALE_PROPERTY_INDEX.domain, range = SCALE_PROPERTY_INDEX.range, rangeStep = SCALE_PROPERTY_INDEX.rangeStep, scheme = SCALE_PROPERTY_INDEX.scheme, NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTY_INDEX = tslib_1.__rest(SCALE_PROPERTY_INDEX, [\"type\", \"domain\", \"range\", \"rangeStep\", \"scheme\"]);\nexports.NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES = util_1.flagKeys(NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTY_INDEX);\nfunction scaleTypeSupportProperty(scaleType, propName) {\n switch (propName) {\n case 'type':\n case 'domain':\n case 'reverse':\n case 'range':\n return true;\n case 'scheme':\n return util_1.contains(['sequential', 'ordinal', 'bin-ordinal', 'quantile', 'quantize'], scaleType);\n case 'interpolate':\n // FIXME(https://github.com/vega/vega-lite/issues/2902) how about ordinal?\n return util_1.contains(['linear', 'bin-linear', 'pow', 'log', 'sqrt', 'utc', 'time'], scaleType);\n case 'round':\n return isContinuousToContinuous(scaleType) || scaleType === 'band' || scaleType === 'point';\n case 'rangeStep':\n case 'padding':\n case 'paddingOuter':\n return util_1.contains(['point', 'band'], scaleType);\n case 'paddingInner':\n return scaleType === 'band';\n case 'clamp':\n return isContinuousToContinuous(scaleType) || scaleType === 'sequential';\n case 'nice':\n return isContinuousToContinuous(scaleType) || scaleType === 'sequential' || scaleType === 'quantize';\n case 'exponent':\n return scaleType === 'pow';\n case 'base':\n return scaleType === 'log';\n case 'zero':\n return hasContinuousDomain(scaleType) && !util_1.contains([\n 'log',\n 'time', 'utc',\n 'bin-linear',\n 'threshold',\n 'quantile' // quantile depends on distribution so zero does not matter\n ], scaleType);\n }\n /* istanbul ignore next: should never reach here*/\n throw new Error(\"Invalid scale property \" + propName + \".\");\n}\nexports.scaleTypeSupportProperty = scaleTypeSupportProperty;\n/**\n * Returns undefined if the input channel supports the input scale property name\n */\nfunction channelScalePropertyIncompatability(channel, propName) {\n switch (propName) {\n case 'range':\n // User should not customize range for position and facet channel directly.\n if (channel === 'x' || channel === 'y') {\n return log.message.CANNOT_USE_RANGE_WITH_POSITION;\n }\n return undefined; // GOOD!\n case 'interpolate':\n case 'scheme':\n if (channel !== 'color') {\n return log.message.cannotUseScalePropertyWithNonColor(channel);\n }\n return undefined;\n case 'type':\n case 'domain':\n case 'base':\n case 'exponent':\n case 'nice':\n case 'padding':\n case 'paddingInner':\n case 'paddingOuter':\n case 'rangeStep':\n case 'reverse':\n case 'round':\n case 'clamp':\n case 'zero':\n return undefined; // GOOD!\n }\n /* istanbul ignore next: it should never reach here */\n throw new Error(\"Invalid scale property \\\"\" + propName + \"\\\".\");\n}\nexports.channelScalePropertyIncompatability = channelScalePropertyIncompatability;\nfunction channelSupportScaleType(channel, scaleType) {\n switch (channel) {\n case channel_1.Channel.X:\n case channel_1.Channel.Y:\n case channel_1.Channel.SIZE: // TODO: size and opacity can support ordinal with more modification\n case channel_1.Channel.OPACITY:\n // Although it generally doesn't make sense to use band with size and opacity,\n // it can also work since we use band: 0.5 to get midpoint.\n return isContinuousToContinuous(scaleType) || util_1.contains(['band', 'point'], scaleType);\n case channel_1.Channel.COLOR:\n return scaleType !== 'band'; // band does not make sense with color\n case channel_1.Channel.SHAPE:\n return scaleType === 'ordinal'; // shape = lookup only\n }\n /* istanbul ignore next: it should never reach here */\n return false;\n}\nexports.channelSupportScaleType = channelSupportScaleType;\n\n\n/***/ }),\n/* 6 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/compassql/build/src/wildcard.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar property_1 = __webpack_require__(/*! ./property */ 18);\nvar util_1 = __webpack_require__(/*! ./util */ 13);\nvar axis_1 = __webpack_require__(/*! vega-lite/build/src/axis */ 231);\nvar channel_1 = __webpack_require__(/*! vega-lite/build/src/channel */ 3);\nvar mark_1 = __webpack_require__(/*! vega-lite/build/src/mark */ 34);\nvar scale_1 = __webpack_require__(/*! vega-lite/build/src/scale */ 5);\nvar legend_1 = __webpack_require__(/*! vega-lite/build/src/legend */ 158);\nvar timeunit_1 = __webpack_require__(/*! vega-lite/build/src/timeunit */ 23);\nvar type_1 = __webpack_require__(/*! vega-lite/build/src/type */ 16);\nexports.SHORT_WILDCARD = '?';\nfunction isWildcard(prop) {\n return isShortWildcard(prop) || isWildcardDef(prop);\n}\nexports.isWildcard = isWildcard;\nfunction isShortWildcard(prop) {\n return prop === exports.SHORT_WILDCARD;\n}\nexports.isShortWildcard = isShortWildcard;\nfunction isWildcardDef(prop) {\n return prop !== undefined && (!!prop.enum || !!prop.name) && !util_1.isArray(prop);\n}\nexports.isWildcardDef = isWildcardDef;\nfunction initWildcard(prop, defaultName, defaultEnumValues) {\n return util_1.extend({}, {\n name: defaultName,\n enum: defaultEnumValues\n }, prop === exports.SHORT_WILDCARD ? {} : prop);\n}\nexports.initWildcard = initWildcard;\n/**\n * Initial short names from list of full camelCaseNames.\n * For each camelCaseNames, return unique short names based on initial (e.g., `ccn`)\n */\nfunction initNestedPropName(fullNames) {\n var index = {};\n var has = {};\n var _loop_1 = function (fullName) {\n var initialIndices = [0];\n for (var i = 0; i < fullName.length; i++) {\n if (fullName.charAt(i).toUpperCase() === fullName.charAt(i)) {\n initialIndices.push(i);\n }\n }\n var shortName = initialIndices.map(function (i) { return fullName.charAt(i); }).join('').toLowerCase();\n if (!has[shortName]) {\n index[fullName] = shortName;\n has[shortName] = true;\n return \"continue\";\n }\n // If duplicate, add last character and try again!\n if (initialIndices[initialIndices.length - 1] !== fullName.length - 1) {\n shortName = initialIndices.concat([fullName.length - 1]).map(function (i) { return fullName.charAt(i); }).join('').toLowerCase();\n if (!has[shortName]) {\n index[fullName] = shortName;\n has[shortName] = true;\n return \"continue\";\n }\n }\n for (var i = 1; !index[fullName]; i++) {\n var shortNameWithNo = shortName + '_' + i;\n if (!has[shortNameWithNo]) {\n index[fullName] = shortNameWithNo;\n has[shortNameWithNo] = true;\n break;\n }\n }\n };\n for (var _i = 0, fullNames_1 = fullNames; _i < fullNames_1.length; _i++) {\n var fullName = fullNames_1[_i];\n _loop_1(fullName);\n }\n return index;\n}\nexports.DEFAULT_NAME = {\n mark: 'm',\n channel: 'c',\n aggregate: 'a',\n autoCount: '#',\n hasFn: 'h',\n bin: 'b',\n sort: 'so',\n scale: 's',\n axis: 'ax',\n legend: 'l',\n timeUnit: 'tu',\n field: 'f',\n type: 't',\n binProps: {\n maxbins: 'mb',\n min: 'mi',\n max: 'ma',\n base: 'b',\n step: 's',\n steps: 'ss',\n minstep: 'ms',\n divide: 'd'\n },\n sortProps: {\n field: 'f',\n op: 'o',\n order: 'or'\n },\n scaleProps: initNestedPropName(scale_1.SCALE_PROPERTIES),\n axisProps: initNestedPropName(axis_1.AXIS_PROPERTIES),\n legendProps: initNestedPropName(legend_1.LEGEND_PROPERTIES)\n};\nfunction getDefaultName(prop) {\n if (property_1.isEncodingNestedProp(prop)) {\n return exports.DEFAULT_NAME[prop.parent] + '-' + exports.DEFAULT_NAME[prop.parent + 'Props'][prop.child];\n }\n if (exports.DEFAULT_NAME[prop]) {\n return exports.DEFAULT_NAME[prop];\n }\n /* istanbul ignore next */\n throw new Error('Default name undefined for ' + prop);\n}\nexports.getDefaultName = getDefaultName;\nvar DEFAULT_BOOLEAN_ENUM = [false, true];\nvar DEFAULT_BIN_PROPS_ENUM = {\n maxbins: [5, 10, 20],\n extent: [undefined],\n base: [10],\n step: [undefined],\n steps: [undefined],\n minstep: [undefined],\n divide: [[5, 2]]\n};\nvar DEFAULT_SORT_PROPS = {\n field: [undefined],\n op: ['min', 'mean'],\n order: ['ascending', 'descending']\n};\nvar DEFAULT_SCALE_PROPS_ENUM = {\n type: [undefined, scale_1.ScaleType.LOG],\n domain: [undefined],\n base: [undefined],\n exponent: [1, 2],\n clamp: DEFAULT_BOOLEAN_ENUM,\n nice: DEFAULT_BOOLEAN_ENUM,\n reverse: DEFAULT_BOOLEAN_ENUM,\n round: DEFAULT_BOOLEAN_ENUM,\n zero: DEFAULT_BOOLEAN_ENUM,\n padding: [undefined],\n paddingInner: [undefined],\n paddingOuter: [undefined],\n interpolate: [undefined],\n range: [undefined],\n rangeStep: [17, 21],\n scheme: [undefined],\n};\nvar DEFAULT_AXIS_PROPS_ENUM = {\n zindex: [1, 0],\n offset: [undefined],\n orient: [undefined],\n values: [undefined],\n domain: DEFAULT_BOOLEAN_ENUM,\n grid: DEFAULT_BOOLEAN_ENUM,\n format: [undefined],\n labels: DEFAULT_BOOLEAN_ENUM,\n labelAngle: [undefined],\n labelOverlap: [undefined],\n labelPadding: [undefined],\n maxExtent: [undefined],\n minExtent: [undefined],\n position: [undefined],\n ticks: DEFAULT_BOOLEAN_ENUM,\n tickCount: [undefined],\n tickSize: [undefined],\n title: [undefined],\n titleMaxLength: [undefined],\n titlePadding: [undefined]\n};\nvar DEFAULT_LEGEND_PROPS_ENUM = {\n entryPadding: [undefined],\n orient: ['left', 'right'],\n offset: [undefined],\n format: [undefined],\n values: [undefined],\n tickCount: [undefined],\n title: [undefined],\n type: [undefined],\n zindex: [undefined]\n};\n// Use FullEnumIndex to make sure we have all properties specified here!\nexports.DEFAULT_ENUM_INDEX = {\n mark: [mark_1.Mark.POINT, mark_1.Mark.BAR, mark_1.Mark.LINE, mark_1.Mark.AREA, mark_1.Mark.TICK, mark_1.Mark.TEXT],\n channel: [channel_1.X, channel_1.Y, channel_1.ROW, channel_1.COLUMN, channel_1.SIZE, channel_1.COLOR],\n aggregate: [undefined, 'mean'],\n autoCount: DEFAULT_BOOLEAN_ENUM,\n bin: DEFAULT_BOOLEAN_ENUM,\n hasFn: DEFAULT_BOOLEAN_ENUM,\n timeUnit: [undefined, timeunit_1.TimeUnit.YEAR, timeunit_1.TimeUnit.MONTH, timeunit_1.TimeUnit.MINUTES, timeunit_1.TimeUnit.SECONDS],\n field: [undefined],\n type: [type_1.Type.NOMINAL, type_1.Type.ORDINAL, type_1.Type.QUANTITATIVE, type_1.Type.TEMPORAL],\n sort: ['ascending', 'descending'],\n scale: [true],\n axis: DEFAULT_BOOLEAN_ENUM,\n legend: DEFAULT_BOOLEAN_ENUM,\n binProps: DEFAULT_BIN_PROPS_ENUM,\n sortProps: DEFAULT_SORT_PROPS,\n scaleProps: DEFAULT_SCALE_PROPS_ENUM,\n axisProps: DEFAULT_AXIS_PROPS_ENUM,\n legendProps: DEFAULT_LEGEND_PROPS_ENUM\n};\n// TODO: rename this to getDefaultEnum\nfunction getDefaultEnumValues(prop, schema, opt) {\n if (prop === 'field' || (property_1.isEncodingNestedProp(prop) && prop.parent === 'sort' && prop.child === 'field')) {\n // For field, by default enumerate all fields\n return schema.fieldNames();\n }\n var val;\n if (property_1.isEncodingNestedProp(prop)) {\n val = opt.enum[prop.parent + 'Props'][prop.child];\n }\n else {\n val = opt.enum[prop];\n }\n if (val !== undefined) {\n return val;\n }\n /* istanbul ignore next */\n throw new Error('No default enumValues for ' + JSON.stringify(prop));\n}\nexports.getDefaultEnumValues = getDefaultEnumValues;\n\n\n/***/ }),\n/* 7 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************!*\\\n !*** ./~/vega-lite/build/src/log.js ***!\n \\**************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * Vega-Lite's singleton logger utility.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar vega_util_1 = __webpack_require__(/*! vega-util */ 35);\n/**\n * Main (default) Vega Logger instance for Vega-Lite\n */\nvar main = vega_util_1.logger(vega_util_1.Warn);\nvar current = main;\n/**\n * Logger tool for checking if the code throws correct warning\n */\nvar LocalLogger = /** @class */ (function () {\n function LocalLogger() {\n this.warns = [];\n this.infos = [];\n this.debugs = [];\n }\n LocalLogger.prototype.level = function () {\n return this;\n };\n LocalLogger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n (_a = this.warns).push.apply(_a, args);\n return this;\n var _a;\n };\n LocalLogger.prototype.info = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n (_a = this.infos).push.apply(_a, args);\n return this;\n var _a;\n };\n LocalLogger.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n (_a = this.debugs).push.apply(_a, args);\n return this;\n var _a;\n };\n return LocalLogger;\n}());\nexports.LocalLogger = LocalLogger;\nfunction runLocalLogger(f) {\n var localLogger = current = new LocalLogger();\n f(localLogger);\n reset();\n}\nexports.runLocalLogger = runLocalLogger;\nfunction wrap(f) {\n return function () {\n var logger = current = new LocalLogger();\n f(logger);\n reset();\n };\n}\nexports.wrap = wrap;\n/**\n * Set the singleton logger to be a custom logger\n */\nfunction set(logger) {\n current = logger;\n return current;\n}\nexports.set = set;\n/**\n * Reset the main logger to use the default Vega Logger\n */\nfunction reset() {\n current = main;\n return current;\n}\nexports.reset = reset;\nfunction warn() {\n var _ = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n _[_i] = arguments[_i];\n }\n current.warn.apply(current, arguments);\n}\nexports.warn = warn;\nfunction info() {\n var _ = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n _[_i] = arguments[_i];\n }\n current.info.apply(current, arguments);\n}\nexports.info = info;\nfunction debug() {\n var _ = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n _[_i] = arguments[_i];\n }\n current.debug.apply(current, arguments);\n}\nexports.debug = debug;\n/**\n * Collection of all Vega-Lite Error Messages\n */\nvar message;\n(function (message) {\n message.INVALID_SPEC = 'Invalid spec';\n // SELECTION\n function cannotProjectOnChannelWithoutField(channel) {\n return \"Cannot project a selection on encoding channel \\\"\" + channel + \"\\\", which has no field.\";\n }\n message.cannotProjectOnChannelWithoutField = cannotProjectOnChannelWithoutField;\n function selectionNotFound(name) {\n return \"Cannot find a selection named \\\"\" + name + \"\\\"\";\n }\n message.selectionNotFound = selectionNotFound;\n // REPEAT\n function noSuchRepeatedValue(field) {\n return \"Unknown repeated value \\\"\" + field + \"\\\".\";\n }\n message.noSuchRepeatedValue = noSuchRepeatedValue;\n // TITLE\n function cannotSetTitleAnchor(type) {\n return \"Cannot set title \\\"anchor\\\" for a \" + type + \" spec\";\n }\n message.cannotSetTitleAnchor = cannotSetTitleAnchor;\n // DATA\n function unrecognizedParse(p) {\n return \"Unrecognized parse \\\"\" + p + \"\\\".\";\n }\n message.unrecognizedParse = unrecognizedParse;\n function differentParse(field, local, ancestor) {\n return \"An ancestor parsed field \\\"\" + field + \"\\\" as \" + ancestor + \" but a child wants to parse the field as \" + local + \".\";\n }\n message.differentParse = differentParse;\n // TRANSFORMS\n function invalidTransformIgnored(transform) {\n return \"Ignoring an invalid transform: \" + JSON.stringify(transform) + \".\";\n }\n message.invalidTransformIgnored = invalidTransformIgnored;\n message.NO_FIELDS_NEEDS_AS = 'If \"from.fields\" is not specified, \"as\" has to be a string that specifies the key to be used for the the data from the secondary source.';\n // ENCODING & FACET\n function invalidFieldType(type) {\n return \"Invalid field type \\\"\" + type + \"\\\"\";\n }\n message.invalidFieldType = invalidFieldType;\n function invalidFieldTypeForCountAggregate(type, aggregate) {\n return \"Invalid field type \\\"\" + type + \"\\\" for aggregate: \\\"\" + aggregate + \"\\\", using \\\"quantitative\\\" instead.\";\n }\n message.invalidFieldTypeForCountAggregate = invalidFieldTypeForCountAggregate;\n function invalidAggregate(aggregate) {\n return \"Invalid aggregation operator \\\"\" + aggregate + \"\\\"\";\n }\n message.invalidAggregate = invalidAggregate;\n function emptyOrInvalidFieldType(type, channel, newType) {\n return \"Invalid field type \\\"\" + type + \"\\\" for channel \\\"\" + channel + \"\\\", using \\\"\" + newType + \"\\\" instead.\";\n }\n message.emptyOrInvalidFieldType = emptyOrInvalidFieldType;\n function emptyFieldDef(fieldDef, channel) {\n return \"Dropping \" + JSON.stringify(fieldDef) + \" from channel \\\"\" + channel + \"\\\" since it does not contain data field or value.\";\n }\n message.emptyFieldDef = emptyFieldDef;\n function incompatibleChannel(channel, markOrFacet, when) {\n return channel + \" dropped as it is incompatible with \\\"\" + markOrFacet + \"\\\"\" + (when ? \" when \" + when : '') + \".\";\n }\n message.incompatibleChannel = incompatibleChannel;\n function facetChannelShouldBeDiscrete(channel) {\n return channel + \" encoding should be discrete (ordinal / nominal / binned).\";\n }\n message.facetChannelShouldBeDiscrete = facetChannelShouldBeDiscrete;\n function discreteChannelCannotEncode(channel, type) {\n return \"Using discrete channel \\\"\" + channel + \"\\\" to encode \\\"\" + type + \"\\\" field can be misleading as it does not encode \" + (type === 'ordinal' ? 'order' : 'magnitude') + \".\";\n }\n message.discreteChannelCannotEncode = discreteChannelCannotEncode;\n // Mark\n message.BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL = 'Bar mark should not be used with point scale when rangeStep is null. Please use band scale instead.';\n function unclearOrientContinuous(mark) {\n return \"Cannot clearly determine orientation for \\\"\" + mark + \"\\\" since both x and y channel encode continous fields. In this case, we use vertical by default\";\n }\n message.unclearOrientContinuous = unclearOrientContinuous;\n function unclearOrientDiscreteOrEmpty(mark) {\n return \"Cannot clearly determine orientation for \\\"\" + mark + \"\\\" since both x and y channel encode discrete or empty fields.\";\n }\n message.unclearOrientDiscreteOrEmpty = unclearOrientDiscreteOrEmpty;\n function orientOverridden(original, actual) {\n return \"Specified orient \\\"\" + original + \"\\\" overridden with \\\"\" + actual + \"\\\"\";\n }\n message.orientOverridden = orientOverridden;\n // SCALE\n message.CANNOT_UNION_CUSTOM_DOMAIN_WITH_FIELD_DOMAIN = 'custom domain scale cannot be unioned with default field-based domain';\n function cannotUseScalePropertyWithNonColor(prop) {\n return \"Cannot use the scale property \\\"\" + prop + \"\\\" with non-color channel.\";\n }\n message.cannotUseScalePropertyWithNonColor = cannotUseScalePropertyWithNonColor;\n function unaggregateDomainHasNoEffectForRawField(fieldDef) {\n return \"Using unaggregated domain with raw field has no effect (\" + JSON.stringify(fieldDef) + \").\";\n }\n message.unaggregateDomainHasNoEffectForRawField = unaggregateDomainHasNoEffectForRawField;\n function unaggregateDomainWithNonSharedDomainOp(aggregate) {\n return \"Unaggregated domain not applicable for \\\"\" + aggregate + \"\\\" since it produces values outside the origin domain of the source data.\";\n }\n message.unaggregateDomainWithNonSharedDomainOp = unaggregateDomainWithNonSharedDomainOp;\n function unaggregatedDomainWithLogScale(fieldDef) {\n return \"Unaggregated domain is currently unsupported for log scale (\" + JSON.stringify(fieldDef) + \").\";\n }\n message.unaggregatedDomainWithLogScale = unaggregatedDomainWithLogScale;\n message.CANNOT_USE_RANGE_WITH_POSITION = 'Cannot use a custom \"range\" with x or y channel. Please customize width, height, padding, or rangeStep instead.';\n function cannotUseSizeFieldWithBandSize(positionChannel) {\n return \"Using size field when \" + positionChannel + \"-channel has a band scale is not supported.\";\n }\n message.cannotUseSizeFieldWithBandSize = cannotUseSizeFieldWithBandSize;\n function cannotApplySizeToNonOrientedMark(mark) {\n return \"Cannot apply size to non-oriented mark \\\"\" + mark + \"\\\".\";\n }\n message.cannotApplySizeToNonOrientedMark = cannotApplySizeToNonOrientedMark;\n function rangeStepDropped(channel) {\n return \"rangeStep for \\\"\" + channel + \"\\\" is dropped as top-level \" + (channel === 'x' ? 'width' : 'height') + \" is provided.\";\n }\n message.rangeStepDropped = rangeStepDropped;\n function scaleTypeNotWorkWithChannel(channel, scaleType, defaultScaleType) {\n return \"Channel \\\"\" + channel + \"\\\" does not work with \\\"\" + scaleType + \"\\\" scale. We are using \\\"\" + defaultScaleType + \"\\\" scale instead.\";\n }\n message.scaleTypeNotWorkWithChannel = scaleTypeNotWorkWithChannel;\n function scaleTypeNotWorkWithFieldDef(scaleType, defaultScaleType) {\n return \"FieldDef does not work with \\\"\" + scaleType + \"\\\" scale. We are using \\\"\" + defaultScaleType + \"\\\" scale instead.\";\n }\n message.scaleTypeNotWorkWithFieldDef = scaleTypeNotWorkWithFieldDef;\n function scalePropertyNotWorkWithScaleType(scaleType, propName, channel) {\n return channel + \"-scale's \\\"\" + propName + \"\\\" is dropped as it does not work with \" + scaleType + \" scale.\";\n }\n message.scalePropertyNotWorkWithScaleType = scalePropertyNotWorkWithScaleType;\n function scaleTypeNotWorkWithMark(mark, scaleType) {\n return \"Scale type \\\"\" + scaleType + \"\\\" does not work with mark \\\"\" + mark + \"\\\".\";\n }\n message.scaleTypeNotWorkWithMark = scaleTypeNotWorkWithMark;\n function mergeConflictingProperty(property, propertyOf, v1, v2) {\n return \"Conflicting \" + propertyOf + \" property \\\"\" + property + \"\\\" (\\\"\" + v1 + \"\\\" and \\\"\" + v2 + \"\\\"). Using \\\"\" + v1 + \"\\\".\";\n }\n message.mergeConflictingProperty = mergeConflictingProperty;\n function independentScaleMeansIndependentGuide(channel) {\n return \"Setting the scale to be independent for \\\"\" + channel + \"\\\" means we also have to set the guide (axis or legend) to be independent.\";\n }\n message.independentScaleMeansIndependentGuide = independentScaleMeansIndependentGuide;\n function conflictedDomain(channel) {\n return \"Cannot set \" + channel + \"-scale's \\\"domain\\\" as it is binned. Please use \\\"bin\\\"'s \\\"extent\\\" instead.\";\n }\n message.conflictedDomain = conflictedDomain;\n function domainSortDropped(sort) {\n return \"Dropping sort property \\\"\" + JSON.stringify(sort) + \"\\\" as unioned domains only support boolean or op 'count'.\";\n }\n message.domainSortDropped = domainSortDropped;\n message.UNABLE_TO_MERGE_DOMAINS = 'Unable to merge domains';\n message.MORE_THAN_ONE_SORT = 'Domains that should be unioned has conflicting sort properties. Sort will be set to true.';\n // AXIS\n message.INVALID_CHANNEL_FOR_AXIS = 'Invalid channel for axis.';\n // STACK\n function cannotStackRangedMark(channel) {\n return \"Cannot stack \\\"\" + channel + \"\\\" if there is already \\\"\" + channel + \"2\\\"\";\n }\n message.cannotStackRangedMark = cannotStackRangedMark;\n function cannotStackNonLinearScale(scaleType) {\n return \"Cannot stack non-linear scale (\" + scaleType + \")\";\n }\n message.cannotStackNonLinearScale = cannotStackNonLinearScale;\n function cannotStackNonSummativeAggregate(aggregate) {\n return \"Cannot stack when the aggregate function is non-summative (\\\"\" + aggregate + \"\\\")\";\n }\n message.cannotStackNonSummativeAggregate = cannotStackNonSummativeAggregate;\n // TIMEUNIT\n function invalidTimeUnit(unitName, value) {\n return \"Invalid \" + unitName + \": \\\"\" + value + \"\\\"\";\n }\n message.invalidTimeUnit = invalidTimeUnit;\n function dayReplacedWithDate(fullTimeUnit) {\n return \"Time unit \\\"\" + fullTimeUnit + \"\\\" is not supported. We are replacing it with \" + fullTimeUnit.replace('day', 'date') + \".\";\n }\n message.dayReplacedWithDate = dayReplacedWithDate;\n function droppedDay(d) {\n return \"Dropping day from datetime \" + JSON.stringify(d) + \" as day cannot be combined with other units.\";\n }\n message.droppedDay = droppedDay;\n})(message = exports.message || (exports.message = {}));\n\n\n/***/ }),\n/* 8 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************!*\\\n !*** external \"react-css-modules\" ***!\n \\************************************/\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_8__;\n\n/***/ }),\n/* 9 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/vega-lite/build/src/fielddef.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// utility for a field definition object\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar aggregate_1 = __webpack_require__(/*! ./aggregate */ 62);\nvar bin_1 = __webpack_require__(/*! ./bin */ 155);\nvar channel_1 = __webpack_require__(/*! ./channel */ 3);\nvar log = __webpack_require__(/*! ./log */ 7);\nvar timeunit_1 = __webpack_require__(/*! ./timeunit */ 23);\nvar type_1 = __webpack_require__(/*! ./type */ 16);\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nfunction isRepeatRef(field) {\n return field && !util_1.isString(field) && 'repeat' in field;\n}\nexports.isRepeatRef = isRepeatRef;\nfunction isConditionalDef(channelDef) {\n return !!channelDef && !!channelDef.condition;\n}\nexports.isConditionalDef = isConditionalDef;\n/**\n * Return if a channelDef is a ConditionalValueDef with ConditionFieldDef\n */\nfunction hasConditionFieldDef(channelDef) {\n return !!channelDef && !!channelDef.condition && isFieldDef(channelDef.condition);\n}\nexports.hasConditionFieldDef = hasConditionFieldDef;\nfunction isFieldDef(channelDef) {\n return !!channelDef && (!!channelDef['field'] || channelDef['aggregate'] === 'count');\n}\nexports.isFieldDef = isFieldDef;\nfunction isValueDef(channelDef) {\n return channelDef && 'value' in channelDef && channelDef['value'] !== undefined;\n}\nexports.isValueDef = isValueDef;\nfunction isScaleFieldDef(channelDef) {\n return !!channelDef && (!!channelDef['scale'] || !!channelDef['sort']);\n}\nexports.isScaleFieldDef = isScaleFieldDef;\nfunction field(fieldDef, opt) {\n if (opt === void 0) { opt = {}; }\n var field = fieldDef.field;\n var prefix = opt.prefix;\n var suffix = opt.suffix;\n if (isCount(fieldDef)) {\n field = 'count_*';\n }\n else {\n var fn = undefined;\n if (!opt.nofn) {\n if (fieldDef.bin) {\n fn = bin_1.binToString(fieldDef.bin);\n suffix = opt.binSuffix || '';\n }\n else if (fieldDef.aggregate) {\n fn = String(opt.aggregate || fieldDef.aggregate);\n }\n else if (fieldDef.timeUnit) {\n fn = String(fieldDef.timeUnit);\n }\n }\n if (fn) {\n field = fn + \"_\" + field;\n }\n }\n if (suffix) {\n field = field + \"_\" + suffix;\n }\n if (prefix) {\n field = prefix + \"_\" + field;\n }\n if (opt.expr) {\n field = opt.expr + \"[\" + util_1.stringValue(field) + \"]\";\n }\n return field;\n}\nexports.field = field;\nfunction isDiscrete(fieldDef) {\n switch (fieldDef.type) {\n case 'nominal':\n case 'ordinal':\n return true;\n case 'quantitative':\n return !!fieldDef.bin;\n case 'temporal':\n return false;\n }\n throw new Error(log.message.invalidFieldType(fieldDef.type));\n}\nexports.isDiscrete = isDiscrete;\nfunction isContinuous(fieldDef) {\n return !isDiscrete(fieldDef);\n}\nexports.isContinuous = isContinuous;\nfunction isCount(fieldDef) {\n return fieldDef.aggregate === 'count';\n}\nexports.isCount = isCount;\nfunction title(fieldDef, config) {\n if (isCount(fieldDef)) {\n return config.countTitle;\n }\n var fn = fieldDef.aggregate || fieldDef.timeUnit || (fieldDef.bin && 'bin');\n if (fn) {\n return fn.toUpperCase() + '(' + fieldDef.field + ')';\n }\n else {\n return fieldDef.field;\n }\n}\nexports.title = title;\nfunction defaultType(fieldDef, channel) {\n if (fieldDef.timeUnit) {\n return 'temporal';\n }\n if (fieldDef.bin) {\n return 'quantitative';\n }\n switch (channel_1.rangeType(channel)) {\n case 'continuous':\n return 'quantitative';\n case 'discrete':\n return 'nominal';\n case 'flexible':// color\n return 'nominal';\n default:\n return 'quantitative';\n }\n}\nexports.defaultType = defaultType;\n/**\n * Returns the fieldDef -- either from the outer channelDef or from the condition of channelDef.\n * @param channelDef\n */\nfunction getFieldDef(channelDef) {\n if (isFieldDef(channelDef)) {\n return channelDef;\n }\n else if (hasConditionFieldDef(channelDef)) {\n return channelDef.condition;\n }\n return undefined;\n}\nexports.getFieldDef = getFieldDef;\n/**\n * Convert type to full, lowercase type, or augment the fieldDef with a default type if missing.\n */\nfunction normalize(channelDef, channel) {\n // If a fieldDef contains a field, we need type.\n if (isFieldDef(channelDef)) {\n return normalizeFieldDef(channelDef, channel);\n }\n else if (hasConditionFieldDef(channelDef)) {\n return tslib_1.__assign({}, channelDef, { \n // Need to cast as normalizeFieldDef normally return FieldDef, but here we know that it is definitely Condition\n condition: normalizeFieldDef(channelDef.condition, channel) });\n }\n return channelDef;\n}\nexports.normalize = normalize;\nfunction normalizeFieldDef(fieldDef, channel) {\n // Drop invalid aggregate\n if (fieldDef.aggregate && !aggregate_1.isAggregateOp(fieldDef.aggregate)) {\n var aggregate = fieldDef.aggregate, fieldDefWithoutAggregate = tslib_1.__rest(fieldDef, [\"aggregate\"]);\n log.warn(log.message.invalidAggregate(fieldDef.aggregate));\n fieldDef = fieldDefWithoutAggregate;\n }\n // Normalize Time Unit\n if (fieldDef.timeUnit) {\n fieldDef = tslib_1.__assign({}, fieldDef, { timeUnit: timeunit_1.normalizeTimeUnit(fieldDef.timeUnit) });\n }\n // Normalize bin\n if (fieldDef.bin) {\n fieldDef = tslib_1.__assign({}, fieldDef, { bin: normalizeBin(fieldDef.bin, channel) });\n }\n // Normalize Type\n if (fieldDef.type) {\n var fullType = type_1.getFullName(fieldDef.type);\n if (fieldDef.type !== fullType) {\n // convert short type to full type\n fieldDef = tslib_1.__assign({}, fieldDef, { type: fullType });\n }\n if (fieldDef.type !== 'quantitative') {\n if (aggregate_1.isCountingAggregateOp(fieldDef.aggregate)) {\n log.warn(log.message.invalidFieldTypeForCountAggregate(fieldDef.type, fieldDef.aggregate));\n fieldDef = tslib_1.__assign({}, fieldDef, { type: 'quantitative' });\n }\n }\n }\n else {\n // If type is empty / invalid, then augment with default type\n var newType = defaultType(fieldDef, channel);\n log.warn(log.message.emptyOrInvalidFieldType(fieldDef.type, channel, newType));\n fieldDef = tslib_1.__assign({}, fieldDef, { type: newType });\n }\n var _a = channelCompatibility(fieldDef, channel), compatible = _a.compatible, warning = _a.warning;\n if (!compatible) {\n log.warn(warning);\n }\n return fieldDef;\n}\nexports.normalizeFieldDef = normalizeFieldDef;\nfunction normalizeBin(bin, channel) {\n if (util_1.isBoolean(bin)) {\n return { maxbins: bin_1.autoMaxBins(channel) };\n }\n else if (!bin.maxbins && !bin.step) {\n return tslib_1.__assign({}, bin, { maxbins: bin_1.autoMaxBins(channel) });\n }\n else {\n return bin;\n }\n}\nexports.normalizeBin = normalizeBin;\nvar COMPATIBLE = { compatible: true };\nfunction channelCompatibility(fieldDef, channel) {\n switch (channel) {\n case 'row':\n case 'column':\n if (isContinuous(fieldDef) && !fieldDef.timeUnit) {\n // TODO:(https://github.com/vega/vega-lite/issues/2011):\n // with timeUnit it's not always strictly continuous\n return {\n compatible: false,\n warning: log.message.facetChannelShouldBeDiscrete(channel)\n };\n }\n return COMPATIBLE;\n case 'x':\n case 'y':\n case 'color':\n case 'text':\n case 'detail':\n case 'tooltip':\n return COMPATIBLE;\n case 'opacity':\n case 'size':\n case 'x2':\n case 'y2':\n if (isDiscrete(fieldDef) && !fieldDef.bin) {\n return {\n compatible: false,\n warning: \"Channel \" + channel + \" should not be used with discrete field.\"\n };\n }\n return COMPATIBLE;\n case 'shape':\n if (fieldDef.type !== 'nominal') {\n return {\n compatible: false,\n warning: 'Shape channel should be used with nominal data only'\n };\n }\n return COMPATIBLE;\n case 'order':\n if (fieldDef.type === 'nominal') {\n return {\n compatible: false,\n warning: \"Channel order is inappropriate for nominal field, which has no inherent order.\"\n };\n }\n return COMPATIBLE;\n }\n throw new Error('channelCompatability not implemented for channel ' + channel);\n}\nexports.channelCompatibility = channelCompatibility;\nfunction isNumberFieldDef(fieldDef) {\n return fieldDef.type === 'quantitative' || !!fieldDef.bin;\n}\nexports.isNumberFieldDef = isNumberFieldDef;\nfunction isTimeFieldDef(fieldDef) {\n return fieldDef.type === 'temporal' || !!fieldDef.timeUnit;\n}\nexports.isTimeFieldDef = isTimeFieldDef;\n\n\n/***/ }),\n/* 10 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************!*\\\n !*** ./~/domkit/appendVendorPrefix.js ***!\n \\****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar getVendorPropertyName = __webpack_require__(/*! ./getVendorPropertyName */ 432);\n\nmodule.exports = function(target, sources) {\n var to = Object(target);\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) {\n var nextSource = arguments[nextIndex];\n if (nextSource == null) {\n continue;\n }\n\n var from = Object(nextSource);\n\n for (var key in from) {\n if (hasOwnProperty.call(from, key)) {\n to[key] = from[key];\n }\n }\n }\n\n var prefixed = {};\n for (var key in to) {\n prefixed[getVendorPropertyName(key)] = to[key]\n }\n\n return prefixed\n}\n\n\n/***/ }),\n/* 11 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************!*\\\n !*** ./~/domkit/insertKeyframesRule.js ***!\n \\*****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar insertRule = __webpack_require__(/*! ./insertRule */ 433);\nvar vendorPrefix = __webpack_require__(/*! ./getVendorPrefix */ 431)();\nvar index = 0;\n\nmodule.exports = function(keyframes) {\n // random name\n var name = 'anim_' + (++index) + (+new Date);\n var css = \"@\" + vendorPrefix + \"keyframes \" + name + \" {\";\n\n for (var key in keyframes) {\n css += key + \" {\";\n\n for (var property in keyframes[key]) {\n var part = \":\" + keyframes[key][property] + \";\";\n // We do vendor prefix for every property\n css += vendorPrefix + property + part;\n css += property + part;\n }\n\n css += \"}\";\n }\n\n css += \"}\";\n\n insertRule(css);\n\n return name\n}\n\n\n/***/ }),\n/* 12 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************!*\\\n !*** ./src/selectors/index.ts ***!\n \\********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Imports to satisfy --declarations build requirements\n// https://github.com/Microsoft/TypeScript/issues/9944\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:enable:no-unused-variable\nvar reselect_1 = __webpack_require__(/*! reselect */ 86);\nvar filter_1 = __webpack_require__(/*! ../models/shelf/filter */ 46);\nvar dataset_1 = __webpack_require__(/*! ./dataset */ 66);\nvar shelf_1 = __webpack_require__(/*! ./shelf */ 58);\n__export(__webpack_require__(/*! ./dataset */ 66));\n__export(__webpack_require__(/*! ./result */ 96));\n__export(__webpack_require__(/*! ./shelf */ 58));\n__export(__webpack_require__(/*! ./tab */ 173));\nexports.selectBookmark = function (state) { return state.persistent.bookmark; };\nexports.selectConfig = function (state) { return state.persistent.config; };\nexports.selectRelatedViews = function (state) { return state.persistent.relatedViews; };\nexports.selectShelfPreview = function (state) { return state.persistent.shelfPreview; };\nexports.selectLog = function (state) { return state.persistent.log; };\nexports.selectCustomWildcardFields = function (state) {\n return state.undoable.present.customWildcardFields;\n};\nexports.selectFilteredData = reselect_1.createSelector(dataset_1.selectData, shelf_1.selectFilters, function (data, filters) {\n if (!data || filters.length === 0) {\n return data;\n }\n var filter = filter_1.toPredicateFunction(filters);\n var values = data.values.filter(filter);\n return { values: values };\n});\n\n\n/***/ }),\n/* 13 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************!*\\\n !*** ./~/compassql/build/src/util.js ***!\n \\***************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util_1 = __webpack_require__(/*! datalib/src/util */ 32);\nvar util_2 = __webpack_require__(/*! datalib/src/util */ 32);\nexports.cmp = util_2.cmp;\nexports.keys = util_2.keys;\nexports.duplicate = util_2.duplicate;\nexports.extend = util_2.extend;\nexports.isObject = util_2.isObject;\nexports.isArray = util_2.isArray;\nexports.isBoolean = util_2.isBoolean;\nexports.toMap = util_2.toMap;\nfunction contains(array, item) {\n return array.indexOf(item) !== -1;\n}\nexports.contains = contains;\n;\nfunction every(arr, f) {\n for (var i = 0; i < arr.length; i++) {\n if (!f(arr[i], i)) {\n return false;\n }\n }\n return true;\n}\nexports.every = every;\n;\nfunction forEach(obj, f, thisArg) {\n if (obj.forEach) {\n obj.forEach.call(thisArg, f);\n }\n else {\n for (var k in obj) {\n f.call(thisArg, obj[k], k, obj);\n }\n }\n}\nexports.forEach = forEach;\n;\nfunction some(arr, f) {\n var i = 0, k;\n for (k in arr) {\n if (f(arr[k], k, i++)) {\n return true;\n }\n }\n return false;\n}\nexports.some = some;\n;\nfunction nestedMap(array, f) {\n return array.map(function (a) {\n if (util_1.isArray(a)) {\n return nestedMap(a, f);\n }\n return f(a);\n });\n}\nexports.nestedMap = nestedMap;\n/** Returns the array without the elements in item */\nfunction without(array, excludedItems) {\n return array.filter(function (item) {\n return !contains(excludedItems, item);\n });\n}\nexports.without = without;\n\n\n/***/ }),\n/* 14 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/compassql/build/src/query/encoding.js ***!\n \\*************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar vlFieldDef = __webpack_require__(/*! vega-lite/build/src/fielddef */ 9);\nvar expandedtype_1 = __webpack_require__(/*! ./expandedtype */ 31);\nvar type_1 = __webpack_require__(/*! vega-lite/build/src/compile/scale/type */ 237);\nvar wildcard_1 = __webpack_require__(/*! ../wildcard */ 6);\nfunction isValueQuery(encQ) {\n return encQ !== null && encQ !== undefined && encQ['value'];\n}\nexports.isValueQuery = isValueQuery;\nfunction isFieldQuery(encQ) {\n return encQ !== null && encQ !== undefined && (encQ['field'] || encQ['aggregate'] === 'count');\n}\nexports.isFieldQuery = isFieldQuery;\nfunction isAutoCountQuery(encQ) {\n return encQ !== null && encQ !== undefined && 'autoCount' in encQ;\n}\nexports.isAutoCountQuery = isAutoCountQuery;\nfunction isDisabledAutoCountQuery(encQ) {\n return isAutoCountQuery(encQ) && encQ.autoCount === false;\n}\nexports.isDisabledAutoCountQuery = isDisabledAutoCountQuery;\nfunction isEnabledAutoCountQuery(encQ) {\n return isAutoCountQuery(encQ) && encQ.autoCount === true;\n}\nexports.isEnabledAutoCountQuery = isEnabledAutoCountQuery;\nfunction toFieldDef(encQ, props) {\n if (props === void 0) { props = ['aggregate', 'bin', 'timeUnit', 'field', 'type']; }\n if (isFieldQuery(encQ)) {\n return props.reduce(function (fieldDef, prop) {\n var propValue = encQ[prop];\n if (wildcard_1.isWildcard(propValue)) {\n throw new Error(\"Cannot convert \" + JSON.stringify(encQ) + \" to fielddef: \" + prop + \" is wildcard\");\n }\n else if (propValue !== undefined) {\n if (prop === 'type') {\n fieldDef.type = propValue;\n }\n else {\n fieldDef[prop] = propValue;\n }\n }\n return fieldDef;\n }, {});\n }\n else {\n if (encQ.autoCount === false) {\n throw new Error(\"Cannot convert {autoCount: false} into a field def\");\n }\n else {\n return props.reduce(function (fieldDef, prop) {\n if (wildcard_1.isWildcard(encQ[prop])) {\n throw new Error(\"Cannot convert \" + JSON.stringify(encQ) + \" to fielddef: \" + prop + \" is wildcard\");\n }\n switch (prop) {\n case 'type':\n fieldDef.type = 'quantitative';\n break;\n case 'aggregate':\n fieldDef.aggregate = 'count';\n break;\n }\n return fieldDef;\n }, {});\n }\n }\n}\nexports.toFieldDef = toFieldDef;\n/**\n * Is a field query continuous field?\n * This method is applicable only for fieldQuery without wildcard\n */\nfunction isContinuous(encQ) {\n if (isFieldQuery(encQ)) {\n return vlFieldDef.isContinuous(toFieldDef(encQ, ['bin', 'timeUnit', 'field', 'type']));\n }\n return isAutoCountQuery(encQ);\n}\nexports.isContinuous = isContinuous;\nfunction isMeasure(encQ) {\n if (isFieldQuery(encQ)) {\n return !isDimension(encQ) && encQ.type !== 'temporal';\n }\n return isAutoCountQuery(encQ);\n}\nexports.isMeasure = isMeasure;\n/**\n * Is a field query discrete field?\n * This method is applicable only for fieldQuery without wildcard\n */\nfunction isDimension(encQ) {\n if (isFieldQuery(encQ)) {\n var fieldDef = toFieldDef(encQ, ['bin', 'timeUnit', 'field', 'type']);\n return vlFieldDef.isDiscrete(fieldDef) || !!fieldDef.timeUnit;\n }\n return false;\n}\nexports.isDimension = isDimension;\n/**\n * Returns the true scale type of an encoding.\n * @returns {ScaleType} If the scale type was not specified, it is inferred from the encoding's Type.\n * @returns {undefined} If the scale type was not specified and Type (or TimeUnit if applicable) is a Wildcard, there is no clear scale type\n */\nfunction scaleType(fieldQ) {\n var scale = fieldQ.scale === true || fieldQ.scale === wildcard_1.SHORT_WILDCARD ? {} : fieldQ.scale || {};\n var type = fieldQ.type, channel = fieldQ.channel, timeUnit = fieldQ.timeUnit, bin = fieldQ.bin;\n // HACK: All of markType, and scaleConfig only affect\n // sub-type of ordinal to quantitative scales (point or band)\n // Currently, most of scaleType usage in CompassQL doesn't care about this subtle difference.\n // Thus, instead of making this method requiring the global mark,\n // we will just call it with mark = undefined .\n // Thus, currently, we will always get a point scale unless a CompassQuery specifies band.\n var markType = undefined;\n var scaleConfig = {};\n if (wildcard_1.isWildcard(scale.type) || wildcard_1.isWildcard(type) || wildcard_1.isWildcard(channel) || wildcard_1.isWildcard(bin)) {\n return undefined;\n }\n // If scale type is specified, then use scale.type\n if (scale.type) {\n return scale.type;\n }\n // if type is fixed and it's not temporal, we can ignore time unit.\n if (type === 'temporal' && wildcard_1.isWildcard(timeUnit)) {\n return undefined;\n }\n // if type is fixed and it's not quantitative, we can ignore bin\n if (type === 'quantitative' && wildcard_1.isWildcard(bin)) {\n return undefined;\n }\n var vegaLiteType = type === expandedtype_1.ExpandedType.KEY ? 'nominal' : type;\n var fieldDef = { type: vegaLiteType, timeUnit: timeUnit, bin: bin };\n return type_1.scaleType(scale.type, channel, fieldDef, markType, scaleConfig);\n}\nexports.scaleType = scaleType;\n\n\n/***/ }),\n/* 15 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************!*\\\n !*** ./src/actions/index.ts ***!\n \\******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar spec_1 = __webpack_require__(/*! ./shelf/spec */ 56);\nvar tab_1 = __webpack_require__(/*! ./tab */ 257);\n__export(__webpack_require__(/*! ./bookmark */ 115));\n__export(__webpack_require__(/*! ./custom-wildcard-field */ 167));\n__export(__webpack_require__(/*! ./config */ 255));\n__export(__webpack_require__(/*! ./dataset */ 168));\n__export(__webpack_require__(/*! ./log */ 90));\n__export(__webpack_require__(/*! ./redux-action */ 64));\n__export(__webpack_require__(/*! ./related-views */ 116));\n__export(__webpack_require__(/*! ./reset */ 117));\n__export(__webpack_require__(/*! ./result */ 91));\n__export(__webpack_require__(/*! ./shelf */ 20));\n__export(__webpack_require__(/*! ./state */ 679));\n__export(__webpack_require__(/*! ./tab */ 257));\n__export(__webpack_require__(/*! ./undo-redo */ 258));\n__export(__webpack_require__(/*! ./shelf-preview */ 92));\n// Use type to enforce that ACTION_TYPE_INDEX contains all action types.\nexports.ACTION_TYPE_INDEX = __assign({ BOOKMARK_ADD_PLOT: 1, BOOKMARK_CLEAR_ALL: 1, BOOKMARK_MODIFY_NOTE: 1, BOOKMARK_REMOVE_PLOT: 1, CUSTOM_WILDCARD_ADD: 1, CUSTOM_WILDCARD_ADD_FIELD: 1, CUSTOM_WILDCARD_MODIFY_DESCRIPTION: 1, CUSTOM_WILDCARD_REMOVE: 1, CUSTOM_WILDCARD_REMOVE_FIELD: 1, DATASET_SCHEMA_CHANGE_FIELD_TYPE: 1, DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN: 1, DATASET_REQUEST: 1, DATASET_RECEIVE: 1, FILTER_ADD: 1, FILTER_CLEAR: 1, FILTER_MODIFY_EXTENT: 1, FILTER_MODIFY_MAX_BOUND: 1, FILTER_MODIFY_MIN_BOUND: 1, FILTER_MODIFY_TIME_UNIT: 1, FILTER_MODIFY_ONE_OF: 1, FILTER_REMOVE: 1, FILTER_TOGGLE: 1, LOG_ERRORS_ADD: 1, LOG_ERRORS_CLEAR: 1, LOG_WARNINGS_ADD: 1, LOG_WARNINGS_CLEAR: 1, RELATED_VIEWS_HIDE_TOGGLE: 1, RESULT_RECEIVE: 1, RESULT_REQUEST: 1, RESULT_LIMIT_INCREASE: 1, RESULT_MODIFY_FIELD_PROP: 1, RESULT_MODIFY_NESTED_FIELD_PROP: 1, RESET: 1, SET_CONFIG: 1, SHELF_AUTO_ADD_COUNT_CHANGE: 1, SHELF_LOAD_QUERY: 1, SHELF_GROUP_BY_CHANGE: 1, SHELF_PREVIEW_SPEC: 1, SHELF_PREVIEW_QUERY: 1, SHELF_PREVIEW_DISABLE: 1 }, spec_1.SPEC_ACTION_TYPE_INDEX, tab_1.TAB_ACTION_TYPE_INDEX, { UNDO: 1, REDO: 1, SET_APPLICATION_STATE: 1 });\n/** An array of all possible action types. */\nexports.ACTION_TYPES = Object.keys(exports.ACTION_TYPE_INDEX);\nfunction isVoyagerAction(action) {\n return exports.ACTION_TYPE_INDEX[action.type];\n}\nexports.isVoyagerAction = isVoyagerAction;\n\n\n/***/ }),\n/* 16 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************!*\\\n !*** ./~/vega-lite/build/src/type.js ***!\n \\***************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/** Constants and utilities for data type */\n/** Data type based on level of measurement */\nvar Type;\n(function (Type) {\n Type.QUANTITATIVE = 'quantitative';\n Type.ORDINAL = 'ordinal';\n Type.TEMPORAL = 'temporal';\n Type.NOMINAL = 'nominal';\n})(Type = exports.Type || (exports.Type = {}));\nvar TYPE_INDEX = {\n quantitative: 1,\n ordinal: 1,\n temporal: 1,\n nominal: 1\n};\nfunction isType(t) {\n return !!TYPE_INDEX[t];\n}\nexports.isType = isType;\nexports.QUANTITATIVE = Type.QUANTITATIVE;\nexports.ORDINAL = Type.ORDINAL;\nexports.TEMPORAL = Type.TEMPORAL;\nexports.NOMINAL = Type.NOMINAL;\n/**\n * Get full, lowercase type name for a given type.\n * @param type\n * @return Full type name.\n */\nfunction getFullName(type) {\n if (type) {\n type = type.toLowerCase();\n switch (type) {\n case 'q':\n case exports.QUANTITATIVE:\n return 'quantitative';\n case 't':\n case exports.TEMPORAL:\n return 'temporal';\n case 'o':\n case exports.ORDINAL:\n return 'ordinal';\n case 'n':\n case exports.NOMINAL:\n return 'nominal';\n }\n }\n // If we get invalid input, return undefined type.\n return undefined;\n}\nexports.getFullName = getFullName;\n\n\n/***/ }),\n/* 17 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************!*\\\n !*** ./~/babel-runtime/helpers/extends.js ***!\n \\********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _assign = __webpack_require__(/*! ../core-js/object/assign */ 339);\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _assign2.default || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/***/ }),\n/* 18 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/compassql/build/src/property.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar axis_1 = __webpack_require__(/*! vega-lite/build/src/axis */ 231);\nvar scale_1 = __webpack_require__(/*! vega-lite/build/src/scale */ 5);\nvar legend_1 = __webpack_require__(/*! vega-lite/build/src/legend */ 158);\nvar util_1 = __webpack_require__(/*! ./util */ 13);\nfunction isEncodingNestedProp(p) {\n return !!p['parent'];\n}\nexports.isEncodingNestedProp = isEncodingNestedProp;\nexports.ENCODING_TOPLEVEL_PROPS = [\n // channel\n 'channel',\n // fn\n 'aggregate', 'autoCount', 'bin', 'timeUnit', 'hasFn',\n // sort\n 'sort',\n // field / type\n 'field', 'type',\n // scale / axis / legend\n 'scale', 'axis', 'legend'\n];\nvar ENCODING_TOPLEVEL_PROPERTY_INDEX = util_1.toMap(exports.ENCODING_TOPLEVEL_PROPS);\nfunction isEncodingTopLevelProperty(p) {\n return p in ENCODING_TOPLEVEL_PROPERTY_INDEX;\n}\nexports.isEncodingTopLevelProperty = isEncodingTopLevelProperty;\nvar ENCODING_NESTED_PROP_PARENTS = [\n 'bin', 'scale', 'sort', 'axis', 'legend'\n];\nexports.ENCODING_NESTED_PROP_PARENT_INDEX = util_1.toMap(ENCODING_NESTED_PROP_PARENTS);\nfunction hasNestedProperty(prop) {\n return exports.ENCODING_NESTED_PROP_PARENT_INDEX[prop];\n}\nexports.hasNestedProperty = hasNestedProperty;\n// FIXME -- we should not have to manually specify these\nexports.BIN_CHILD_PROPS = ['maxbins', 'divide', 'extent', 'base', 'step', 'steps', 'minstep'];\nexports.SORT_CHILD_PROPS = ['field', 'op', 'order'];\nvar BIN_PROPS = exports.BIN_CHILD_PROPS.map(function (c) {\n return { parent: 'bin', child: c };\n});\nexports.SORT_PROPS = exports.SORT_CHILD_PROPS.map(function (c) {\n return { parent: 'sort', child: c };\n});\nexports.SCALE_PROPS = scale_1.SCALE_PROPERTIES.map(function (c) {\n return { parent: 'scale', child: c };\n});\nvar AXIS_PROPS = axis_1.AXIS_PROPERTIES.map(function (c) {\n return { parent: 'axis', child: c };\n});\nvar LEGEND_PROPS = legend_1.LEGEND_PROPERTIES.map(function (c) {\n return { parent: 'legend', child: c };\n});\nexports.ENCODING_NESTED_PROPS = [].concat(BIN_PROPS, exports.SORT_PROPS, exports.SCALE_PROPS, AXIS_PROPS, LEGEND_PROPS);\nvar PROP_KEY_DELIMITER = '.';\nfunction toKey(p) {\n if (isEncodingNestedProp(p)) {\n return p.parent + PROP_KEY_DELIMITER + p.child;\n }\n return p;\n}\nexports.toKey = toKey;\nfunction fromKey(k) {\n var split = k.split(PROP_KEY_DELIMITER);\n /* istanbul ignore else */\n if (split.length === 1) {\n return k;\n }\n else if (split.length === 2) {\n return {\n parent: split[0],\n child: split[1]\n };\n }\n else {\n throw 'Invalid property key with ' + split.length + ' dots: ' + k;\n }\n}\nexports.fromKey = fromKey;\nvar ENCODING_NESTED_PROP_INDEX = exports.ENCODING_NESTED_PROPS.reduce(function (i, prop) {\n i[prop.parent] = i[prop.parent] || [];\n i[prop.parent][prop.child] = prop;\n return i;\n}, {});\n// FIXME consider using a more general method\nfunction getEncodingNestedProp(parent, child) {\n return (ENCODING_NESTED_PROP_INDEX[parent] || {})[child];\n}\nexports.getEncodingNestedProp = getEncodingNestedProp;\nfunction isEncodingProperty(prop) {\n return isEncodingTopLevelProperty(prop) || isEncodingNestedProp(prop);\n}\nexports.isEncodingProperty = isEncodingProperty;\nexports.ALL_ENCODING_PROPS = [].concat(exports.ENCODING_TOPLEVEL_PROPS, exports.ENCODING_NESTED_PROPS);\nexports.DEFAULT_PROP_PRECEDENCE = [\n 'type',\n 'field',\n // Field Transform\n 'bin', 'timeUnit', 'aggregate', 'autoCount',\n // Encoding\n 'channel',\n // Mark\n 'mark',\n 'scale', 'sort',\n 'axis', 'legend'\n].concat(BIN_PROPS, exports.SCALE_PROPS, AXIS_PROPS, LEGEND_PROPS, exports.SORT_PROPS);\nvar Property;\n(function (Property) {\n Property.MARK = 'mark';\n Property.TRANSFORM = 'transform';\n // Layout\n Property.STACK = 'stack';\n // TODO: sub parts of stack\n // Encoding Properties\n Property.CHANNEL = 'channel';\n Property.AGGREGATE = 'aggregate';\n Property.AUTOCOUNT = 'autoCount';\n Property.BIN = 'bin';\n Property.HAS_FN = 'hasFn';\n Property.TIMEUNIT = 'timeUnit';\n Property.FIELD = 'field';\n Property.TYPE = 'type';\n Property.SORT = 'sort';\n Property.SCALE = 'scale';\n Property.AXIS = 'axis';\n Property.LEGEND = 'legend';\n})(Property = exports.Property || (exports.Property = {}));\n\n\n/***/ }),\n/* 19 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************!*\\\n !*** external \"react-redux\" ***!\n \\******************************/\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_19__;\n\n/***/ }),\n/* 20 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************!*\\\n !*** ./src/actions/shelf/index.ts ***!\n \\************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(__webpack_require__(/*! ./filter */ 256));\n__export(__webpack_require__(/*! ./spec */ 56));\nexports.SHELF_LOAD_QUERY = 'SHELF_LOAD_QUERY';\nexports.SHELF_AUTO_ADD_COUNT_CHANGE = 'SHELF_AUTO_ADD_COUNT_CHANGE';\nexports.SHELF_GROUP_BY_CHANGE = 'SHELF_GROUP_BY_CHANGE';\n\n\n/***/ }),\n/* 21 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************************!*\\\n !*** ./~/react-jsonschema-form/lib/utils.js ***!\n \\**********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(setImmediate) {\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.getDefaultRegistry = getDefaultRegistry;\nexports.getWidget = getWidget;\nexports.getDefaultFormState = getDefaultFormState;\nexports.getUiOptions = getUiOptions;\nexports.isObject = isObject;\nexports.mergeObjects = mergeObjects;\nexports.asNumber = asNumber;\nexports.orderProperties = orderProperties;\nexports.isMultiSelect = isMultiSelect;\nexports.isFilesArray = isFilesArray;\nexports.isFixedItems = isFixedItems;\nexports.allowAdditionalItems = allowAdditionalItems;\nexports.optionsList = optionsList;\nexports.retrieveSchema = retrieveSchema;\nexports.deepEquals = deepEquals;\nexports.shouldRender = shouldRender;\nexports.toIdSchema = toIdSchema;\nexports.parseDateString = parseDateString;\nexports.toDateString = toDateString;\nexports.pad = pad;\nexports.setState = setState;\nexports.dataURItoBlob = dataURItoBlob;\nexports.rangeSpec = rangeSpec;\n\nvar _react = __webpack_require__(/*! react */ 0);\n\nvar _react2 = _interopRequireDefault(_react);\n\n__webpack_require__(/*! setimmediate */ 226);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar widgetMap = {\n boolean: {\n checkbox: \"CheckboxWidget\",\n radio: \"RadioWidget\",\n select: \"SelectWidget\",\n hidden: \"HiddenWidget\"\n },\n string: {\n text: \"TextWidget\",\n password: \"PasswordWidget\",\n email: \"EmailWidget\",\n hostname: \"TextWidget\",\n ipv4: \"TextWidget\",\n ipv6: \"TextWidget\",\n uri: \"URLWidget\",\n \"data-url\": \"FileWidget\",\n radio: \"RadioWidget\",\n select: \"SelectWidget\",\n textarea: \"TextareaWidget\",\n hidden: \"HiddenWidget\",\n date: \"DateWidget\",\n datetime: \"DateTimeWidget\",\n \"date-time\": \"DateTimeWidget\",\n \"alt-date\": \"AltDateWidget\",\n \"alt-datetime\": \"AltDateTimeWidget\",\n color: \"ColorWidget\",\n file: \"FileWidget\"\n },\n number: {\n text: \"TextWidget\",\n select: \"SelectWidget\",\n updown: \"UpDownWidget\",\n range: \"RangeWidget\",\n radio: \"RadioWidget\",\n hidden: \"HiddenWidget\"\n },\n integer: {\n text: \"TextWidget\",\n select: \"SelectWidget\",\n updown: \"UpDownWidget\",\n range: \"RangeWidget\",\n radio: \"RadioWidget\",\n hidden: \"HiddenWidget\"\n },\n array: {\n select: \"SelectWidget\",\n checkboxes: \"CheckboxesWidget\",\n files: \"FileWidget\"\n }\n};\n\nfunction getDefaultRegistry() {\n return {\n fields: __webpack_require__(/*! ./components/fields */ 524).default,\n widgets: __webpack_require__(/*! ./components/widgets */ 543).default,\n definitions: {},\n formContext: {}\n };\n}\n\nfunction getWidget(schema, widget) {\n var registeredWidgets = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var type = schema.type;\n\n\n function mergeOptions(Widget) {\n // cache return value as property of widget for proper react reconciliation\n if (!Widget.MergedWidget) {\n var defaultOptions = Widget.defaultProps && Widget.defaultProps.options || {};\n Widget.MergedWidget = function (_ref) {\n var _ref$options = _ref.options,\n options = _ref$options === undefined ? {} : _ref$options,\n props = _objectWithoutProperties(_ref, [\"options\"]);\n\n return _react2.default.createElement(Widget, _extends({ options: _extends({}, defaultOptions, options) }, props));\n };\n }\n return Widget.MergedWidget;\n }\n\n if (typeof widget === \"function\") {\n return mergeOptions(widget);\n }\n\n if (typeof widget !== \"string\") {\n throw new Error(\"Unsupported widget definition: \" + (typeof widget === \"undefined\" ? \"undefined\" : _typeof(widget)));\n }\n\n if (registeredWidgets.hasOwnProperty(widget)) {\n var registeredWidget = registeredWidgets[widget];\n return getWidget(schema, registeredWidget, registeredWidgets);\n }\n\n if (!widgetMap.hasOwnProperty(type)) {\n throw new Error(\"No widget for type \\\"\" + type + \"\\\"\");\n }\n\n if (widgetMap[type].hasOwnProperty(widget)) {\n var _registeredWidget = registeredWidgets[widgetMap[type][widget]];\n return getWidget(schema, _registeredWidget, registeredWidgets);\n }\n\n throw new Error(\"No widget \\\"\" + widget + \"\\\" for type \\\"\" + type + \"\\\"\");\n}\n\nfunction computeDefaults(schema, parentDefaults) {\n var definitions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n // Compute the defaults recursively: give highest priority to deepest nodes.\n var defaults = parentDefaults;\n if (isObject(defaults) && isObject(schema.default)) {\n // For object defaults, only override parent defaults that are defined in\n // schema.default.\n defaults = mergeObjects(defaults, schema.default);\n } else if (\"default\" in schema) {\n // Use schema defaults for this node.\n defaults = schema.default;\n } else if (\"$ref\" in schema) {\n // Use referenced schema defaults for this node.\n var refSchema = findSchemaDefinition(schema.$ref, definitions);\n return computeDefaults(refSchema, defaults, definitions);\n } else if (isFixedItems(schema)) {\n defaults = schema.items.map(function (itemSchema) {\n return computeDefaults(itemSchema, undefined, definitions);\n });\n }\n // Not defaults defined for this node, fallback to generic typed ones.\n if (typeof defaults === \"undefined\") {\n defaults = schema.default;\n }\n\n switch (schema.type) {\n // We need to recur for object schema inner default values.\n case \"object\":\n return Object.keys(schema.properties || {}).reduce(function (acc, key) {\n // Compute the defaults for this node, with the parent defaults we might\n // have from a previous run: defaults[key].\n acc[key] = computeDefaults(schema.properties[key], (defaults || {})[key], definitions);\n return acc;\n }, {});\n\n case \"array\":\n if (schema.minItems) {\n return new Array(schema.minItems).fill(computeDefaults(schema.items, defaults, definitions));\n }\n }\n return defaults;\n}\n\nfunction getDefaultFormState(_schema, formData) {\n var definitions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (!isObject(_schema)) {\n throw new Error(\"Invalid schema: \" + _schema);\n }\n var schema = retrieveSchema(_schema, definitions);\n var defaults = computeDefaults(schema, _schema.default, definitions);\n if (typeof formData === \"undefined\") {\n // No form data? Use schema defaults.\n return defaults;\n }\n if (isObject(formData)) {\n // Override schema defaults with form data.\n return mergeObjects(defaults, formData);\n }\n return formData || defaults;\n}\n\nfunction getUiOptions(uiSchema) {\n // get all passed options from ui:widget, ui:options, and ui:\n return Object.keys(uiSchema).filter(function (key) {\n return key.indexOf(\"ui:\") === 0;\n }).reduce(function (options, key) {\n var value = uiSchema[key];\n\n if (key === \"ui:widget\" && isObject(value)) {\n console.warn(\"Setting options via ui:widget object is deprecated, use ui:options instead\");\n return _extends({}, options, value.options || {}, {\n widget: value.component\n });\n }\n if (key === \"ui:options\" && isObject(value)) {\n return _extends({}, options, value);\n }\n return _extends({}, options, _defineProperty({}, key.substring(3), value));\n }, {});\n}\n\nfunction isObject(thing) {\n return (typeof thing === \"undefined\" ? \"undefined\" : _typeof(thing)) === \"object\" && thing !== null && !Array.isArray(thing);\n}\n\nfunction mergeObjects(obj1, obj2) {\n var concatArrays = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Recursively merge deeply nested objects.\n var acc = Object.assign({}, obj1); // Prevent mutation of source object.\n return Object.keys(obj2).reduce(function (acc, key) {\n var left = obj1[key],\n right = obj2[key];\n if (obj1.hasOwnProperty(key) && isObject(right)) {\n acc[key] = mergeObjects(left, right, concatArrays);\n } else if (concatArrays && Array.isArray(left) && Array.isArray(right)) {\n acc[key] = left.concat(right);\n } else {\n acc[key] = right;\n }\n return acc;\n }, acc);\n}\n\nfunction asNumber(value) {\n if (value === \"\") {\n return undefined;\n }\n if (/\\.$/.test(value)) {\n // \"3.\" can't really be considered a number even if it parses in js. The\n // user is most likely entering a float.\n return value;\n }\n if (/\\.0$/.test(value)) {\n // we need to return this as a string here, to allow for input like 3.07\n return value;\n }\n var n = Number(value);\n var valid = typeof n === \"number\" && !Number.isNaN(n);\n\n if (/\\.\\d*0$/.test(value)) {\n // It's a number, that's cool - but we need it as a string so it doesn't screw\n // with the user when entering dollar amounts or other values (such as those with\n // specific precision or number of significant digits)\n return value;\n }\n\n return valid ? n : value;\n}\n\nfunction orderProperties(properties, order) {\n if (!Array.isArray(order)) {\n return properties;\n }\n\n var arrayToHash = function arrayToHash(arr) {\n return arr.reduce(function (prev, curr) {\n prev[curr] = true;\n return prev;\n }, {});\n };\n var errorPropList = function errorPropList(arr) {\n return arr.length > 1 ? \"properties '\" + arr.join(\"', '\") + \"'\" : \"property '\" + arr[0] + \"'\";\n };\n var propertyHash = arrayToHash(properties);\n var orderHash = arrayToHash(order);\n var extraneous = order.filter(function (prop) {\n return prop !== \"*\" && !propertyHash[prop];\n });\n if (extraneous.length) {\n throw new Error(\"uiSchema order list contains extraneous \" + errorPropList(extraneous));\n }\n var rest = properties.filter(function (prop) {\n return !orderHash[prop];\n });\n var restIndex = order.indexOf(\"*\");\n if (restIndex === -1) {\n if (rest.length) {\n throw new Error(\"uiSchema order list does not contain \" + errorPropList(rest));\n }\n return order;\n }\n if (restIndex !== order.lastIndexOf(\"*\")) {\n throw new Error(\"uiSchema order list contains more than one wildcard item\");\n }\n\n var complete = [].concat(_toConsumableArray(order));\n complete.splice.apply(complete, [restIndex, 1].concat(_toConsumableArray(rest)));\n return complete;\n}\n\nfunction isMultiSelect(schema) {\n return schema.items ? Array.isArray(schema.items.enum) && schema.uniqueItems : false;\n}\n\nfunction isFilesArray(schema, uiSchema) {\n return schema.items && schema.items.type === \"string\" && schema.items.format === \"data-url\" || uiSchema[\"ui:widget\"] === \"files\";\n}\n\nfunction isFixedItems(schema) {\n return Array.isArray(schema.items) && schema.items.length > 0 && schema.items.every(function (item) {\n return isObject(item);\n });\n}\n\nfunction allowAdditionalItems(schema) {\n if (schema.additionalItems === true) {\n console.warn(\"additionalItems=true is currently not supported\");\n }\n return isObject(schema.additionalItems);\n}\n\nfunction optionsList(schema) {\n return schema.enum.map(function (value, i) {\n var label = schema.enumNames && schema.enumNames[i] || String(value);\n return { label: label, value: value };\n });\n}\n\nfunction findSchemaDefinition($ref) {\n var definitions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // Extract and use the referenced definition if we have it.\n var match = /^#\\/definitions\\/(.*)$/.exec($ref);\n if (match && match[1]) {\n var parts = match[1].split(\"/\");\n var current = definitions;\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = parts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var part = _step.value;\n\n part = part.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n if (current.hasOwnProperty(part)) {\n current = current[part];\n } else {\n // No matching definition found, that's an error (bogus schema?)\n throw new Error(\"Could not find a definition for \" + $ref + \".\");\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return current;\n }\n\n // No matching definition found, that's an error (bogus schema?)\n throw new Error(\"Could not find a definition for \" + $ref + \".\");\n}\n\nfunction retrieveSchema(schema) {\n var definitions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // No $ref attribute found, returning the original schema.\n if (!schema.hasOwnProperty(\"$ref\")) {\n return schema;\n }\n // Retrieve the referenced schema definition.\n var $refSchema = findSchemaDefinition(schema.$ref, definitions);\n // Drop the $ref property of the source schema.\n\n var $ref = schema.$ref,\n localSchema = _objectWithoutProperties(schema, [\"$ref\"]);\n // Update referenced schema definition with local schema properties.\n\n\n return _extends({}, $refSchema, localSchema);\n}\n\nfunction isArguments(object) {\n return Object.prototype.toString.call(object) === \"[object Arguments]\";\n}\n\nfunction deepEquals(a, b) {\n var ca = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var cb = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n\n // Partially extracted from node-deeper and adapted to exclude comparison\n // checks for functions.\n // https://github.com/othiym23/node-deeper\n if (a === b) {\n return true;\n } else if (typeof a === \"function\" || typeof b === \"function\") {\n // Assume all functions are equivalent\n // see https://github.com/mozilla-services/react-jsonschema-form/issues/255\n return true;\n } else if ((typeof a === \"undefined\" ? \"undefined\" : _typeof(a)) !== \"object\" || (typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) !== \"object\") {\n return false;\n } else if (a === null || b === null) {\n return false;\n } else if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n } else if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.global === b.global && a.multiline === b.multiline && a.lastIndex === b.lastIndex && a.ignoreCase === b.ignoreCase;\n } else if (isArguments(a) || isArguments(b)) {\n if (!(isArguments(a) && isArguments(b))) {\n return false;\n }\n var slice = Array.prototype.slice;\n return deepEquals(slice.call(a), slice.call(b), ca, cb);\n } else {\n if (a.constructor !== b.constructor) {\n return false;\n }\n\n var ka = Object.keys(a);\n var kb = Object.keys(b);\n // don't bother with stack acrobatics if there's nothing there\n if (ka.length === 0 && kb.length === 0) {\n return true;\n }\n if (ka.length !== kb.length) {\n return false;\n }\n\n var cal = ca.length;\n while (cal--) {\n if (ca[cal] === a) {\n return cb[cal] === b;\n }\n }\n ca.push(a);\n cb.push(b);\n\n ka.sort();\n kb.sort();\n for (var j = ka.length - 1; j >= 0; j--) {\n if (ka[j] !== kb[j]) {\n return false;\n }\n }\n\n var key = void 0;\n for (var k = ka.length - 1; k >= 0; k--) {\n key = ka[k];\n if (!deepEquals(a[key], b[key], ca, cb)) {\n return false;\n }\n }\n\n ca.pop();\n cb.pop();\n\n return true;\n }\n}\n\nfunction shouldRender(comp, nextProps, nextState) {\n var props = comp.props,\n state = comp.state;\n\n return !deepEquals(props, nextProps) || !deepEquals(state, nextState);\n}\n\nfunction toIdSchema(schema, id, definitions) {\n var idSchema = {\n $id: id || \"root\"\n };\n if (\"$ref\" in schema) {\n var _schema = retrieveSchema(schema, definitions);\n return toIdSchema(_schema, id, definitions);\n }\n if (\"items\" in schema && !schema.items.$ref) {\n return toIdSchema(schema.items, id, definitions);\n }\n if (schema.type !== \"object\") {\n return idSchema;\n }\n for (var name in schema.properties || {}) {\n var field = schema.properties[name];\n var fieldId = idSchema.$id + \"_\" + name;\n idSchema[name] = toIdSchema(field, fieldId, definitions);\n }\n return idSchema;\n}\n\nfunction parseDateString(dateString) {\n var includeTime = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!dateString) {\n return {\n year: -1,\n month: -1,\n day: -1,\n hour: includeTime ? -1 : 0,\n minute: includeTime ? -1 : 0,\n second: includeTime ? -1 : 0\n };\n }\n var date = new Date(dateString);\n if (Number.isNaN(date.getTime())) {\n throw new Error(\"Unable to parse date \" + dateString);\n }\n return {\n year: date.getUTCFullYear(),\n month: date.getUTCMonth() + 1, // oh you, javascript.\n day: date.getUTCDate(),\n hour: includeTime ? date.getUTCHours() : 0,\n minute: includeTime ? date.getUTCMinutes() : 0,\n second: includeTime ? date.getUTCSeconds() : 0\n };\n}\n\nfunction toDateString(_ref2) {\n var year = _ref2.year,\n month = _ref2.month,\n day = _ref2.day,\n _ref2$hour = _ref2.hour,\n hour = _ref2$hour === undefined ? 0 : _ref2$hour,\n _ref2$minute = _ref2.minute,\n minute = _ref2$minute === undefined ? 0 : _ref2$minute,\n _ref2$second = _ref2.second,\n second = _ref2$second === undefined ? 0 : _ref2$second;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var utcTime = Date.UTC(year, month - 1, day, hour, minute, second);\n var datetime = new Date(utcTime).toJSON();\n return time ? datetime : datetime.slice(0, 10);\n}\n\nfunction pad(num, size) {\n var s = String(num);\n while (s.length < size) {\n s = \"0\" + s;\n }\n return s;\n}\n\nfunction setState(instance, state, callback) {\n var safeRenderCompletion = instance.props.safeRenderCompletion;\n\n if (safeRenderCompletion) {\n instance.setState(state, callback);\n } else {\n instance.setState(state);\n setImmediate(callback);\n }\n}\n\nfunction dataURItoBlob(dataURI) {\n // Split metadata from data\n var splitted = dataURI.split(\",\");\n // Split params\n var params = splitted[0].split(\";\");\n // Get mime-type from params\n var type = params[0].replace(\"data:\", \"\");\n // Filter the name property from params\n var properties = params.filter(function (param) {\n return param.split(\"=\")[0] === \"name\";\n });\n // Look for the name and use unknown if no name property.\n var name = void 0;\n if (properties.length !== 1) {\n name = \"unknown\";\n } else {\n // Because we filtered out the other property,\n // we only have the name case here.\n name = properties[0].split(\"=\")[1];\n }\n\n // Built the Uint8Array Blob parameter from the base64 string.\n var binary = atob(splitted[1]);\n var array = [];\n for (var i = 0; i < binary.length; i++) {\n array.push(binary.charCodeAt(i));\n }\n // Create the blob object\n var blob = new window.Blob([new Uint8Array(array)], { type: type });\n\n return { blob: blob, name: name };\n}\n\nfunction rangeSpec(schema) {\n var spec = {};\n if (schema.multipleOf) {\n spec.step = schema.multipleOf;\n }\n if (schema.minimum || schema.minimum === 0) {\n spec.min = schema.minimum;\n }\n if (schema.maximum || schema.maximum === 0) {\n spec.max = schema.maximum;\n }\n return spec;\n}\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(/*! ./../../timers-browserify/main.js */ 584).setImmediate))\n\n/***/ }),\n/* 22 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/selection/selection.js ***!\n \\**************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar vega_event_selector_1 = __webpack_require__(/*! vega-event-selector */ 154);\nvar channel_1 = __webpack_require__(/*! ../../channel */ 3);\nvar log_1 = __webpack_require__(/*! ../../log */ 7);\nvar selection_1 = __webpack_require__(/*! ../../selection */ 630);\nvar util_1 = __webpack_require__(/*! ../../util */ 2);\nvar model_1 = __webpack_require__(/*! ../model */ 33);\nvar interval_1 = __webpack_require__(/*! ./interval */ 156);\nvar multi_1 = __webpack_require__(/*! ./multi */ 238);\nvar single_1 = __webpack_require__(/*! ./single */ 620);\nvar transforms_1 = __webpack_require__(/*! ./transforms/transforms */ 624);\nexports.STORE = '_store';\nexports.TUPLE = '_tuple';\nexports.MODIFY = '_modify';\nexports.SELECTION_DOMAIN = '_selection_domain_';\nfunction parseUnitSelection(model, selDefs) {\n var selCmpts = {};\n var selectionConfig = model.config.selection;\n var _loop_1 = function (name_1) {\n if (!selDefs.hasOwnProperty(name_1)) {\n return \"continue\";\n }\n var selDef = selDefs[name_1];\n var cfg = selectionConfig[selDef.type];\n // Set default values from config if a property hasn't been specified,\n // or if it is true. E.g., \"translate\": true should use the default\n // event handlers for translate. However, true may be a valid value for\n // a property (e.g., \"nearest\": true).\n for (var key in cfg) {\n // A selection should contain either `encodings` or `fields`, only use\n // default values for these two values if neither of them is specified.\n if ((key === 'encodings' && selDef.fields) || (key === 'fields' && selDef.encodings)) {\n continue;\n }\n if (key === 'mark') {\n selDef[key] = tslib_1.__assign({}, cfg[key], selDef[key]);\n }\n if (selDef[key] === undefined || selDef[key] === true) {\n selDef[key] = cfg[key] || selDef[key];\n }\n }\n name_1 = util_1.varName(name_1);\n var selCmpt = selCmpts[name_1] = tslib_1.__assign({}, selDef, { name: name_1, events: util_1.isString(selDef.on) ? vega_event_selector_1.selector(selDef.on, 'scope') : selDef.on });\n transforms_1.forEachTransform(selCmpt, function (txCompiler) {\n if (txCompiler.parse) {\n txCompiler.parse(model, selDef, selCmpt);\n }\n });\n };\n for (var name_1 in selDefs) {\n _loop_1(name_1);\n }\n return selCmpts;\n}\nexports.parseUnitSelection = parseUnitSelection;\nfunction assembleUnitSelectionSignals(model, signals) {\n forEachSelection(model, function (selCmpt, selCompiler) {\n var name = selCmpt.name;\n var modifyExpr = selCompiler.modifyExpr(model, selCmpt);\n signals.push.apply(signals, selCompiler.signals(model, selCmpt));\n transforms_1.forEachTransform(selCmpt, function (txCompiler) {\n if (txCompiler.signals) {\n signals = txCompiler.signals(model, selCmpt, signals);\n }\n if (txCompiler.modifyExpr) {\n modifyExpr = txCompiler.modifyExpr(model, selCmpt, modifyExpr);\n }\n });\n signals.push({\n name: name + exports.MODIFY,\n on: [{\n events: { signal: name + exports.TUPLE },\n update: \"modify(\" + util_1.stringValue(selCmpt.name + exports.STORE) + \", \" + modifyExpr + \")\"\n }]\n });\n });\n var facetModel = getFacetModel(model);\n if (signals.length && facetModel) {\n var name_2 = util_1.stringValue(facetModel.getName('cell'));\n signals.unshift({\n name: 'facet',\n value: {},\n on: [{\n events: vega_event_selector_1.selector('mousemove', 'scope'),\n update: \"isTuple(facet) ? facet : group(\" + name_2 + \").datum\"\n }]\n });\n }\n return signals;\n}\nexports.assembleUnitSelectionSignals = assembleUnitSelectionSignals;\nfunction assembleTopLevelSignals(model, signals) {\n var needsUnit = false;\n forEachSelection(model, function (selCmpt, selCompiler) {\n if (selCompiler.topLevelSignals) {\n signals = selCompiler.topLevelSignals(model, selCmpt, signals);\n }\n transforms_1.forEachTransform(selCmpt, function (txCompiler) {\n if (txCompiler.topLevelSignals) {\n signals = txCompiler.topLevelSignals(model, selCmpt, signals);\n }\n });\n needsUnit = true;\n });\n if (needsUnit) {\n var hasUnit = signals.filter(function (s) { return s.name === 'unit'; });\n if (!(hasUnit.length)) {\n signals.unshift({\n name: 'unit',\n value: {},\n on: [{ events: 'mousemove', update: 'isTuple(group()) ? group() : unit' }]\n });\n }\n }\n return signals;\n}\nexports.assembleTopLevelSignals = assembleTopLevelSignals;\nfunction assembleUnitSelectionData(model, data) {\n forEachSelection(model, function (selCmpt) {\n var contains = data.filter(function (d) { return d.name === selCmpt.name + exports.STORE; });\n if (!contains.length) {\n data.push({ name: selCmpt.name + exports.STORE });\n }\n });\n return data;\n}\nexports.assembleUnitSelectionData = assembleUnitSelectionData;\nfunction assembleUnitSelectionMarks(model, marks) {\n var selMarks = marks;\n forEachSelection(model, function (selCmpt, selCompiler) {\n selMarks = selCompiler.marks ? selCompiler.marks(model, selCmpt, selMarks) : selMarks;\n transforms_1.forEachTransform(selCmpt, function (txCompiler) {\n if (txCompiler.marks) {\n selMarks = txCompiler.marks(model, selCmpt, marks, selMarks);\n }\n });\n });\n return selMarks;\n}\nexports.assembleUnitSelectionMarks = assembleUnitSelectionMarks;\nfunction assembleLayerSelectionMarks(model, marks) {\n model.children.forEach(function (child) {\n if (model_1.isUnitModel(child)) {\n marks = assembleUnitSelectionMarks(child, marks);\n }\n });\n return marks;\n}\nexports.assembleLayerSelectionMarks = assembleLayerSelectionMarks;\nfunction predicate(model, selections, dfnode) {\n var stores = [];\n function expr(name) {\n var vname = util_1.varName(name);\n var selCmpt = model.getSelectionComponent(vname, name);\n var store = util_1.stringValue(vname + exports.STORE);\n if (selCmpt.timeUnit) {\n var child = dfnode || model.component.data.raw;\n var tunode = selCmpt.timeUnit.clone();\n if (child.parent) {\n tunode.insertAsParentOf(child);\n }\n else {\n child.parent = tunode;\n }\n }\n stores.push(store);\n return compiler(selCmpt.type).predicate + (\"(\" + store + \", datum\") +\n (selCmpt.resolve === 'global' ? ')' : \", \" + util_1.stringValue(selCmpt.resolve) + \")\");\n }\n var predicateStr = util_1.logicalExpr(selections, expr);\n return '!(' + stores.map(function (s) { return \"length(data(\" + s + \"))\"; }).join(' || ') +\n (\") || (\" + predicateStr + \")\");\n}\nexports.predicate = predicate;\n// Selections are parsed _after_ scales. If a scale domain is set to\n// use a selection, the SELECTION_DOMAIN constant is used as the\n// domainRaw.signal during scale.parse and then replaced with the necessary\n// selection expression function during scale.assemble. To not pollute the\n// type signatures to account for this setup, the selection domain definition\n// is coerced to a string and appended to SELECTION_DOMAIN.\nfunction isRawSelectionDomain(domainRaw) {\n return domainRaw.signal.indexOf(exports.SELECTION_DOMAIN) >= 0;\n}\nexports.isRawSelectionDomain = isRawSelectionDomain;\nfunction selectionScaleDomain(model, domainRaw) {\n var selDomain = JSON.parse(domainRaw.signal.replace(exports.SELECTION_DOMAIN, ''));\n var name = util_1.varName(selDomain.selection);\n var selCmpt = model.component.selection && model.component.selection[name];\n if (selCmpt) {\n log_1.warn('Use \"bind\": \"scales\" to setup a binding for scales and selections within the same view.');\n }\n else {\n selCmpt = model.getSelectionComponent(name, selDomain.selection);\n if (!selDomain.encoding && !selDomain.field) {\n selDomain.field = selCmpt.project[0].field;\n if (selCmpt.project.length > 1) {\n log_1.warn('A \"field\" or \"encoding\" must be specified when using a selection as a scale domain. ' +\n (\"Using \\\"field\\\": \" + util_1.stringValue(selDomain.field) + \".\"));\n }\n }\n return {\n signal: compiler(selCmpt.type).scaleDomain +\n (\"(\" + util_1.stringValue(name + exports.STORE) + \", \" + util_1.stringValue(selDomain.encoding || null) + \", \") +\n util_1.stringValue(selDomain.field || null) +\n (selCmpt.resolve === 'global' ? ')' : \", \" + util_1.stringValue(selCmpt.resolve) + \")\")\n };\n }\n return { signal: 'null' };\n}\nexports.selectionScaleDomain = selectionScaleDomain;\n// Utility functions\nfunction forEachSelection(model, cb) {\n var selections = model.component.selection;\n for (var name_3 in selections) {\n if (selections.hasOwnProperty(name_3)) {\n var sel = selections[name_3];\n cb(sel, compiler(sel.type));\n }\n }\n}\nfunction compiler(type) {\n switch (type) {\n case 'single':\n return single_1.default;\n case 'multi':\n return multi_1.default;\n case 'interval':\n return interval_1.default;\n }\n return null;\n}\nfunction getFacetModel(model) {\n var parent = model.parent;\n while (parent) {\n if (model_1.isFacetModel(parent)) {\n break;\n }\n parent = parent.parent;\n }\n return parent;\n}\nfunction unitName(model) {\n var name = util_1.stringValue(model.name);\n var facet = getFacetModel(model);\n if (facet) {\n name += (facet.facet.row ? \" + '_' + facet[\" + util_1.stringValue(facet.field('row')) + \"]\" : '')\n + (facet.facet.column ? \" + '_' + facet[\" + util_1.stringValue(facet.field('column')) + \"]\" : '');\n }\n return name;\n}\nexports.unitName = unitName;\nfunction requiresSelectionId(model) {\n var identifier = false;\n forEachSelection(model, function (selCmpt) {\n identifier = identifier || selCmpt.project.some(function (proj) { return proj.field === selection_1.SELECTION_ID; });\n });\n return identifier;\n}\nexports.requiresSelectionId = requiresSelectionId;\nfunction channelSignalName(selCmpt, channel, range) {\n return util_1.varName(selCmpt.name + '_' + (range === 'visual' ? channel : selCmpt.fields[channel]));\n}\nexports.channelSignalName = channelSignalName;\nfunction spatialProjections(selCmpt) {\n var x = null;\n var xi = null;\n var y = null;\n var yi = null;\n selCmpt.project.forEach(function (p, i) {\n if (p.channel === channel_1.X) {\n x = p;\n xi = i;\n }\n else if (p.channel === channel_1.Y) {\n y = p;\n yi = i;\n }\n });\n return { x: x, xi: xi, y: y, yi: yi };\n}\nexports.spatialProjections = spatialProjections;\n\n\n/***/ }),\n/* 23 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/vega-lite/build/src/timeunit.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar datetime_1 = __webpack_require__(/*! ./datetime */ 108);\nvar log = __webpack_require__(/*! ./log */ 7);\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nvar TimeUnit;\n(function (TimeUnit) {\n TimeUnit.YEAR = 'year';\n TimeUnit.MONTH = 'month';\n TimeUnit.DAY = 'day';\n TimeUnit.DATE = 'date';\n TimeUnit.HOURS = 'hours';\n TimeUnit.MINUTES = 'minutes';\n TimeUnit.SECONDS = 'seconds';\n TimeUnit.MILLISECONDS = 'milliseconds';\n TimeUnit.YEARMONTH = 'yearmonth';\n TimeUnit.YEARMONTHDATE = 'yearmonthdate';\n TimeUnit.YEARMONTHDATEHOURS = 'yearmonthdatehours';\n TimeUnit.YEARMONTHDATEHOURSMINUTES = 'yearmonthdatehoursminutes';\n TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS = 'yearmonthdatehoursminutesseconds';\n // MONTHDATE always include 29 February since we use year 0th (which is a leap year);\n TimeUnit.MONTHDATE = 'monthdate';\n TimeUnit.HOURSMINUTES = 'hoursminutes';\n TimeUnit.HOURSMINUTESSECONDS = 'hoursminutesseconds';\n TimeUnit.MINUTESSECONDS = 'minutesseconds';\n TimeUnit.SECONDSMILLISECONDS = 'secondsmilliseconds';\n TimeUnit.QUARTER = 'quarter';\n TimeUnit.YEARQUARTER = 'yearquarter';\n TimeUnit.QUARTERMONTH = 'quartermonth';\n TimeUnit.YEARQUARTERMONTH = 'yearquartermonth';\n TimeUnit.UTCYEAR = 'utcyear';\n TimeUnit.UTCMONTH = 'utcmonth';\n TimeUnit.UTCDAY = 'utcday';\n TimeUnit.UTCDATE = 'utcdate';\n TimeUnit.UTCHOURS = 'utchours';\n TimeUnit.UTCMINUTES = 'utcminutes';\n TimeUnit.UTCSECONDS = 'utcseconds';\n TimeUnit.UTCMILLISECONDS = 'utcmilliseconds';\n TimeUnit.UTCYEARMONTH = 'utcyearmonth';\n TimeUnit.UTCYEARMONTHDATE = 'utcyearmonthdate';\n TimeUnit.UTCYEARMONTHDATEHOURS = 'utcyearmonthdatehours';\n TimeUnit.UTCYEARMONTHDATEHOURSMINUTES = 'utcyearmonthdatehoursminutes';\n TimeUnit.UTCYEARMONTHDATEHOURSMINUTESSECONDS = 'utcyearmonthdatehoursminutesseconds';\n // MONTHDATE always include 29 February since we use year 0th (which is a leap year);\n TimeUnit.UTCMONTHDATE = 'utcmonthdate';\n TimeUnit.UTCHOURSMINUTES = 'utchoursminutes';\n TimeUnit.UTCHOURSMINUTESSECONDS = 'utchoursminutesseconds';\n TimeUnit.UTCMINUTESSECONDS = 'utcminutesseconds';\n TimeUnit.UTCSECONDSMILLISECONDS = 'utcsecondsmilliseconds';\n TimeUnit.UTCQUARTER = 'utcquarter';\n TimeUnit.UTCYEARQUARTER = 'utcyearquarter';\n TimeUnit.UTCQUARTERMONTH = 'utcquartermonth';\n TimeUnit.UTCYEARQUARTERMONTH = 'utcyearquartermonth';\n})(TimeUnit = exports.TimeUnit || (exports.TimeUnit = {}));\n/** Time Unit that only corresponds to only one part of Date objects. */\nvar LOCAL_SINGLE_TIMEUNIT_INDEX = {\n year: 1,\n quarter: 1,\n month: 1,\n day: 1,\n date: 1,\n hours: 1,\n minutes: 1,\n seconds: 1,\n milliseconds: 1\n};\nexports.TIMEUNIT_PARTS = util_1.flagKeys(LOCAL_SINGLE_TIMEUNIT_INDEX);\nfunction isLocalSingleTimeUnit(timeUnit) {\n return !!LOCAL_SINGLE_TIMEUNIT_INDEX[timeUnit];\n}\nexports.isLocalSingleTimeUnit = isLocalSingleTimeUnit;\nvar UTC_SINGLE_TIMEUNIT_INDEX = {\n utcyear: 1,\n utcquarter: 1,\n utcmonth: 1,\n utcday: 1,\n utcdate: 1,\n utchours: 1,\n utcminutes: 1,\n utcseconds: 1,\n utcmilliseconds: 1\n};\nfunction isUtcSingleTimeUnit(timeUnit) {\n return !!UTC_SINGLE_TIMEUNIT_INDEX[timeUnit];\n}\nexports.isUtcSingleTimeUnit = isUtcSingleTimeUnit;\nvar LOCAL_MULTI_TIMEUNIT_INDEX = {\n yearquarter: 1,\n yearquartermonth: 1,\n yearmonth: 1,\n yearmonthdate: 1,\n yearmonthdatehours: 1,\n yearmonthdatehoursminutes: 1,\n yearmonthdatehoursminutesseconds: 1,\n quartermonth: 1,\n monthdate: 1,\n hoursminutes: 1,\n hoursminutesseconds: 1,\n minutesseconds: 1,\n secondsmilliseconds: 1\n};\nvar UTC_MULTI_TIMEUNIT_INDEX = {\n utcyearquarter: 1,\n utcyearquartermonth: 1,\n utcyearmonth: 1,\n utcyearmonthdate: 1,\n utcyearmonthdatehours: 1,\n utcyearmonthdatehoursminutes: 1,\n utcyearmonthdatehoursminutesseconds: 1,\n utcquartermonth: 1,\n utcmonthdate: 1,\n utchoursminutes: 1,\n utchoursminutesseconds: 1,\n utcminutesseconds: 1,\n utcsecondsmilliseconds: 1\n};\nvar UTC_TIMEUNIT_INDEX = tslib_1.__assign({}, UTC_SINGLE_TIMEUNIT_INDEX, UTC_MULTI_TIMEUNIT_INDEX);\nfunction isUTCTimeUnit(t) {\n return !!UTC_TIMEUNIT_INDEX[t];\n}\nexports.isUTCTimeUnit = isUTCTimeUnit;\nfunction getLocalTimeUnit(t) {\n return t.substr(3);\n}\nexports.getLocalTimeUnit = getLocalTimeUnit;\nvar TIMEUNIT_INDEX = tslib_1.__assign({}, LOCAL_SINGLE_TIMEUNIT_INDEX, UTC_SINGLE_TIMEUNIT_INDEX, LOCAL_MULTI_TIMEUNIT_INDEX, UTC_MULTI_TIMEUNIT_INDEX);\nexports.TIMEUNITS = util_1.flagKeys(TIMEUNIT_INDEX);\nfunction isTimeUnit(t) {\n return !!TIMEUNIT_INDEX[t];\n}\nexports.isTimeUnit = isTimeUnit;\nvar SET_DATE_METHOD = {\n year: 'setFullYear',\n month: 'setMonth',\n date: 'setDate',\n hours: 'setHours',\n minutes: 'setMinutes',\n seconds: 'setSeconds',\n milliseconds: 'setMilliseconds',\n // Day and quarter have their own special cases\n quarter: null,\n day: null,\n};\n/**\n * Converts a date to only have the measurements relevant to the specified unit\n * i.e. ('yearmonth', '2000-12-04 07:58:14') -> '2000-12-01 00:00:00'\n * Note: the base date is Jan 01 1900 00:00:00\n */\nfunction convert(unit, date) {\n var isUTC = isUTCTimeUnit(unit);\n var result = isUTC ?\n // start with uniform date\n new Date(Date.UTC(0, 0, 1, 0, 0, 0, 0)) :\n new Date(0, 0, 1, 0, 0, 0, 0);\n exports.TIMEUNIT_PARTS.forEach(function (timeUnitPart) {\n if (containsTimeUnit(unit, timeUnitPart)) {\n switch (timeUnitPart) {\n case TimeUnit.DAY:\n throw new Error('Cannot convert to TimeUnits containing \\'day\\'');\n case TimeUnit.QUARTER: {\n var _a = dateMethods('month', isUTC), getDateMethod_1 = _a.getDateMethod, setDateMethod_1 = _a.setDateMethod;\n // indicate quarter by setting month to be the first of the quarter i.e. may (4) -> april (3)\n result[setDateMethod_1]((Math.floor(date[getDateMethod_1]() / 3)) * 3);\n break;\n }\n default:\n var _b = dateMethods(timeUnitPart, isUTC), getDateMethod = _b.getDateMethod, setDateMethod = _b.setDateMethod;\n result[setDateMethod](date[getDateMethod]());\n }\n }\n });\n return result;\n}\nexports.convert = convert;\nfunction dateMethods(singleUnit, isUtc) {\n var rawSetDateMethod = SET_DATE_METHOD[singleUnit];\n var setDateMethod = isUtc ? 'setUTC' + rawSetDateMethod.substr(3) : rawSetDateMethod;\n var getDateMethod = 'get' + (isUtc ? 'UTC' : '') + rawSetDateMethod.substr(3);\n return { setDateMethod: setDateMethod, getDateMethod: getDateMethod };\n}\n/** Returns true if fullTimeUnit contains the timeUnit, false otherwise. */\nfunction containsTimeUnit(fullTimeUnit, timeUnit) {\n var index = fullTimeUnit.indexOf(timeUnit);\n return index > -1 &&\n (timeUnit !== TimeUnit.SECONDS ||\n index === 0 ||\n fullTimeUnit.charAt(index - 1) !== 'i' // exclude milliseconds\n );\n}\nexports.containsTimeUnit = containsTimeUnit;\n/**\n * Returns Vega expresssion for a given timeUnit and fieldRef\n */\nfunction fieldExpr(fullTimeUnit, field) {\n var fieldRef = \"datum[\" + util_1.stringValue(field) + \"]\";\n var utc = isUTCTimeUnit(fullTimeUnit) ? 'utc' : '';\n function func(timeUnit) {\n if (timeUnit === TimeUnit.QUARTER) {\n // quarter starting at 0 (0,3,6,9).\n return \"(\" + utc + \"quarter(\" + fieldRef + \")-1)\";\n }\n else {\n return \"\" + utc + timeUnit + \"(\" + fieldRef + \")\";\n }\n }\n var d = exports.TIMEUNIT_PARTS.reduce(function (dateExpr, tu) {\n if (containsTimeUnit(fullTimeUnit, tu)) {\n dateExpr[tu] = func(tu);\n }\n return dateExpr;\n }, {});\n return datetime_1.dateTimeExpr(d);\n}\nexports.fieldExpr = fieldExpr;\n/** returns the smallest nice unit for scale.nice */\nfunction smallestUnit(timeUnit) {\n if (!timeUnit) {\n return undefined;\n }\n if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) {\n return 'second';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) {\n return 'minute';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) {\n return 'hour';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.DAY) ||\n containsTimeUnit(timeUnit, TimeUnit.DATE)) {\n return 'day';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) {\n return 'month';\n }\n if (containsTimeUnit(timeUnit, TimeUnit.YEAR)) {\n return 'year';\n }\n return undefined;\n}\nexports.smallestUnit = smallestUnit;\n/**\n * returns the signal expression used for axis labels for a time unit\n */\nfunction formatExpression(timeUnit, field, shortTimeLabels, isUTCScale) {\n if (!timeUnit) {\n return undefined;\n }\n var dateComponents = [];\n var expression = '';\n var hasYear = containsTimeUnit(timeUnit, TimeUnit.YEAR);\n if (containsTimeUnit(timeUnit, TimeUnit.QUARTER)) {\n // special expression for quarter as prefix\n expression = \"'Q' + quarter(\" + field + \")\";\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) {\n // By default use short month name\n dateComponents.push(shortTimeLabels !== false ? '%b' : '%B');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.DAY)) {\n dateComponents.push(shortTimeLabels ? '%a' : '%A');\n }\n else if (containsTimeUnit(timeUnit, TimeUnit.DATE)) {\n dateComponents.push('%d' + (hasYear ? ',' : '')); // add comma if there is year\n }\n if (hasYear) {\n dateComponents.push(shortTimeLabels ? '%y' : '%Y');\n }\n var timeComponents = [];\n if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) {\n timeComponents.push('%H');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) {\n timeComponents.push('%M');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) {\n timeComponents.push('%S');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MILLISECONDS)) {\n timeComponents.push('%L');\n }\n var dateTimeComponents = [];\n if (dateComponents.length > 0) {\n dateTimeComponents.push(dateComponents.join(' '));\n }\n if (timeComponents.length > 0) {\n dateTimeComponents.push(timeComponents.join(':'));\n }\n if (dateTimeComponents.length > 0) {\n if (expression) {\n // Add space between quarter and main time format\n expression += \" + ' ' + \";\n }\n // We only use utcFormat for utc scale\n // For utc time units, the data is already converted as a part of timeUnit transform.\n // Thus, utc time units should use timeFormat to avoid shifting the time twice.\n if (isUTCScale) {\n expression += \"utcFormat(\" + field + \", '\" + dateTimeComponents.join(' ') + \"')\";\n }\n else {\n expression += \"timeFormat(\" + field + \", '\" + dateTimeComponents.join(' ') + \"')\";\n }\n }\n // If expression is still an empty string, return undefined instead.\n return expression || undefined;\n}\nexports.formatExpression = formatExpression;\nfunction normalizeTimeUnit(timeUnit) {\n if (timeUnit !== 'day' && timeUnit.indexOf('day') >= 0) {\n log.warn(log.message.dayReplacedWithDate(timeUnit));\n return timeUnit.replace('day', 'date');\n }\n return timeUnit;\n}\nexports.normalizeTimeUnit = normalizeTimeUnit;\n\n\n/***/ }),\n/* 24 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************!*\\\n !*** external \"react-dom\" ***!\n \\****************************/\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n/***/ }),\n/* 25 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************!*\\\n !*** ./~/core-js/library/modules/_core.js ***!\n \\********************************************/\n/***/ (function(module, exports) {\n\nvar core = module.exports = {version: '2.4.0'};\nif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef\n\n/***/ }),\n/* 26 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/common.js ***!\n \\*************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = __webpack_require__(/*! ../channel */ 3);\nvar fielddef_1 = __webpack_require__(/*! ../fielddef */ 9);\nvar scale_1 = __webpack_require__(/*! ../scale */ 5);\nvar timeunit_1 = __webpack_require__(/*! ../timeunit */ 23);\nvar type_1 = __webpack_require__(/*! ../type */ 16);\nvar util_1 = __webpack_require__(/*! ../util */ 2);\nfunction applyConfig(e, config, // TODO(#1842): consolidate MarkConfig | TextConfig?\n propsList) {\n for (var _i = 0, propsList_1 = propsList; _i < propsList_1.length; _i++) {\n var property = propsList_1[_i];\n var value = config[property];\n if (value !== undefined) {\n e[property] = { value: value };\n }\n }\n return e;\n}\nexports.applyConfig = applyConfig;\nfunction applyMarkConfig(e, model, propsList) {\n for (var _i = 0, propsList_2 = propsList; _i < propsList_2.length; _i++) {\n var property = propsList_2[_i];\n var value = getMarkConfig(property, model.markDef, model.config);\n if (value !== undefined) {\n e[property] = { value: value };\n }\n }\n return e;\n}\nexports.applyMarkConfig = applyMarkConfig;\nfunction getStyles(mark) {\n if (mark.style) {\n return util_1.isArray(mark.style) ? mark.style : [mark.style];\n }\n return [mark.type];\n}\nexports.getStyles = getStyles;\n/**\n * Return value mark specific config property if exists.\n * Otherwise, return general mark specific config.\n */\nfunction getMarkConfig(prop, mark, config) {\n // By default, read from mark config first!\n var value = config.mark[prop];\n // Then read mark specific config, which has higher precedence\n var markSpecificConfig = config[mark.type];\n if (markSpecificConfig[prop] !== undefined) {\n value = markSpecificConfig[prop];\n }\n var styles = getStyles(mark);\n for (var _i = 0, styles_1 = styles; _i < styles_1.length; _i++) {\n var style = styles_1[_i];\n var styleConfig = config.style[style];\n // MarkConfig extends VgMarkConfig so a prop may not be a valid property for style\n // However here we also check if it is defined, so it is okay to cast here\n var p = prop;\n if (styleConfig && styleConfig[p] !== undefined) {\n value = styleConfig[p];\n }\n }\n return value;\n}\nexports.getMarkConfig = getMarkConfig;\nfunction formatSignalRef(fieldDef, specifiedFormat, expr, config) {\n var format = numberFormat(fieldDef, specifiedFormat, config);\n if (fieldDef.bin) {\n var startField = fielddef_1.field(fieldDef, { expr: expr });\n var endField = fielddef_1.field(fieldDef, { expr: expr, binSuffix: 'end' });\n return {\n signal: binFormatExpression(startField, endField, format, config)\n };\n }\n else if (fieldDef.type === 'quantitative') {\n return {\n signal: \"\" + formatExpr(fielddef_1.field(fieldDef, { expr: expr }), format)\n };\n }\n else if (fielddef_1.isTimeFieldDef(fieldDef)) {\n var isUTCScale = fielddef_1.isScaleFieldDef(fieldDef) && fieldDef['scale'] && fieldDef['scale'].type === scale_1.ScaleType.UTC;\n return {\n signal: timeFormatExpression(fielddef_1.field(fieldDef, { expr: expr }), fieldDef.timeUnit, specifiedFormat, config.text.shortTimeLabels, config.timeFormat, isUTCScale)\n };\n }\n else {\n return {\n signal: \"''+\" + fielddef_1.field(fieldDef, { expr: expr })\n };\n }\n}\nexports.formatSignalRef = formatSignalRef;\nfunction getSpecifiedOrDefaultValue(specifiedValue, defaultValue) {\n if (specifiedValue !== undefined) {\n return specifiedValue;\n }\n return defaultValue;\n}\nexports.getSpecifiedOrDefaultValue = getSpecifiedOrDefaultValue;\n/**\n * Returns number format for a fieldDef\n *\n * @param format explicitly specified format\n */\nfunction numberFormat(fieldDef, specifiedFormat, config) {\n if (fieldDef.type === type_1.QUANTITATIVE) {\n // add number format for quantitative type only\n // Specified format in axis/legend has higher precedence than fieldDef.format\n if (specifiedFormat) {\n return specifiedFormat;\n }\n // TODO: need to make this work correctly for numeric ordinal / nominal type\n return config.numberFormat;\n }\n return undefined;\n}\nexports.numberFormat = numberFormat;\nfunction formatExpr(field, format) {\n return \"format(\" + field + \", \\\"\" + (format || '') + \"\\\")\";\n}\nfunction numberFormatExpr(field, specifiedFormat, config) {\n return formatExpr(field, specifiedFormat || config.numberFormat);\n}\nexports.numberFormatExpr = numberFormatExpr;\nfunction binFormatExpression(startField, endField, format, config) {\n return startField + \" === null || isNaN(\" + startField + \") ? \\\"null\\\" : \" + numberFormatExpr(startField, format, config) + \" + \\\" - \\\" + \" + numberFormatExpr(endField, format, config);\n}\nexports.binFormatExpression = binFormatExpression;\n/**\n * Returns the time expression used for axis/legend labels or text mark for a temporal field\n */\nfunction timeFormatExpression(field, timeUnit, format, shortTimeLabels, timeFormatConfig, isUTCScale) {\n if (!timeUnit || format) {\n // If there is not time unit, or if user explicitly specify format for axis/legend/text.\n var _format = format || timeFormatConfig; // only use config.timeFormat if there is no timeUnit.\n if (isUTCScale) {\n return \"utcFormat(\" + field + \", '\" + _format + \"')\";\n }\n else {\n return \"timeFormat(\" + field + \", '\" + _format + \"')\";\n }\n }\n else {\n return timeunit_1.formatExpression(timeUnit, field, shortTimeLabels, isUTCScale);\n }\n}\nexports.timeFormatExpression = timeFormatExpression;\n/**\n * Return Vega sort parameters (tuple of field and order).\n */\nfunction sortParams(orderDef, fieldRefOption) {\n return (util_1.isArray(orderDef) ? orderDef : [orderDef]).reduce(function (s, orderChannelDef) {\n s.field.push(fielddef_1.field(orderChannelDef, fieldRefOption));\n s.order.push(orderChannelDef.sort || 'ascending');\n return s;\n }, { field: [], order: [] });\n}\nexports.sortParams = sortParams;\nfunction titleMerger(v1, v2) {\n return {\n explicit: v1.explicit,\n value: v1.value === v2.value ?\n v1.value :\n v1.value + ', ' + v2.value // join title with comma if different\n };\n}\nexports.titleMerger = titleMerger;\n/**\n * Checks whether a fieldDef for a particular channel requires a computed bin range.\n */\nfunction binRequiresRange(fieldDef, channel) {\n if (!fieldDef.bin) {\n console.warn('Only use this method with binned field defs');\n return false;\n }\n // We need the range only when the user explicitly forces a binned field to be use discrete scale. In this case, bin range is used in axis and legend labels.\n // We could check whether the axis or legend exists (not disabled) but that seems overkill.\n return channel_1.isScaleChannel(channel) && util_1.contains(['ordinal', 'nominal'], fieldDef.type);\n}\nexports.binRequiresRange = binRequiresRange;\n\n\n/***/ }),\n/* 27 */\n/* unknown exports provided */\n/* exports used: default */\n/*!***************************************************!*\\\n !*** ./~/babel-runtime/helpers/classCallCheck.js ***!\n \\***************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\n/***/ }),\n/* 28 */\n/* unknown exports provided */\n/* exports used: default */\n/*!************************************************!*\\\n !*** ./~/babel-runtime/helpers/createClass.js ***!\n \\************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _defineProperty = __webpack_require__(/*! ../core-js/object/define-property */ 184);\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n/***/ }),\n/* 29 */\n/* unknown exports provided */\n/* exports used: default */\n/*!*********************************************!*\\\n !*** ./~/babel-runtime/helpers/inherits.js ***!\n \\*********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _setPrototypeOf = __webpack_require__(/*! ../core-js/object/set-prototype-of */ 343);\n\nvar _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);\n\nvar _create = __webpack_require__(/*! ../core-js/object/create */ 340);\n\nvar _create2 = _interopRequireDefault(_create);\n\nvar _typeof2 = __webpack_require__(/*! ../helpers/typeof */ 97);\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(superClass)));\n }\n\n subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n/***/ }),\n/* 30 */\n/* unknown exports provided */\n/* exports used: default */\n/*!**************************************************************!*\\\n !*** ./~/babel-runtime/helpers/possibleConstructorReturn.js ***!\n \\**************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof2 = __webpack_require__(/*! ../helpers/typeof */ 97);\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && ((typeof call === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(call)) === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n/***/ }),\n/* 31 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************************!*\\\n !*** ./~/compassql/build/src/query/expandedtype.js ***!\n \\*****************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar type_1 = __webpack_require__(/*! vega-lite/build/src/type */ 16);\nvar ExpandedType;\n(function (ExpandedType) {\n ExpandedType.QUANTITATIVE = type_1.Type.QUANTITATIVE;\n ExpandedType.ORDINAL = type_1.Type.ORDINAL;\n ExpandedType.TEMPORAL = type_1.Type.TEMPORAL;\n ExpandedType.NOMINAL = type_1.Type.NOMINAL;\n ExpandedType.KEY = 'key';\n})(ExpandedType = exports.ExpandedType || (exports.ExpandedType = {}));\nfunction isDiscrete(fieldType) {\n return fieldType === type_1.Type.ORDINAL || fieldType === type_1.Type.NOMINAL || fieldType === ExpandedType.KEY;\n}\nexports.isDiscrete = isDiscrete;\n\n\n/***/ }),\n/* 32 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************!*\\\n !*** ./~/datalib/src/util.js ***!\n \\*******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(Buffer) {var u = module.exports;\n\n// utility functions\n\nvar FNAME = '__name__';\n\nu.namedfunc = function(name, f) { return (f[FNAME] = name, f); };\n\nu.name = function(f) { return f==null ? null : f[FNAME]; };\n\nu.identity = function(x) { return x; };\n\nu.true = u.namedfunc('true', function() { return true; });\n\nu.false = u.namedfunc('false', function() { return false; });\n\nu.duplicate = function(obj) {\n return JSON.parse(JSON.stringify(obj));\n};\n\nu.equal = function(a, b) {\n return JSON.stringify(a) === JSON.stringify(b);\n};\n\nu.extend = function(obj) {\n for (var x, name, i=1, len=arguments.length; i 1 ?\n function(x, v) {\n for (var i=0; i b || b == null) && a != null ? 1 :\n ((b = b instanceof Date ? +b : b),\n (a = a instanceof Date ? +a : a)) !== a && b === b ? -1 :\n b !== b && a === a ? 1 : 0;\n};\n\nu.numcmp = function(a, b) { return a - b; };\n\nu.stablesort = function(array, sortBy, keyFn) {\n var indices = array.reduce(function(idx, v, i) {\n return (idx[keyFn(v)] = i, idx);\n }, {});\n\n array.sort(function(a, b) {\n var sa = sortBy(a),\n sb = sortBy(b);\n return sa < sb ? -1 : sa > sb ? 1\n : (indices[keyFn(a)] - indices[keyFn(b)]);\n });\n\n return array;\n};\n\n// permutes an array using a Knuth shuffle\nu.permute = function(a) {\n var m = a.length,\n swap,\n i;\n\n while (m) {\n i = Math.floor(Math.random() * m--);\n swap = a[m];\n a[m] = a[i];\n a[i] = swap;\n }\n};\n\n// string functions\n\nu.pad = function(s, length, pos, padchar) {\n padchar = padchar || \" \";\n var d = length - s.length;\n if (d <= 0) return s;\n switch (pos) {\n case 'left':\n return strrep(d, padchar) + s;\n case 'middle':\n case 'center':\n return strrep(Math.floor(d/2), padchar) +\n s + strrep(Math.ceil(d/2), padchar);\n default:\n return s + strrep(d, padchar);\n }\n};\n\nfunction strrep(n, str) {\n var s = \"\", i;\n for (i=0; i 0 ? title : undefined;\n }\n return undefined;\n };\n /**\n * Assemble the mark group for this model. We accept optional `signals` so that we can include concat top-level signals with the top-level model's local signals.\n */\n Model.prototype.assembleGroup = function (signals) {\n if (signals === void 0) { signals = []; }\n var group = {};\n signals = signals.concat(this.assembleSelectionSignals());\n if (signals.length > 0) {\n group.signals = signals;\n }\n var layout = this.assembleLayout();\n if (layout) {\n group.layout = layout;\n }\n group.marks = [].concat(this.assembleHeaderMarks(), this.assembleMarks());\n // Only include scales if this spec is top-level or if parent is facet.\n // (Otherwise, it will be merged with upper-level's scope.)\n var scales = (!this.parent || isFacetModel(this.parent)) ? assemble_4.assembleScales(this) : [];\n if (scales.length > 0) {\n group.scales = scales;\n }\n var axes = this.assembleAxes();\n if (axes.length > 0) {\n group.axes = axes;\n }\n var legends = this.assembleLegends();\n if (legends.length > 0) {\n group.legends = legends;\n }\n return group;\n };\n Model.prototype.hasDescendantWithFieldOnChannel = function (channel) {\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n if (isUnitModel(child)) {\n if (child.channelHasField(channel)) {\n return true;\n }\n }\n else {\n if (child.hasDescendantWithFieldOnChannel(channel)) {\n return true;\n }\n }\n }\n return false;\n };\n Model.prototype.getName = function (text) {\n return util_1.varName((this.name ? this.name + '_' : '') + text);\n };\n /**\n * Request a data source name for the given data source type and mark that data source as required. This method should be called in parse, so that all used data source can be correctly instantiated in assembleData().\n */\n Model.prototype.requestDataName = function (name) {\n var fullName = this.getName(name);\n // Increase ref count. This is critical because otherwise we won't create a data source.\n // We also increase the ref counts on OutputNode.getSource() calls.\n var refCounts = this.component.data.outputNodeRefCounts;\n refCounts[fullName] = (refCounts[fullName] || 0) + 1;\n return fullName;\n };\n Model.prototype.getSizeSignalRef = function (sizeType) {\n if (isFacetModel(this.parent)) {\n var channel = sizeType === 'width' ? 'x' : 'y';\n var scaleComponent = this.component.scales[channel];\n if (scaleComponent && !scaleComponent.merged) {\n var type = scaleComponent.get('type');\n var range = scaleComponent.get('range');\n if (scale_1.hasDiscreteDomain(type) && vega_schema_1.isVgRangeStep(range)) {\n var scaleName = scaleComponent.get('name');\n var domain = domain_1.assembleDomain(this, channel);\n var fieldName = domain_1.getFieldFromDomain(domain);\n if (fieldName) {\n var fieldRef = fielddef_1.field({ aggregate: 'distinct', field: fieldName }, { expr: 'datum' });\n return {\n signal: assemble_2.sizeExpr(scaleName, scaleComponent, fieldRef)\n };\n }\n else {\n log.warn('Unknown field for ${channel}. Cannot calculate view size.');\n return null;\n }\n }\n }\n }\n return {\n signal: this.layoutSizeNameMap.get(this.getName(sizeType))\n };\n };\n /**\n * Lookup the name of the datasource for an output node. You probably want to call this in assemble.\n */\n Model.prototype.lookupDataSource = function (name) {\n var node = this.component.data.outputNodes[name];\n if (!node) {\n // Name not found in map so let's just return what we got.\n // This can happen if we already have the correct name.\n return name;\n }\n return node.getSource();\n };\n Model.prototype.getSizeName = function (oldSizeName) {\n return this.layoutSizeNameMap.get(oldSizeName);\n };\n Model.prototype.renameLayoutSize = function (oldName, newName) {\n this.layoutSizeNameMap.rename(oldName, newName);\n };\n Model.prototype.renameScale = function (oldName, newName) {\n this.scaleNameMap.rename(oldName, newName);\n };\n /**\n * @return scale name for a given channel after the scale has been parsed and named.\n */\n Model.prototype.scaleName = function (originalScaleName, parse) {\n if (parse) {\n // During the parse phase always return a value\n // No need to refer to rename map because a scale can't be renamed\n // before it has the original name.\n return this.getName(originalScaleName);\n }\n // If there is a scale for the channel, it should either\n // be in the scale component or exist in the name map\n if (\n // If there is a scale for the channel, there should be a local scale component for it\n (channel_1.isChannel(originalScaleName) && channel_1.isScaleChannel(originalScaleName) && this.component.scales[originalScaleName]) ||\n // in the scale name map (the the scale get merged by its parent)\n this.scaleNameMap.has(this.getName(originalScaleName))) {\n return this.scaleNameMap.get(this.getName(originalScaleName));\n }\n return undefined;\n };\n /**\n * Traverse a model's hierarchy to get the scale component for a particular channel.\n */\n Model.prototype.getScaleComponent = function (channel) {\n /* istanbul ignore next: This is warning for debugging test */\n if (!this.component.scales) {\n throw new Error('getScaleComponent cannot be called before parseScale(). Make sure you have called parseScale or use parseUnitModelWithScale().');\n }\n var localScaleComponent = this.component.scales[channel];\n if (localScaleComponent && !localScaleComponent.merged) {\n return localScaleComponent;\n }\n return (this.parent ? this.parent.getScaleComponent(channel) : undefined);\n };\n /**\n * Traverse a model's hierarchy to get a particular selection component.\n */\n Model.prototype.getSelectionComponent = function (varName, origName) {\n var sel = this.component.selection[varName];\n if (!sel && this.parent) {\n sel = this.parent.getSelectionComponent(varName, origName);\n }\n if (!sel) {\n throw new Error(log.message.selectionNotFound(origName));\n }\n return sel;\n };\n return Model;\n}());\nexports.Model = Model;\n/** Abstract class for UnitModel and FacetModel. Both of which can contain fieldDefs as a part of its own specification. */\nvar ModelWithField = /** @class */ (function (_super) {\n tslib_1.__extends(ModelWithField, _super);\n function ModelWithField() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /** Get \"field\" reference for vega */\n ModelWithField.prototype.field = function (channel, opt) {\n if (opt === void 0) { opt = {}; }\n var fieldDef = this.fieldDef(channel);\n if (!fieldDef) {\n return undefined;\n }\n return fielddef_1.field(fieldDef, opt);\n };\n ModelWithField.prototype.reduceFieldDef = function (f, init, t) {\n return encoding_1.reduce(this.getMapping(), function (acc, cd, c) {\n var fieldDef = fielddef_1.getFieldDef(cd);\n if (fieldDef) {\n return f(acc, fieldDef, c);\n }\n return acc;\n }, init, t);\n };\n ModelWithField.prototype.forEachFieldDef = function (f, t) {\n encoding_1.forEach(this.getMapping(), function (cd, c) {\n var fieldDef = fielddef_1.getFieldDef(cd);\n if (fieldDef) {\n f(fieldDef, c);\n }\n }, t);\n };\n return ModelWithField;\n}(Model));\nexports.ModelWithField = ModelWithField;\n\n\n/***/ }),\n/* 34 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************!*\\\n !*** ./~/vega-lite/build/src/mark.js ***!\n \\***************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nvar Mark;\n(function (Mark) {\n Mark.AREA = 'area';\n Mark.BAR = 'bar';\n Mark.LINE = 'line';\n Mark.POINT = 'point';\n Mark.RECT = 'rect';\n Mark.RULE = 'rule';\n Mark.TEXT = 'text';\n Mark.TICK = 'tick';\n Mark.CIRCLE = 'circle';\n Mark.SQUARE = 'square';\n})(Mark = exports.Mark || (exports.Mark = {}));\nexports.AREA = Mark.AREA;\nexports.BAR = Mark.BAR;\nexports.LINE = Mark.LINE;\nexports.POINT = Mark.POINT;\nexports.TEXT = Mark.TEXT;\nexports.TICK = Mark.TICK;\nexports.RECT = Mark.RECT;\nexports.RULE = Mark.RULE;\nexports.CIRCLE = Mark.CIRCLE;\nexports.SQUARE = Mark.SQUARE;\n// Using mapped type to declare index, ensuring we always have all marks when we add more.\nvar MARK_INDEX = {\n area: 1,\n bar: 1,\n line: 1,\n point: 1,\n text: 1,\n tick: 1,\n rect: 1,\n rule: 1,\n circle: 1,\n square: 1\n};\nfunction isMark(m) {\n return !!MARK_INDEX[m];\n}\nexports.isMark = isMark;\nexports.PRIMITIVE_MARKS = util_1.flagKeys(MARK_INDEX);\nfunction isMarkDef(mark) {\n return mark['type'];\n}\nexports.isMarkDef = isMarkDef;\nvar PRIMITIVE_MARK_INDEX = util_1.toSet(exports.PRIMITIVE_MARKS);\nfunction isPrimitiveMark(mark) {\n var markType = isMarkDef(mark) ? mark.type : mark;\n return markType in PRIMITIVE_MARK_INDEX;\n}\nexports.isPrimitiveMark = isPrimitiveMark;\nexports.STROKE_CONFIG = ['stroke', 'strokeWidth',\n 'strokeDash', 'strokeDashOffset', 'strokeOpacity'];\nexports.FILL_CONFIG = ['fill', 'fillOpacity'];\nexports.FILL_STROKE_CONFIG = [].concat(exports.STROKE_CONFIG, exports.FILL_CONFIG);\nexports.VL_ONLY_MARK_CONFIG_PROPERTIES = ['filled', 'color'];\nexports.VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = {\n bar: ['binSpacing', 'continuousBandSize', 'discreteBandSize'],\n text: ['shortTimeLabels'],\n tick: ['bandSize', 'thickness']\n};\nexports.defaultMarkConfig = {\n color: '#4c78a8',\n};\nexports.defaultBarConfig = {\n binSpacing: 1,\n continuousBandSize: 2\n};\nexports.defaultTickConfig = {\n thickness: 1\n};\n\n\n/***/ }),\n/* 35 */\n/* exports provided: accessor, accessorName, accessorFields, id, identity, zero, one, truthy, falsy, logger, None, Error, Warn, Info, Debug, array, compare, constant, debounce, error, extend, extentIndex, fastmap, field, inherits, isArray, isBoolean, isDate, isFunction, isNumber, isObject, isRegExp, isString, key, merge, pad, peek, repeat, splitAccessPath, stringValue, toBoolean, toDate, toNumber, toString, toSet, truncate, visitArray */\n/* all exports used */\n/*!******************************************!*\\\n !*** ./~/vega-lite/~/vega-util/index.js ***!\n \\******************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_accessor__ = __webpack_require__(/*! ./src/accessor */ 87);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"accessor\", function() { return __WEBPACK_IMPORTED_MODULE_0__src_accessor__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"accessorName\", function() { return __WEBPACK_IMPORTED_MODULE_0__src_accessor__[\"b\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"accessorFields\", function() { return __WEBPACK_IMPORTED_MODULE_0__src_accessor__[\"c\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_accessors__ = __webpack_require__(/*! ./src/accessors */ 633);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"id\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"identity\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"b\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"zero\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"c\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"one\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"d\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"truthy\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"e\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"falsy\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"f\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_logger__ = __webpack_require__(/*! ./src/logger */ 644);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"logger\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"None\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"b\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Error\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"c\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Warn\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"d\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Info\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"e\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Debug\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"f\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_array__ = __webpack_require__(/*! ./src/array */ 161);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"array\", function() { return __WEBPACK_IMPORTED_MODULE_3__src_array__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_compare__ = __webpack_require__(/*! ./src/compare */ 634);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"compare\", function() { return __WEBPACK_IMPORTED_MODULE_4__src_compare__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_constant__ = __webpack_require__(/*! ./src/constant */ 635);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"constant\", function() { return __WEBPACK_IMPORTED_MODULE_5__src_constant__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_debounce__ = __webpack_require__(/*! ./src/debounce */ 636);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"debounce\", function() { return __WEBPACK_IMPORTED_MODULE_6__src_debounce__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_error__ = __webpack_require__(/*! ./src/error */ 240);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"error\", function() { return __WEBPACK_IMPORTED_MODULE_7__src_error__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_extend__ = __webpack_require__(/*! ./src/extend */ 637);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"extend\", function() { return __WEBPACK_IMPORTED_MODULE_8__src_extend__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_extentIndex__ = __webpack_require__(/*! ./src/extentIndex */ 638);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"extentIndex\", function() { return __WEBPACK_IMPORTED_MODULE_9__src_extentIndex__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_fastmap__ = __webpack_require__(/*! ./src/fastmap */ 639);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"fastmap\", function() { return __WEBPACK_IMPORTED_MODULE_10__src_fastmap__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__src_field__ = __webpack_require__(/*! ./src/field */ 241);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"field\", function() { return __WEBPACK_IMPORTED_MODULE_11__src_field__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__src_inherits__ = __webpack_require__(/*! ./src/inherits */ 640);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"inherits\", function() { return __WEBPACK_IMPORTED_MODULE_12__src_inherits__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__src_isArray__ = __webpack_require__(/*! ./src/isArray */ 162);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isArray\", function() { return __WEBPACK_IMPORTED_MODULE_13__src_isArray__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__src_isBoolean__ = __webpack_require__(/*! ./src/isBoolean */ 641);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isBoolean\", function() { return __WEBPACK_IMPORTED_MODULE_14__src_isBoolean__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__src_isDate__ = __webpack_require__(/*! ./src/isDate */ 242);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isDate\", function() { return __WEBPACK_IMPORTED_MODULE_15__src_isDate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__src_isFunction__ = __webpack_require__(/*! ./src/isFunction */ 163);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isFunction\", function() { return __WEBPACK_IMPORTED_MODULE_16__src_isFunction__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__src_isNumber__ = __webpack_require__(/*! ./src/isNumber */ 243);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isNumber\", function() { return __WEBPACK_IMPORTED_MODULE_17__src_isNumber__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__src_isObject__ = __webpack_require__(/*! ./src/isObject */ 244);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isObject\", function() { return __WEBPACK_IMPORTED_MODULE_18__src_isObject__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__src_isRegExp__ = __webpack_require__(/*! ./src/isRegExp */ 642);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isRegExp\", function() { return __WEBPACK_IMPORTED_MODULE_19__src_isRegExp__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__src_isString__ = __webpack_require__(/*! ./src/isString */ 245);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isString\", function() { return __WEBPACK_IMPORTED_MODULE_20__src_isString__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__src_key__ = __webpack_require__(/*! ./src/key */ 643);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"key\", function() { return __WEBPACK_IMPORTED_MODULE_21__src_key__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__src_merge__ = __webpack_require__(/*! ./src/merge */ 645);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"merge\", function() { return __WEBPACK_IMPORTED_MODULE_22__src_merge__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__src_pad__ = __webpack_require__(/*! ./src/pad */ 646);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"pad\", function() { return __WEBPACK_IMPORTED_MODULE_23__src_pad__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__src_peek__ = __webpack_require__(/*! ./src/peek */ 647);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"peek\", function() { return __WEBPACK_IMPORTED_MODULE_24__src_peek__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__src_repeat__ = __webpack_require__(/*! ./src/repeat */ 246);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"repeat\", function() { return __WEBPACK_IMPORTED_MODULE_25__src_repeat__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__src_splitAccessPath__ = __webpack_require__(/*! ./src/splitAccessPath */ 110);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"splitAccessPath\", function() { return __WEBPACK_IMPORTED_MODULE_26__src_splitAccessPath__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__src_stringValue__ = __webpack_require__(/*! ./src/stringValue */ 111);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"stringValue\", function() { return __WEBPACK_IMPORTED_MODULE_27__src_stringValue__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__src_toBoolean__ = __webpack_require__(/*! ./src/toBoolean */ 648);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toBoolean\", function() { return __WEBPACK_IMPORTED_MODULE_28__src_toBoolean__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__src_toDate__ = __webpack_require__(/*! ./src/toDate */ 649);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toDate\", function() { return __WEBPACK_IMPORTED_MODULE_29__src_toDate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__src_toNumber__ = __webpack_require__(/*! ./src/toNumber */ 650);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toNumber\", function() { return __WEBPACK_IMPORTED_MODULE_30__src_toNumber__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__src_toString__ = __webpack_require__(/*! ./src/toString */ 652);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toString\", function() { return __WEBPACK_IMPORTED_MODULE_31__src_toString__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__src_toSet__ = __webpack_require__(/*! ./src/toSet */ 651);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toSet\", function() { return __WEBPACK_IMPORTED_MODULE_32__src_toSet__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__src_truncate__ = __webpack_require__(/*! ./src/truncate */ 653);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"truncate\", function() { return __WEBPACK_IMPORTED_MODULE_33__src_truncate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__src_visitArray__ = __webpack_require__(/*! ./src/visitArray */ 654);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"visitArray\", function() { return __WEBPACK_IMPORTED_MODULE_34__src_visitArray__[\"a\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n/* 36 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************!*\\\n !*** ./src/models/index.ts ***!\n \\*****************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\n t[p[i]] = s[p[i]];\n return t;\n};\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar schema_1 = __webpack_require__(/*! compassql/build/src/schema */ 59);\nvar bookmark_1 = __webpack_require__(/*! ./bookmark */ 264);\nvar config_1 = __webpack_require__(/*! ./config */ 95);\nvar custom_wildcard_field_1 = __webpack_require__(/*! ./custom-wildcard-field */ 706);\nvar dataset_1 = __webpack_require__(/*! ./dataset */ 265);\nvar log_1 = __webpack_require__(/*! ./log */ 266);\nvar related_views_1 = __webpack_require__(/*! ./related-views */ 267);\nvar shelf_preview_1 = __webpack_require__(/*! ./shelf-preview */ 268);\nvar tab_1 = __webpack_require__(/*! ./tab */ 269);\n__export(__webpack_require__(/*! ./bookmark */ 264));\n__export(__webpack_require__(/*! ./dataset */ 265));\n__export(__webpack_require__(/*! ./shelf */ 40));\n__export(__webpack_require__(/*! ./result */ 93));\n__export(__webpack_require__(/*! ./config */ 95));\n__export(__webpack_require__(/*! ./tab */ 269));\n;\nexports.DEFAULT_UNDOABLE_STATE_BASE = {\n customWildcardFields: custom_wildcard_field_1.DEFAULT_CUSTOM_WILDCARD_FIELDS,\n dataset: dataset_1.DEFAULT_DATASET,\n tab: tab_1.DEFAULT_TAB,\n};\nexports.DEFAULT_UNDOABLE_STATE = {\n past: [],\n present: exports.DEFAULT_UNDOABLE_STATE_BASE,\n future: [],\n _latestUnfiltered: null,\n group: null,\n index: null,\n limit: 30\n};\nexports.DEFAULT_PERSISTENT_STATE = {\n bookmark: bookmark_1.DEFAULT_BOOKMARK,\n config: config_1.DEFAULT_VOYAGER_CONFIG,\n log: log_1.DEFAULT_LOG,\n relatedViews: related_views_1.DEFAULT_RELATED_VIEWS,\n shelfPreview: shelf_preview_1.DEFAULT_SHELF_PREVIEW\n};\nexports.DEFAULT_STATE = {\n persistent: exports.DEFAULT_PERSISTENT_STATE,\n undoable: exports.DEFAULT_UNDOABLE_STATE\n};\nfunction toSerializable(state) {\n var _a = state.undoable.present, dataset = _a.dataset, undoableStateBaseWithoutDataset = __rest(_a, [\"dataset\"]);\n var schema = dataset.schema, datasetWithoutSchema = __rest(dataset, [\"schema\"]);\n return __assign({}, state.persistent, undoableStateBaseWithoutDataset, { dataset: datasetWithoutSchema, tableschema: schema.tableSchema() });\n}\nexports.toSerializable = toSerializable;\nfunction fromSerializable(serializable) {\n var \n // Data\n datasetWithoutSchema = serializable.dataset, tableschema = serializable.tableschema, \n // Persistent\n bookmark = serializable.bookmark, config = serializable.config, log = serializable.log, relatedViews = serializable.relatedViews, shelfPreview = serializable.shelfPreview, \n // Then the rest should be UndoableStateBaseWithoutDataset\n undoableStateBaseWithoutDataset = __rest(serializable, [\"dataset\", \"tableschema\", \"bookmark\", \"config\", \"log\", \"relatedViews\", \"shelfPreview\"]);\n var persistent = { bookmark: bookmark, config: config, relatedViews: relatedViews, shelfPreview: shelfPreview, log: log };\n var undoableBase = __assign({}, undoableStateBaseWithoutDataset, { dataset: __assign({}, datasetWithoutSchema, { schema: new schema_1.Schema(serializable.tableschema) }) });\n return {\n persistent: persistent,\n undoable: __assign({}, exports.DEFAULT_UNDOABLE_STATE, { present: undoableBase })\n };\n}\nexports.fromSerializable = fromSerializable;\n\n\n/***/ }),\n/* 37 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/core-js/library/modules/_wks.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(/*! ./_shared */ 137)('wks')\n , uid = __webpack_require__(/*! ./_uid */ 102)\n , Symbol = __webpack_require__(/*! ./_global */ 50).Symbol\n , USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function(name){\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n/***/ }),\n/* 38 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/data/dataflow.js ***!\n \\********************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\n/**\n * A node in the dataflow tree.\n */\nvar DataFlowNode = /** @class */ (function () {\n function DataFlowNode(debugName) {\n this.debugName = debugName;\n this._children = [];\n this._parent = null;\n }\n /**\n * Clone this node with a deep copy but don't clone links to children or parents.\n */\n DataFlowNode.prototype.clone = function () {\n throw new Error('Cannot clone node');\n };\n /**\n * Set of fields that are being created by this node.\n */\n DataFlowNode.prototype.producedFields = function () {\n return {};\n };\n DataFlowNode.prototype.dependentFields = function () {\n return {};\n };\n Object.defineProperty(DataFlowNode.prototype, \"parent\", {\n get: function () {\n return this._parent;\n },\n /**\n * Set the parent of the node and also add this not to the parent's children.\n */\n set: function (parent) {\n this._parent = parent;\n parent.addChild(this);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataFlowNode.prototype, \"children\", {\n get: function () {\n return this._children;\n },\n enumerable: true,\n configurable: true\n });\n DataFlowNode.prototype.numChildren = function () {\n return this._children.length;\n };\n DataFlowNode.prototype.addChild = function (child) {\n this._children.push(child);\n };\n DataFlowNode.prototype.removeChild = function (oldChild) {\n this._children.splice(this._children.indexOf(oldChild), 1);\n };\n /**\n * Remove node from the dataflow.\n */\n DataFlowNode.prototype.remove = function () {\n for (var _i = 0, _a = this._children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parent = this._parent;\n }\n this._parent.removeChild(this);\n };\n /**\n * Insert another node as a parent of this node.\n */\n DataFlowNode.prototype.insertAsParentOf = function (other) {\n var parent = other.parent;\n parent.removeChild(this);\n this.parent = parent;\n other.parent = this;\n };\n DataFlowNode.prototype.swapWithParent = function () {\n var parent = this._parent;\n var newParent = parent.parent;\n // reconnect the children\n for (var _i = 0, _a = this._children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parent = parent;\n }\n // remove old links\n this._children = []; // equivalent to removing every child link one by one\n parent.removeChild(this);\n parent.parent.removeChild(parent);\n // swap two nodes\n this.parent = newParent;\n parent.parent = this;\n };\n return DataFlowNode;\n}());\nexports.DataFlowNode = DataFlowNode;\nvar OutputNode = /** @class */ (function (_super) {\n tslib_1.__extends(OutputNode, _super);\n /**\n * @param source The name of the source. Will change in assemble.\n * @param type The type of the output node.\n * @param refCounts A global ref counter map.\n */\n function OutputNode(source, type, refCounts) {\n var _this = _super.call(this, source) || this;\n _this.type = type;\n _this.refCounts = refCounts;\n _this._source = _this._name = source;\n if (_this.refCounts && !(_this._name in _this.refCounts)) {\n _this.refCounts[_this._name] = 0;\n }\n return _this;\n }\n OutputNode.prototype.clone = function () {\n var cloneObj = new this.constructor;\n cloneObj.debugName = 'clone_' + this.debugName;\n cloneObj._source = this._source;\n cloneObj._name = 'clone_' + this._name;\n cloneObj.type = this.type;\n cloneObj.refCounts = this.refCounts;\n cloneObj.refCounts[cloneObj._name] = 0;\n return cloneObj;\n };\n /**\n * Request the datasource name and increase the ref counter.\n *\n * During the parsing phase, this will return the simple name such as 'main' or 'raw'.\n * It is crucial to request the name from an output node to mark it as a required node.\n * If nobody ever requests the name, this datasource will not be instantiated in the assemble phase.\n *\n * In the assemble phase, this will return the correct name.\n */\n OutputNode.prototype.getSource = function () {\n this.refCounts[this._name]++;\n return this._source;\n };\n OutputNode.prototype.isRequired = function () {\n return !!this.refCounts[this._name];\n };\n OutputNode.prototype.setSource = function (source) {\n this._source = source;\n };\n return OutputNode;\n}(DataFlowNode));\nexports.OutputNode = OutputNode;\n\n\n/***/ }),\n/* 39 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************!*\\\n !*** ./src/constants.ts ***!\n \\**************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HISTORY_LIMIT = 20;\nexports.PLOT_HOVER_MIN_DURATION = 500;\n/**\n * Types of draggable items (for react-dnd).\n */\nexports.DraggableType = {\n FIELD: 'field'\n};\n/**\n * Type of parent for Field Component\n */\nvar FieldParentType;\n(function (FieldParentType) {\n FieldParentType[FieldParentType[\"ENCODING_SHELF\"] = 0] = \"ENCODING_SHELF\";\n FieldParentType[FieldParentType[\"FIELD_LIST\"] = 1] = \"FIELD_LIST\";\n})(FieldParentType = exports.FieldParentType || (exports.FieldParentType = {}));\n;\nvar BASE_DATA_DIR = (undefined === 'production') ? 'datasets/' : 'node_modules/vega-datasets/';\nexports.SPINNER_COLOR = '#4C78A8';\nexports.DEFAULT_DATASETS = [\n {\n name: 'Barley',\n description: 'Barley yield by variety across the upper midwest in 1931 and 1932',\n url: 'data/barley.json',\n id: 'barley',\n group: 'sample'\n }, {\n name: 'Cars',\n description: 'Automotive statistics for a variety of car models between 1970 & 1982',\n url: 'data/cars.json',\n id: 'cars',\n group: 'sample'\n }, {\n name: 'Crimea',\n url: 'data/crimea.json',\n id: 'crimea',\n group: 'sample'\n }, {\n name: 'Driving',\n url: 'data/driving.json',\n id: 'driving',\n group: 'sample'\n }, {\n name: 'Iris',\n url: 'data/iris.json',\n id: 'iris',\n group: 'sample'\n }, {\n name: 'Jobs',\n url: 'data/jobs.json',\n id: 'jobs',\n group: 'sample'\n }, {\n name: 'Population',\n url: 'data/population.json',\n id: 'population',\n group: 'sample'\n }, {\n name: 'Movies',\n url: 'data/movies.json',\n id: 'movies',\n group: 'sample'\n }, {\n name: 'Birdstrikes',\n url: 'data/birdstrikes.json',\n id: 'birdstrikes',\n group: 'sample'\n }, {\n name: 'Burtin',\n url: 'data/burtin.json',\n id: 'burtin',\n group: 'sample'\n }, {\n name: 'Campaigns',\n url: 'data/weball26.json',\n id: 'weball26',\n group: 'sample'\n }\n].map(function (dataset) {\n return __assign({}, dataset, { url: BASE_DATA_DIR + dataset.url });\n});\nvar SERVER = undefined;\nexports.VOYAGER_CONFIG = {\n showDataSourceSelector: true,\n serverUrl: SERVER\n};\n\n\n/***/ }),\n/* 40 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************!*\\\n !*** ./src/models/shelf/index.ts ***!\n \\***********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util_1 = __webpack_require__(/*! vega-lite/build/src/util */ 2);\nvar spec_1 = __webpack_require__(/*! ./spec */ 57);\nvar spec_2 = __webpack_require__(/*! ./spec */ 57);\n__export(__webpack_require__(/*! ./spec */ 57));\n__export(__webpack_require__(/*! ./filter */ 46));\nexports.DEFAULT_SHELF = {\n spec: spec_2.DEFAULT_SHELF_UNIT_SPEC,\n filters: [],\n groupBy: 'auto',\n autoAddCount: true\n};\nvar SHELF_GROUP_BY_INDEX = {\n auto: 1,\n field: 1,\n fieldTransform: 1,\n encoding: 1\n};\nexports.SHELF_GROUP_BYS = Object.keys(SHELF_GROUP_BY_INDEX);\nfunction isShelfGroupBy(s) {\n return util_1.isString(s) && SHELF_GROUP_BY_INDEX[s];\n}\nexports.isShelfGroupBy = isShelfGroupBy;\nexports.DEFAULT_ORDER_BY = ['fieldOrder', 'aggregationQuality', 'effectiveness'];\nexports.DEFAULT_CHOOSE_BY = ['aggregationQuality', 'effectiveness'];\nfunction toQuery(params) {\n var spec = params.spec, autoAddCount = params.autoAddCount;\n var specQ = spec_2.toSpecQuery(spec);\n var _a = spec_2.hasWildcards(specQ), hasAnyWildcard = _a.hasAnyWildcard, hasWildcardFn = _a.hasWildcardFn, hasWildcardField = _a.hasWildcardField;\n var groupBy = params.groupBy !== 'auto' ? params.groupBy :\n getDefaultGroupBy({ hasWildcardFn: hasWildcardFn, hasWildcardField: hasWildcardField });\n return __assign({ spec: specQ, groupBy: groupBy, orderBy: exports.DEFAULT_ORDER_BY, chooseBy: exports.DEFAULT_CHOOSE_BY }, (hasAnyWildcard ? { config: { autoAddCount: autoAddCount } } : {}));\n}\nexports.toQuery = toQuery;\nfunction getDefaultGroupBy(args) {\n var hasWildcardFn = args.hasWildcardFn, hasWildcardField = args.hasWildcardField;\n return hasWildcardFn ? 'fieldTransform' :\n hasWildcardField ? 'field' :\n 'encoding';\n}\nexports.getDefaultGroupBy = getDefaultGroupBy;\nfunction autoAddFieldQuery(shelf, fieldDef) {\n var spec = spec_2.toSpecQuery(shelf);\n spec.encodings.push(spec_1.toFieldQuery(fieldDef, '?'));\n return {\n spec: spec,\n chooseBy: 'effectiveness'\n // TODO: customizable config\n };\n}\nexports.autoAddFieldQuery = autoAddFieldQuery;\n\n\n/***/ }),\n/* 41 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************************!*\\\n !*** ./~/inline-style-prefixer/utils/getPrefixedValue.js ***!\n \\***********************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getPrefixedValue;\nfunction getPrefixedValue(prefixedValue, value, keepUnprefixed) {\n if (keepUnprefixed) {\n return [prefixedValue, value];\n }\n return prefixedValue;\n}\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 42 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************************************************!*\\\n !*** ./~/react-jsonschema-form/lib/components/widgets/BaseInput.js ***!\n \\*********************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = __webpack_require__(/*! react */ 0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ 1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction BaseInput(props) {\n // Note: since React 15.2.0 we can't forward unknown element attributes, so we\n // exclude the \"options\" and \"schema\" ones here.\n var value = props.value,\n readonly = props.readonly,\n disabled = props.disabled,\n autofocus = props.autofocus,\n onBlur = props.onBlur,\n options = props.options,\n schema = props.schema,\n formContext = props.formContext,\n registry = props.registry,\n inputProps = _objectWithoutProperties(props, [\"value\", \"readonly\", \"disabled\", \"autofocus\", \"onBlur\", \"options\", \"schema\", \"formContext\", \"registry\"]);\n\n inputProps.type = options.inputType || inputProps.type || \"text\";\n var _onChange = function _onChange(_ref) {\n var value = _ref.target.value;\n\n return props.onChange(value === \"\" ? options.emptyValue : value);\n };\n return _react2.default.createElement(\"input\", _extends({\n className: \"form-control\",\n readOnly: readonly,\n disabled: disabled,\n autoFocus: autofocus,\n value: value == null ? \"\" : value\n }, inputProps, {\n onChange: _onChange,\n onBlur: onBlur && function (event) {\n return onBlur(inputProps.id, event.target.value);\n }\n }));\n}\n\nBaseInput.defaultProps = {\n type: \"text\",\n required: false,\n disabled: false,\n readonly: false,\n autofocus: false\n};\n\nif (undefined !== \"production\") {\n BaseInput.propTypes = {\n id: _propTypes2.default.string.isRequired,\n placeholder: _propTypes2.default.string,\n value: _propTypes2.default.any,\n required: _propTypes2.default.bool,\n disabled: _propTypes2.default.bool,\n readonly: _propTypes2.default.bool,\n autofocus: _propTypes2.default.bool,\n onChange: _propTypes2.default.func,\n onBlur: _propTypes2.default.func\n };\n}\n\nexports.default = BaseInput;\n\n/***/ }),\n/* 43 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/mark/mixins.js ***!\n \\******************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar fielddef_1 = __webpack_require__(/*! ../../fielddef */ 9);\nvar log = __webpack_require__(/*! ../../log */ 7);\nvar util = __webpack_require__(/*! ../../util */ 2);\nvar common_1 = __webpack_require__(/*! ../common */ 26);\nvar selection_1 = __webpack_require__(/*! ../selection/selection */ 22);\nvar ref = __webpack_require__(/*! ./valueref */ 63);\nfunction color(model) {\n var config = model.config;\n var filled = model.markDef.filled;\n var vgChannel = filled ? 'fill' : 'stroke';\n var e = nonPosition('color', model, {\n vgChannel: vgChannel,\n // fill/stroke has higher precedence than color\n defaultValue: common_1.getMarkConfig(vgChannel, model.markDef, config) ||\n common_1.getMarkConfig('color', model.markDef, config)\n });\n // If there is no fill, always fill symbols\n // with transparent fills https://github.com/vega/vega-lite/issues/1316\n if (!e.fill && util.contains(['bar', 'point', 'circle', 'square'], model.mark())) {\n e.fill = { value: 'transparent' };\n }\n return e;\n}\nexports.color = color;\nfunction markDefProperties(mark, props) {\n return props.reduce(function (m, prop) {\n if (mark[prop]) {\n m[prop] = { value: mark[prop] };\n }\n return m;\n }, {});\n}\nexports.markDefProperties = markDefProperties;\nfunction valueIfDefined(prop, value) {\n if (value !== undefined) {\n return _a = {}, _a[prop] = { value: value }, _a;\n }\n return undefined;\n var _a;\n}\nexports.valueIfDefined = valueIfDefined;\n/**\n * Return mixins for non-positional channels with scales. (Text doesn't have scale.)\n */\nfunction nonPosition(channel, model, opt) {\n // TODO: refactor how we refer to scale as discussed in https://github.com/vega/vega-lite/pull/1613\n if (opt === void 0) { opt = {}; }\n var defaultValue = opt.defaultValue, vgChannel = opt.vgChannel;\n var defaultRef = opt.defaultRef || (defaultValue !== undefined ? { value: defaultValue } : undefined);\n var channelDef = model.encoding[channel];\n return wrapCondition(model, channelDef, vgChannel || channel, function (cDef) {\n return ref.midPoint(channel, cDef, model.scaleName(channel), model.getScaleComponent(channel), null, // No need to provide stack for non-position as it does not affect mid point\n defaultRef);\n });\n}\nexports.nonPosition = nonPosition;\n/**\n * Return a mixin that include a Vega production rule for a Vega-Lite conditional channel definition.\n * or a simple mixin if channel def has no condition.\n */\nfunction wrapCondition(model, channelDef, vgChannel, refFn) {\n var condition = channelDef && channelDef.condition;\n var valueRef = refFn(channelDef);\n if (condition) {\n var conditionValueRef = refFn(condition);\n return _a = {},\n _a[vgChannel] = [\n tslib_1.__assign({ test: selection_1.predicate(model, condition.selection) }, conditionValueRef)\n ].concat((valueRef !== undefined ? [valueRef] : [])),\n _a;\n }\n else {\n return valueRef !== undefined ? (_b = {}, _b[vgChannel] = valueRef, _b) : {};\n }\n var _a, _b;\n}\nfunction text(model, channel) {\n if (channel === void 0) { channel = 'text'; }\n var channelDef = model.encoding[channel];\n return wrapCondition(model, channelDef, channel, function (cDef) { return ref.text(cDef, model.config); });\n}\nexports.text = text;\nfunction bandPosition(fieldDef, channel, model) {\n var scaleName = model.scaleName(channel);\n var sizeChannel = channel === 'x' ? 'width' : 'height';\n if (model.encoding.size) {\n var orient = model.markDef.orient;\n if (orient) {\n var centeredBandPositionMixins = (_a = {},\n // Use xc/yc and place the mark at the middle of the band\n // This way we never have to deal with size's condition for x/y position.\n _a[channel + 'c'] = ref.fieldRef(fieldDef, scaleName, {}, { band: 0.5 }),\n _a);\n if (fielddef_1.getFieldDef(model.encoding.size)) {\n log.warn(log.message.cannotUseSizeFieldWithBandSize(channel));\n // TODO: apply size to band and set scale range to some values between 0-1.\n // return {\n // ...centeredBandPositionMixins,\n // ...bandSize('size', model, {vgChannel: sizeChannel})\n // };\n }\n else if (fielddef_1.isValueDef(model.encoding.size)) {\n return tslib_1.__assign({}, centeredBandPositionMixins, nonPosition('size', model, { vgChannel: sizeChannel }));\n }\n }\n else {\n log.warn(log.message.cannotApplySizeToNonOrientedMark(model.markDef.type));\n }\n }\n return _b = {},\n _b[channel] = ref.fieldRef(fieldDef, scaleName, { binSuffix: 'range' }),\n _b[sizeChannel] = ref.band(scaleName),\n _b;\n var _a, _b;\n}\nexports.bandPosition = bandPosition;\nfunction centeredBandPosition(channel, model, defaultPosRef, defaultSizeRef) {\n var centerChannel = channel === 'x' ? 'xc' : 'yc';\n var sizeChannel = channel === 'x' ? 'width' : 'height';\n return tslib_1.__assign({}, pointPosition(channel, model, defaultPosRef, centerChannel), nonPosition('size', model, { defaultRef: defaultSizeRef, vgChannel: sizeChannel }));\n}\nexports.centeredBandPosition = centeredBandPosition;\nfunction binnedPosition(fieldDef, channel, scaleName, spacing, reverse) {\n if (channel === 'x') {\n return {\n x2: ref.bin(fieldDef, scaleName, 'start', reverse ? 0 : spacing),\n x: ref.bin(fieldDef, scaleName, 'end', reverse ? spacing : 0)\n };\n }\n else {\n return {\n y2: ref.bin(fieldDef, scaleName, 'start', reverse ? spacing : 0),\n y: ref.bin(fieldDef, scaleName, 'end', reverse ? 0 : spacing)\n };\n }\n}\nexports.binnedPosition = binnedPosition;\n/**\n * Return mixins for point (non-band) position channels.\n */\nfunction pointPosition(channel, model, defaultRef, vgChannel) {\n // TODO: refactor how refer to scale as discussed in https://github.com/vega/vega-lite/pull/1613\n var encoding = model.encoding, stack = model.stack;\n var valueRef = ref.stackable(channel, encoding[channel], model.scaleName(channel), model.getScaleComponent(channel), stack, defaultRef);\n return _a = {},\n _a[vgChannel || channel] = valueRef,\n _a;\n var _a;\n}\nexports.pointPosition = pointPosition;\n/**\n * Return mixins for x2, y2.\n * If channel is not specified, return one channel based on orientation.\n */\nfunction pointPosition2(model, defaultRef, channel) {\n var encoding = model.encoding, markDef = model.markDef, stack = model.stack;\n channel = channel || (markDef.orient === 'horizontal' ? 'x2' : 'y2');\n var baseChannel = channel === 'x2' ? 'x' : 'y';\n var valueRef = ref.stackable2(channel, encoding[baseChannel], encoding[channel], model.scaleName(baseChannel), model.getScaleComponent(baseChannel), stack, defaultRef);\n return _a = {}, _a[channel] = valueRef, _a;\n var _a;\n}\nexports.pointPosition2 = pointPosition2;\n\n\n/***/ }),\n/* 44 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/vega-lite/build/src/encoding.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = __webpack_require__(/*! ./channel */ 3);\nvar fielddef_1 = __webpack_require__(/*! ./fielddef */ 9);\nvar log = __webpack_require__(/*! ./log */ 7);\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nfunction channelHasField(encoding, channel) {\n var channelDef = encoding && encoding[channel];\n if (channelDef) {\n if (util_1.isArray(channelDef)) {\n return util_1.some(channelDef, function (fieldDef) { return !!fieldDef.field; });\n }\n else {\n return fielddef_1.isFieldDef(channelDef) || fielddef_1.hasConditionFieldDef(channelDef);\n }\n }\n return false;\n}\nexports.channelHasField = channelHasField;\nfunction isAggregate(encoding) {\n return util_1.some(channel_1.CHANNELS, function (channel) {\n if (channelHasField(encoding, channel)) {\n var channelDef = encoding[channel];\n if (util_1.isArray(channelDef)) {\n return util_1.some(channelDef, function (fieldDef) { return !!fieldDef.aggregate; });\n }\n else {\n var fieldDef = fielddef_1.getFieldDef(channelDef);\n return fieldDef && !!fieldDef.aggregate;\n }\n }\n return false;\n });\n}\nexports.isAggregate = isAggregate;\nfunction normalizeEncoding(encoding, mark) {\n return util_1.keys(encoding).reduce(function (normalizedEncoding, channel) {\n if (!channel_1.supportMark(channel, mark)) {\n // Drop unsupported channel\n log.warn(log.message.incompatibleChannel(channel, mark));\n return normalizedEncoding;\n }\n // Drop line's size if the field is aggregated.\n if (channel === 'size' && mark === 'line') {\n var fieldDef = fielddef_1.getFieldDef(encoding[channel]);\n if (fieldDef && fieldDef.aggregate) {\n log.warn(log.message.incompatibleChannel(channel, mark, 'when the field is aggregated.'));\n return normalizedEncoding;\n }\n }\n if (channel === 'detail' || channel === 'order') {\n var channelDef = encoding[channel];\n if (channelDef) {\n // Array of fieldDefs for detail channel (or production rule)\n normalizedEncoding[channel] = (util_1.isArray(channelDef) ? channelDef : [channelDef])\n .reduce(function (fieldDefs, fieldDef) {\n if (!fielddef_1.isFieldDef(fieldDef)) {\n log.warn(log.message.emptyFieldDef(fieldDef, channel));\n }\n else {\n fieldDefs.push(fielddef_1.normalizeFieldDef(fieldDef, channel));\n }\n return fieldDefs;\n }, []);\n }\n }\n else {\n // FIXME: remove this casting. (I don't know why Typescript doesn't infer this correctly here.)\n var channelDef = encoding[channel];\n if (!fielddef_1.isFieldDef(channelDef) && !fielddef_1.isValueDef(channelDef) && !fielddef_1.isConditionalDef(channelDef)) {\n log.warn(log.message.emptyFieldDef(channelDef, channel));\n return normalizedEncoding;\n }\n normalizedEncoding[channel] = fielddef_1.normalize(channelDef, channel);\n }\n return normalizedEncoding;\n }, {});\n}\nexports.normalizeEncoding = normalizeEncoding;\nfunction isRanged(encoding) {\n return encoding && ((!!encoding.x && !!encoding.x2) || (!!encoding.y && !!encoding.y2));\n}\nexports.isRanged = isRanged;\nfunction fieldDefs(encoding) {\n var arr = [];\n channel_1.CHANNELS.forEach(function (channel) {\n if (channelHasField(encoding, channel)) {\n var channelDef = encoding[channel];\n (util_1.isArray(channelDef) ? channelDef : [channelDef]).forEach(function (def) {\n if (fielddef_1.isFieldDef(def)) {\n arr.push(def);\n }\n else if (fielddef_1.hasConditionFieldDef(def)) {\n arr.push(def.condition);\n }\n });\n }\n });\n return arr;\n}\nexports.fieldDefs = fieldDefs;\nfunction forEach(mapping, f, thisArg) {\n if (!mapping) {\n return;\n }\n util_1.keys(mapping).forEach(function (c) {\n var channel = c;\n if (util_1.isArray(mapping[channel])) {\n mapping[channel].forEach(function (channelDef) {\n f.call(thisArg, channelDef, channel);\n });\n }\n else {\n f.call(thisArg, mapping[channel], channel);\n }\n });\n}\nexports.forEach = forEach;\nfunction reduce(mapping, f, init, thisArg) {\n if (!mapping) {\n return init;\n }\n return util_1.keys(mapping).reduce(function (r, c) {\n var channel = c;\n if (util_1.isArray(mapping[channel])) {\n return mapping[channel].reduce(function (r1, channelDef) {\n return f.call(thisArg, r1, channelDef, channel);\n }, r);\n }\n else {\n return f.call(thisArg, r, mapping[channel], channel);\n }\n }, init);\n}\nexports.reduce = reduce;\n\n\n/***/ }),\n/* 45 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************************!*\\\n !*** ./~/vega-lite/build/src/vega.schema.js ***!\n \\**********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nfunction isVgSignalRef(o) {\n return !!o['signal'];\n}\nexports.isVgSignalRef = isVgSignalRef;\nfunction isVgRangeStep(range) {\n return !!range['step'];\n}\nexports.isVgRangeStep = isVgRangeStep;\nfunction isDataRefUnionedDomain(domain) {\n if (!util_1.isArray(domain)) {\n return 'fields' in domain && !('data' in domain);\n }\n return false;\n}\nexports.isDataRefUnionedDomain = isDataRefUnionedDomain;\nfunction isFieldRefUnionDomain(domain) {\n if (!util_1.isArray(domain)) {\n return 'fields' in domain && 'data' in domain;\n }\n return false;\n}\nexports.isFieldRefUnionDomain = isFieldRefUnionDomain;\nfunction isDataRefDomain(domain) {\n if (!util_1.isArray(domain)) {\n return 'field' in domain && 'data' in domain;\n }\n return false;\n}\nexports.isDataRefDomain = isDataRefDomain;\nfunction isSignalRefDomain(domain) {\n if (!util_1.isArray(domain)) {\n return 'signal' in domain;\n }\n return false;\n}\nexports.isSignalRefDomain = isSignalRefDomain;\n\n\n/***/ }),\n/* 46 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************!*\\\n !*** ./src/models/shelf/filter.ts ***!\n \\************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar expandedtype_1 = __webpack_require__(/*! compassql/build/src/query/expandedtype */ 31);\nvar wildcard_1 = __webpack_require__(/*! compassql/build/src/wildcard */ 6);\nvar vegaExpression = __webpack_require__(/*! vega-expression */ 588);\nvar filter_1 = __webpack_require__(/*! vega-lite/build/src/filter */ 109);\nvar timeunit_1 = __webpack_require__(/*! vega-lite/build/src/timeunit */ 23);\nvar transform_1 = __webpack_require__(/*! vega-lite/build/src/transform */ 160);\nfunction fromTransforms(transforms) {\n if (!transforms) {\n return [];\n }\n else {\n return transforms.map(function (transform) {\n if (!transform_1.isFilter(transform)) {\n throw new Error('Voyager does not support transforms other than FilterTransform');\n }\n else if (!filter_1.isRangeFilter(transform.filter) && !filter_1.isOneOfFilter(transform.filter)) {\n throw new Error('Voyager does not support filters other than RangeFilter and OneOfFilter');\n }\n return transform.filter;\n });\n }\n}\nexports.fromTransforms = fromTransforms;\nfunction toTransforms(filters) {\n return filters.map(function (filter) { return ({ filter: filter }); });\n}\nexports.toTransforms = toTransforms;\n/**\n * Return a dataflow expression function for a given array of filter.\n * Following example code from https://github.com/uwdata/dataflow-api/blob/master/test/filter-test.js\n */\nfunction toPredicateFunction(filters) {\n var expr = '(' +\n filters.map(function (f) {\n return filter_1.fieldFilterExpression(f, false); // Do not use inrange as it is not included in the main Vega Expression\n }).join(')&&(') +\n ')';\n var ast = vegaExpression.parse(expr);\n var codegen = vegaExpression.codegen({\n whitelist: ['datum'],\n globalvar: 'global'\n });\n var value = codegen(ast);\n return new Function('datum', \"return \" + value.code + \";\");\n}\nexports.toPredicateFunction = toPredicateFunction;\nfunction createDefaultFilter(fieldDef, domain) {\n var field = fieldDef.field, type = fieldDef.type, fn = fieldDef.fn;\n if (wildcard_1.isWildcard(field)) {\n return;\n }\n switch (type) {\n case expandedtype_1.ExpandedType.QUANTITATIVE:\n return { field: field, range: domain };\n case expandedtype_1.ExpandedType.TEMPORAL:\n // TODO: consider if we want to change default time unit?\n var timeUnit = !wildcard_1.isWildcard(fn) && timeunit_1.isTimeUnit(fn) ? fn : 'year';\n return {\n timeUnit: timeUnit,\n field: field,\n range: getDefaultTimeRange(domain, timeUnit)\n };\n case expandedtype_1.ExpandedType.NOMINAL:\n case expandedtype_1.ExpandedType.ORDINAL:\n case expandedtype_1.ExpandedType.KEY:\n return { field: field, oneOf: domain };\n default:\n throw new Error('Unsupported type ' + fieldDef.type);\n }\n}\nexports.createDefaultFilter = createDefaultFilter;\nfunction getAllTimeUnits() {\n return [\n timeunit_1.TimeUnit.YEARMONTHDATE,\n timeunit_1.TimeUnit.YEAR,\n timeunit_1.TimeUnit.MONTH,\n timeunit_1.TimeUnit.QUARTER,\n timeunit_1.TimeUnit.DATE,\n timeunit_1.TimeUnit.DAY,\n timeunit_1.TimeUnit.HOURS,\n timeunit_1.TimeUnit.MINUTES,\n timeunit_1.TimeUnit.SECONDS,\n timeunit_1.TimeUnit.MILLISECONDS\n ];\n}\nexports.getAllTimeUnits = getAllTimeUnits;\nfunction getDefaultTimeRange(domain, timeUnit) {\n switch (timeUnit) {\n case timeunit_1.TimeUnit.YEARMONTHDATE:\n return [convertToDateTimeObject(Number(timeunit_1.convert(timeUnit, new Date(domain[0])))),\n convertToDateTimeObject(Number(timeunit_1.convert(timeUnit, new Date(domain[1]))))];\n case timeunit_1.TimeUnit.YEAR:\n return [timeunit_1.convert(timeUnit, new Date(domain[0])).getFullYear(),\n timeunit_1.convert(timeUnit, new Date(domain[1])).getFullYear()];\n case timeunit_1.TimeUnit.QUARTER:\n return [1, 4];\n case timeunit_1.TimeUnit.DATE:\n return [1, 31];\n case timeunit_1.TimeUnit.HOURS:\n return [0, 23];\n case timeunit_1.TimeUnit.MINUTES:\n return [0, 59];\n case timeunit_1.TimeUnit.SECONDS:\n return [0, 59];\n case timeunit_1.TimeUnit.MILLISECONDS:\n return [0, 999];\n case undefined:\n return [convertToDateTimeObject(Number(domain[0])), convertToDateTimeObject(Number(domain[1]))];\n }\n throw new Error('Cannot determine range for unsupported time unit ' + timeUnit);\n}\nexports.getDefaultTimeRange = getDefaultTimeRange;\nfunction getDefaultList(timeUnit) {\n switch (timeUnit) {\n case timeunit_1.TimeUnit.MONTH:\n return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'];\n case timeunit_1.TimeUnit.DAY:\n return ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];\n default:\n throw new Error('Invalid time unit ' + timeUnit);\n }\n}\nexports.getDefaultList = getDefaultList;\nfunction convertToDateTimeObject(timeStamp) {\n var date = new Date(timeStamp);\n return {\n year: date.getFullYear(),\n quarter: Math.floor((date.getMonth() + 3) / 3),\n month: date.getMonth() + 1,\n date: date.getDate(),\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n milliseconds: date.getMilliseconds(),\n utc: date.getTimezoneOffset() === 0\n };\n}\nexports.convertToDateTimeObject = convertToDateTimeObject;\nfunction convertToTimestamp(dateTime) {\n var date = new Date(dateTime.year, Number(dateTime.month) - 1, // 0-indexing\n dateTime.date, dateTime.hours, dateTime.minutes, dateTime.seconds, dateTime.milliseconds);\n return Number(date);\n}\nexports.convertToTimestamp = convertToTimestamp;\nfunction filterIndexOf(filters, field) {\n for (var i = 0; i < filters.length; i++) {\n var filter = filters[i];\n if (filter.field === field) {\n return i;\n }\n }\n return -1;\n}\nexports.filterIndexOf = filterIndexOf;\nfunction filterHasField(filters, field) {\n return filterIndexOf(filters, field) >= 0;\n}\nexports.filterHasField = filterHasField;\n\n\n/***/ }),\n/* 47 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************!*\\\n !*** ./~/classnames/index.js ***!\n \\*******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n Copyright (c) 2016 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tclasses.push(classNames.apply(null, arg));\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = classNames;\n\t} else if (true) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {\n\t\t\treturn classNames;\n\t\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n/***/ }),\n/* 48 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************!*\\\n !*** ./~/compassql/build/src/propindex.js ***!\n \\********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util_1 = __webpack_require__(/*! ./util */ 13);\nvar property_1 = __webpack_require__(/*! ./property */ 18);\n/**\n * Dictionary that takes property as a key.\n */\nvar PropIndex = /** @class */ (function () {\n function PropIndex(i) {\n if (i === void 0) { i = null; }\n this.index = i ? __assign({}, i) : {};\n }\n PropIndex.prototype.has = function (p) {\n return property_1.toKey(p) in this.index;\n };\n PropIndex.prototype.get = function (p) {\n return this.index[property_1.toKey(p)];\n };\n PropIndex.prototype.set = function (p, value) {\n this.index[property_1.toKey(p)] = value;\n return this;\n };\n PropIndex.prototype.setByKey = function (key, value) {\n this.index[key] = value;\n };\n PropIndex.prototype.map = function (f) {\n var i = new PropIndex();\n for (var k in this.index) {\n i.index[k] = f(this.index[k]);\n }\n return i;\n };\n PropIndex.prototype.size = function () {\n return util_1.keys(this.index).length;\n };\n PropIndex.prototype.duplicate = function () {\n return new PropIndex(this.index);\n };\n return PropIndex;\n}());\nexports.PropIndex = PropIndex;\n\n\n/***/ }),\n/* 49 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************************!*\\\n !*** ./~/core-js/library/modules/_export.js ***!\n \\**********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(/*! ./_global */ 50)\n , core = __webpack_require__(/*! ./_core */ 25)\n , ctx = __webpack_require__(/*! ./_ctx */ 128)\n , hide = __webpack_require__(/*! ./_hide */ 73)\n , PROTOTYPE = 'prototype';\n\nvar $export = function(type, name, source){\n var IS_FORCED = type & $export.F\n , IS_GLOBAL = type & $export.G\n , IS_STATIC = type & $export.S\n , IS_PROTO = type & $export.P\n , IS_BIND = type & $export.B\n , IS_WRAP = type & $export.W\n , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})\n , expProto = exports[PROTOTYPE]\n , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n , key, own, out;\n if(IS_GLOBAL)source = name;\n for(key in source){\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if(own && key in exports)continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function(C){\n var F = function(a, b, c){\n if(this instanceof C){\n switch(arguments.length){\n case 0: return new C;\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if(IS_PROTO){\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library` \nmodule.exports = $export;\n\n/***/ }),\n/* 50 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************************!*\\\n !*** ./~/core-js/library/modules/_global.js ***!\n \\**********************************************/\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef\n\n/***/ }),\n/* 51 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/core-js/library/modules/_object-dp.js ***!\n \\*************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(/*! ./_an-object */ 71)\n , IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ 191)\n , toPrimitive = __webpack_require__(/*! ./_to-primitive */ 139)\n , dP = Object.defineProperty;\n\nexports.f = __webpack_require__(/*! ./_descriptors */ 60) ? Object.defineProperty : function defineProperty(O, P, Attributes){\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if(IE8_DOM_DEFINE)try {\n return dP(O, P, Attributes);\n } catch(e){ /* empty */ }\n if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n if('value' in Attributes)O[P] = Attributes.value;\n return O;\n};\n\n/***/ }),\n/* 52 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/core-js/library/modules/_to-iobject.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(/*! ./_iobject */ 192)\n , defined = __webpack_require__(/*! ./_defined */ 129);\nmodule.exports = function(it){\n return IObject(defined(it));\n};\n\n/***/ }),\n/* 53 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************!*\\\n !*** ./~/create-react-class/index.js ***!\n \\***************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n\n\nvar React = __webpack_require__(/*! react */ 0);\nvar factory = __webpack_require__(/*! ./factory */ 416);\n\nif (typeof React === 'undefined') {\n throw Error(\n 'create-react-class could not find the React object. If you are using script tags, ' +\n 'make sure that React is being loaded before create-react-class.'\n );\n}\n\n// Hack to grab NoopUpdateQueue from isomorphic React\nvar ReactNoopUpdateQueue = new React.Component().updater;\n\nmodule.exports = factory(\n React.Component,\n React.isValidElement,\n ReactNoopUpdateQueue\n);\n\n\n/***/ }),\n/* 54 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/split.js ***!\n \\************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar log = __webpack_require__(/*! ../log */ 7);\nvar util_1 = __webpack_require__(/*! ../util */ 2);\n/**\n * Generic class for storing properties that are explicitly specified\n * and implicitly determined by the compiler.\n * This is important for scale/axis/legend merging as\n * we want to prioritize properties that users explicitly specified.\n */\nvar Split = /** @class */ (function () {\n function Split(explicit, implicit) {\n if (explicit === void 0) { explicit = {}; }\n if (implicit === void 0) { implicit = {}; }\n this.explicit = explicit;\n this.implicit = implicit;\n }\n Split.prototype.clone = function () {\n return new Split(util_1.duplicate(this.explicit), util_1.duplicate(this.implicit));\n };\n Split.prototype.combine = function () {\n // FIXME remove \"as any\".\n // Add \"as any\" to avoid an error \"Spread types may only be created from object types\".\n return tslib_1.__assign({}, this.explicit, this.implicit);\n };\n Split.prototype.get = function (key) {\n // Explicit has higher precedence\n return this.explicit[key] !== undefined ? this.explicit[key] : this.implicit[key];\n };\n Split.prototype.getWithExplicit = function (key) {\n // Explicit has higher precedence\n if (this.explicit[key] !== undefined) {\n return { explicit: true, value: this.explicit[key] };\n }\n else if (this.implicit[key] !== undefined) {\n return { explicit: false, value: this.implicit[key] };\n }\n return { explicit: false, value: undefined };\n };\n Split.prototype.setWithExplicit = function (key, value) {\n if (value.value !== undefined) {\n this.set(key, value.value, value.explicit);\n }\n };\n Split.prototype.set = function (key, value, explicit) {\n delete this[explicit ? 'implicit' : 'explicit'][key];\n this[explicit ? 'explicit' : 'implicit'][key] = value;\n return this;\n };\n Split.prototype.copyKeyFromSplit = function (key, s) {\n // Explicit has higher precedence\n if (s.explicit[key] !== undefined) {\n this.set(key, s.explicit[key], true);\n }\n else if (s.implicit[key] !== undefined) {\n this.set(key, s.implicit[key], false);\n }\n };\n Split.prototype.copyKeyFromObject = function (key, s) {\n // Explicit has higher precedence\n if (s[key] !== undefined) {\n this.set(key, s[key], true);\n }\n };\n return Split;\n}());\nexports.Split = Split;\nfunction makeExplicit(value) {\n return {\n explicit: true,\n value: value\n };\n}\nexports.makeExplicit = makeExplicit;\nfunction makeImplicit(value) {\n return {\n explicit: false,\n value: value\n };\n}\nexports.makeImplicit = makeImplicit;\nfunction tieBreakByComparing(compare) {\n return function (v1, v2, property, propertyOf) {\n var diff = compare(v1.value, v2.value);\n if (diff > 0) {\n return v1;\n }\n else if (diff < 0) {\n return v2;\n }\n return defaultTieBreaker(v1, v2, property, propertyOf);\n };\n}\nexports.tieBreakByComparing = tieBreakByComparing;\nfunction defaultTieBreaker(v1, v2, property, propertyOf) {\n if (v1.explicit && v2.explicit) {\n log.warn(log.message.mergeConflictingProperty(property, propertyOf, v1.value, v2.value));\n }\n // If equal score, prefer v1.\n return v1;\n}\nexports.defaultTieBreaker = defaultTieBreaker;\nfunction mergeValuesWithExplicit(v1, v2, property, propertyOf, tieBreaker) {\n if (tieBreaker === void 0) { tieBreaker = defaultTieBreaker; }\n if (v1 === undefined || v1.value === undefined) {\n // For first run\n return v2;\n }\n if (v1.explicit && !v2.explicit) {\n return v1;\n }\n else if (v2.explicit && !v1.explicit) {\n return v2;\n }\n else if (v1.value === v2.value) {\n return v1;\n }\n else {\n return tieBreaker(v1, v2, property, propertyOf);\n }\n}\nexports.mergeValuesWithExplicit = mergeValuesWithExplicit;\n\n\n/***/ }),\n/* 55 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************!*\\\n !*** ./~/vega-lite/build/src/data.js ***!\n \\***************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/*\n * Constants and utilities for data.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isUrlData(data) {\n return !!data['url'];\n}\nexports.isUrlData = isUrlData;\nfunction isInlineData(data) {\n return !!data['values'];\n}\nexports.isInlineData = isInlineData;\nfunction isNamedData(data) {\n return !!data['name'];\n}\nexports.isNamedData = isNamedData;\nexports.MAIN = 'main';\nexports.RAW = 'raw';\n\n\n/***/ }),\n/* 56 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************!*\\\n !*** ./src/actions/shelf/spec.ts ***!\n \\***********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SPEC_CLEAR = 'SPEC_CLEAR';\nexports.SPEC_MARK_CHANGE_TYPE = 'SPEC_MARK_CHANGE_TYPE';\n// Field\nexports.SPEC_FIELD_ADD = 'SPEC_FIELD_ADD';\nexports.SPEC_FIELD_AUTO_ADD = 'SPEC_FIELD_AUTO_ADD';\nexports.SPEC_FIELD_REMOVE = 'SPEC_FIELD_REMOVE';\nexports.SPEC_FIELD_MOVE = 'SPEC_FIELD_MOVE';\n/**\n * Change a property of a FieldDef to a specific value.\n */\nexports.SPEC_FIELD_PROP_CHANGE = 'SPEC_FIELD_PROP_CHANGE';\n/**\n * Change nested property of a FieldDef to a specific value.\n */\nexports.SPEC_FIELD_NESTED_PROP_CHANGE = 'SPEC_FIELD_NESTED_PROP_CHANGE';\n/**\n * Change Function of a FieldDef to a specific value.\n */\nexports.SPEC_FUNCTION_CHANGE = 'SPEC_FUNCTION_CHANGE';\nexports.SPEC_FUNCTION_ADD_WILDCARD = 'SPEC_FUNCTION_ADD_WILDCARD';\nexports.SPEC_FUNCTION_DISABLE_WILDCARD = 'SPEC_FUNCTION_DISABLE_WILDCARD';\nexports.SPEC_FUNCTION_ENABLE_WILDCARD = 'SPEC_FUNCTION_ENABLE_WILDCARD';\nexports.SPEC_FUNCTION_REMOVE_WILDCARD = 'SPEC_FUNCTION_REMOVE_WILDCARD';\nexports.SPEC_LOAD = 'SPEC_LOAD';\nexports.SPEC_ACTION_TYPE_INDEX = {\n SPEC_CLEAR: 1,\n SPEC_LOAD: 1,\n SPEC_MARK_CHANGE_TYPE: 1,\n SPEC_FIELD_ADD: 1,\n SPEC_FIELD_AUTO_ADD: 1,\n SPEC_FIELD_MOVE: 1,\n SPEC_FIELD_PROP_CHANGE: 1,\n SPEC_FIELD_NESTED_PROP_CHANGE: 1,\n SPEC_FIELD_REMOVE: 1,\n SPEC_FUNCTION_CHANGE: 1,\n SPEC_FUNCTION_ADD_WILDCARD: 1,\n SPEC_FUNCTION_DISABLE_WILDCARD: 1,\n SPEC_FUNCTION_ENABLE_WILDCARD: 1,\n SPEC_FUNCTION_REMOVE_WILDCARD: 1\n};\nfunction isSpecAction(a) {\n return exports.SPEC_ACTION_TYPE_INDEX[a.type];\n}\nexports.isSpecAction = isSpecAction;\n\n\n/***/ }),\n/* 57 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************!*\\\n !*** ./src/models/shelf/spec/index.ts ***!\n \\****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar encoding_1 = __webpack_require__(/*! compassql/build/src/query/encoding */ 14);\nvar wildcard_1 = __webpack_require__(/*! compassql/build/src/wildcard */ 6);\nvar encoding_2 = __webpack_require__(/*! ./encoding */ 170);\n__export(__webpack_require__(/*! ./encoding */ 170));\n__export(__webpack_require__(/*! ./function */ 171));\nfunction toSpecQuery(spec) {\n return {\n mark: spec.mark,\n encodings: specificEncodingsToEncodingQueries(spec.encoding).concat(spec.anyEncodings.map(function (fieldDef) { return encoding_2.toEncodingQuery(fieldDef, '?'); })),\n config: spec.config\n };\n}\nexports.toSpecQuery = toSpecQuery;\nfunction fromSpecQuery(spec, oldConfig) {\n var mark = spec.mark, encodings = spec.encodings, config = spec.config, transform = spec.transform;\n if (wildcard_1.isWildcardDef(mark)) {\n throw new Error('Voyager 2 does not support custom wildcard mark yet');\n }\n if (transform && transform.length > 0) {\n throw new Error('fromSpecQuery should not contain transform');\n }\n return __assign({ mark: mark }, encoding_2.fromEncodingQueries(encodings), { config: config || oldConfig });\n}\nexports.fromSpecQuery = fromSpecQuery;\n// FIXME: remove this method and rely on CompassQL's method.\nfunction hasWildcards(spec) {\n var hasWildcardField = false, hasWildcardFn = false, hasWildcardChannel = false;\n for (var _i = 0, _a = spec.encodings; _i < _a.length; _i++) {\n var encQ = _a[_i];\n if (encoding_1.isValueQuery(encQ)) {\n continue;\n }\n else if (encoding_1.isAutoCountQuery(encQ)) {\n if (wildcard_1.isWildcard(encQ.autoCount)) {\n hasWildcardFn = true;\n }\n }\n else {\n if (wildcard_1.isWildcard(encQ.field)) {\n hasWildcardField = true;\n }\n if (wildcard_1.isWildcard(encQ.aggregate) ||\n wildcard_1.isWildcard(encQ.bin) ||\n wildcard_1.isWildcard(encQ.timeUnit)) {\n hasWildcardFn = true;\n }\n if (wildcard_1.isWildcard(encQ.channel)) {\n hasWildcardChannel = true;\n }\n }\n }\n return {\n hasAnyWildcard: hasWildcardChannel || hasWildcardField || hasWildcardFn,\n hasWildcardField: hasWildcardField,\n hasWildcardFn: hasWildcardFn,\n hasWildcardChannel: hasWildcardChannel\n };\n}\nexports.hasWildcards = hasWildcards;\nfunction specificEncodingsToEncodingQueries(encoding) {\n // Assemble definition of encodings with specific channels first\n return Object.keys(encoding).map(function (channel) {\n return encoding_2.toFieldQuery(encoding[channel], channel);\n });\n}\nexports.DEFAULT_SHELF_UNIT_SPEC = {\n mark: wildcard_1.SHORT_WILDCARD,\n encoding: {},\n anyEncodings: [],\n config: {}\n};\n\n\n/***/ }),\n/* 58 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************!*\\\n !*** ./src/selectors/shelf.ts ***!\n \\********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar reselect_1 = __webpack_require__(/*! reselect */ 86);\nvar index_1 = __webpack_require__(/*! ../models/shelf/index */ 40);\nvar spec_1 = __webpack_require__(/*! ../models/shelf/spec */ 57);\nvar tab_1 = __webpack_require__(/*! ./tab */ 173);\nexports.selectShelf = reselect_1.createSelector(tab_1.selectActiveTab, function (plotTabState) { return plotTabState.shelf; });\nexports.selectShelfGroupBy = reselect_1.createSelector(exports.selectShelf, function (shelf) { return shelf.groupBy; });\nexports.selectShelfSpec = reselect_1.createSelector(exports.selectShelf, function (shelf) { return shelf.spec; });\nexports.selectFilters = reselect_1.createSelector(exports.selectShelf, function (shelf) { return shelf.filters; });\nexports.selectShelfAutoAddCount = reselect_1.createSelector(exports.selectShelf, function (shelf) { return shelf.autoAddCount; });\nexports.selectQuery = reselect_1.createSelector(exports.selectShelfSpec, exports.selectShelfGroupBy, exports.selectShelfAutoAddCount, function (spec, groupBy, autoAddCount) {\n return index_1.toQuery({ spec: spec, groupBy: groupBy, autoAddCount: autoAddCount });\n});\nexports.selectQuerySpec = reselect_1.createSelector(exports.selectQuery, function (query) { return query.spec; });\nexports.selectDefaultGroupBy = reselect_1.createSelector(exports.selectQuerySpec, function (specQ) {\n return index_1.getDefaultGroupBy(spec_1.hasWildcards(specQ));\n});\nexports.selectIsQuerySpecific = reselect_1.createSelector(exports.selectQuerySpec, function (spec) {\n return !spec_1.hasWildcards(spec).hasAnyWildcard;\n});\nexports.selectIsQueryEmpty = reselect_1.createSelector(exports.selectQuerySpec, function (spec) {\n return spec.encodings.length === 0;\n});\n\n\n/***/ }),\n/* 59 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************!*\\\n !*** ./~/compassql/build/src/schema.js ***!\n \\*****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar type_1 = __webpack_require__(/*! vega-lite/build/src/type */ 16);\nvar bin_1 = __webpack_require__(/*! vega-lite/build/src/bin */ 155);\nvar timeunit_1 = __webpack_require__(/*! vega-lite/build/src/timeunit */ 23);\nvar stats_1 = __webpack_require__(/*! datalib/src/stats */ 422);\nvar type_2 = __webpack_require__(/*! datalib/src/import/type */ 202);\nvar dlBin = __webpack_require__(/*! datalib/src/bins/bins */ 420);\nvar encoding_1 = __webpack_require__(/*! ./query/encoding */ 14);\nvar expandedtype_1 = __webpack_require__(/*! ./query/expandedtype */ 31);\nvar config_1 = __webpack_require__(/*! ./config */ 69);\nvar util_1 = __webpack_require__(/*! ./util */ 13);\n/**\n * Build a Schema object.\n *\n * @param data - a set of raw data in the same format that Vega-Lite / Vega takes\n * Basically, it's an array in the form of:\n *\n * [\n * {a: 1, b:2},\n * {a: 2, b:3},\n * ...\n * ]\n *\n * @return a Schema object\n */\nfunction build(data, tableSchema, opt) {\n if (tableSchema === void 0) { tableSchema = { fields: [] }; }\n if (opt === void 0) { opt = {}; }\n opt = util_1.extend({}, config_1.DEFAULT_QUERY_CONFIG, opt);\n // create profiles for each variable\n var summaries = stats_1.summary(data);\n var types = type_2.inferAll(data); // inferAll does stronger type inference than summary\n var tableSchemaFieldIndex = tableSchema.fields.reduce(function (m, field) {\n m[field.name] = field;\n return m;\n }, {});\n var fieldSchemas = summaries.map(function (fieldProfile, index) {\n var name = fieldProfile.field;\n // In Table schema, 'date' doesn't include time so use 'datetime'\n var type = types[name] === 'date' ? PrimitiveType.DATETIME : types[name];\n var distinct = fieldProfile.distinct;\n var vlType;\n if (type === PrimitiveType.NUMBER) {\n vlType = type_1.Type.QUANTITATIVE;\n }\n else if (type === PrimitiveType.INTEGER) {\n // use ordinal or nominal when cardinality of integer type is relatively low and the distinct values are less than an amount specified in options\n if ((distinct < opt.numberNominalLimit) && (distinct / fieldProfile.count < opt.numberNominalProportion)) {\n vlType = type_1.Type.NOMINAL;\n }\n else {\n vlType = type_1.Type.QUANTITATIVE;\n }\n }\n else if (type === PrimitiveType.DATETIME) {\n vlType = type_1.Type.TEMPORAL;\n // need to get correct min/max of date data because datalib's summary method does not\n // calculate this correctly for date types.\n fieldProfile.min = new Date(data[0][name]);\n fieldProfile.max = new Date(data[0][name]);\n for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {\n var dataEntry = data_1[_i];\n var time = new Date(dataEntry[name]).getTime();\n if (time < fieldProfile.min.getTime()) {\n fieldProfile.min = new Date(time);\n }\n if (time > fieldProfile.max.getTime()) {\n fieldProfile.max = new Date(time);\n }\n }\n }\n else {\n vlType = type_1.Type.NOMINAL;\n }\n if (vlType === type_1.Type.NOMINAL\n && distinct / fieldProfile.count > opt.minPercentUniqueForKey\n && fieldProfile.count > opt.minCardinalityForKey) {\n vlType = expandedtype_1.ExpandedType.KEY;\n }\n var fieldSchema = {\n name: name,\n // Need to keep original index for re-exporting TableSchema\n originalIndex: index,\n vlType: vlType,\n type: type,\n stats: fieldProfile,\n timeStats: {},\n binStats: {}\n };\n // extend field schema with table schema field - if present\n var orgFieldSchema = tableSchemaFieldIndex[fieldSchema.name];\n fieldSchema = util_1.extend(fieldSchema, orgFieldSchema);\n return fieldSchema;\n });\n // calculate preset bins for quantitative and temporal data\n for (var _i = 0, fieldSchemas_1 = fieldSchemas; _i < fieldSchemas_1.length; _i++) {\n var fieldSchema = fieldSchemas_1[_i];\n if (fieldSchema.vlType === type_1.Type.QUANTITATIVE) {\n for (var _a = 0, _b = opt.enum.binProps.maxbins; _a < _b.length; _a++) {\n var maxbins = _b[_a];\n fieldSchema.binStats[maxbins] = binSummary(maxbins, fieldSchema.stats);\n }\n }\n else if (fieldSchema.vlType === type_1.Type.TEMPORAL) {\n for (var _c = 0, _d = opt.enum.timeUnit; _c < _d.length; _c++) {\n var unit = _d[_c];\n if (unit !== undefined) {\n fieldSchema.timeStats[unit] = timeSummary(unit, fieldSchema.stats);\n }\n }\n }\n }\n var derivedTableSchema = __assign({}, tableSchema, { fields: fieldSchemas });\n return new Schema(derivedTableSchema);\n}\nexports.build = build;\n// order the field schema when we construct a new Schema\n// this orders the fields in the UI\nvar order = {\n 'nominal': 0,\n 'key': 1,\n 'ordinal': 2,\n 'temporal': 3,\n 'quantitative': 4\n};\nvar Schema = /** @class */ (function () {\n function Schema(tableSchema) {\n this._tableSchema = tableSchema;\n tableSchema.fields.sort(function (a, b) {\n // first order by vlType: nominal < temporal < quantitative < ordinal\n if (order[a.vlType] < order[b.vlType]) {\n return -1;\n }\n else if (order[a.vlType] > order[b.vlType]) {\n return 1;\n }\n else {\n // then order by field (alphabetically)\n return a.name.localeCompare(b.name);\n }\n });\n // Add index for sorting\n tableSchema.fields.forEach(function (fieldSchema, index) { return fieldSchema.index = index; });\n this._fieldSchemaIndex = tableSchema.fields.reduce(function (m, fieldSchema) {\n m[fieldSchema.name] = fieldSchema;\n return m;\n }, {});\n }\n /** @return a list of the field names (for enumerating). */\n Schema.prototype.fieldNames = function () {\n return this._tableSchema.fields.map(function (fieldSchema) { return fieldSchema.name; });\n };\n Object.defineProperty(Schema.prototype, \"fieldSchemas\", {\n /** @return a list of FieldSchemas */\n get: function () {\n return this._tableSchema.fields;\n },\n enumerable: true,\n configurable: true\n });\n Schema.prototype.fieldSchema = function (fieldName) {\n return this._fieldSchemaIndex[fieldName];\n };\n Schema.prototype.tableSchema = function () {\n // the fieldschemas are re-arranged\n // but this is not allowed in table schema.\n // so we will re-order based on original index.\n var tableSchema = util_1.duplicate(this._tableSchema);\n tableSchema.fields.sort(function (a, b) { return a.originalIndex - b.originalIndex; });\n return tableSchema;\n };\n /**\n * @return primitive type of the field if exist, otherwise return null\n */\n Schema.prototype.primitiveType = function (fieldName) {\n return this._fieldSchemaIndex[fieldName] ? this._fieldSchemaIndex[fieldName].type : null;\n };\n /**\n * @return vlType of measturement of the field if exist, otherwise return null\n */\n Schema.prototype.vlType = function (fieldName) {\n return this._fieldSchemaIndex[fieldName] ? this._fieldSchemaIndex[fieldName].vlType : null;\n };\n /** @return cardinality of the field associated with encQ, null if it doesn't exist.\n * @param augmentTimeUnitDomain - TimeUnit field domains will not be augmented if explicitly set to false.\n */\n Schema.prototype.cardinality = function (fieldQ, augmentTimeUnitDomain, excludeInvalid) {\n if (augmentTimeUnitDomain === void 0) { augmentTimeUnitDomain = true; }\n if (excludeInvalid === void 0) { excludeInvalid = false; }\n var fieldSchema = this._fieldSchemaIndex[fieldQ.field];\n if (fieldQ.aggregate || (encoding_1.isAutoCountQuery(fieldQ) && fieldQ.autoCount)) {\n return 1;\n }\n else if (fieldQ.bin) {\n // encQ.bin will either be a boolean or a BinQuery\n var bin = void 0;\n if (typeof fieldQ.bin === 'boolean') {\n // autoMaxBins defaults to 10 if channel is Wildcard\n bin = {\n maxbins: bin_1.autoMaxBins(fieldQ.channel)\n };\n }\n else if (fieldQ.bin === '?') {\n bin = {\n enum: [true, false]\n };\n }\n else {\n bin = fieldQ.bin;\n }\n var maxbins = bin.maxbins;\n if (!fieldSchema.binStats[maxbins]) {\n // need to calculate\n fieldSchema.binStats[maxbins] = binSummary(maxbins, fieldSchema.stats);\n }\n // don't need to worry about excludeInvalid here because invalid values don't affect linearly binned field's cardinality\n return fieldSchema.binStats[maxbins].distinct;\n }\n else if (fieldQ.timeUnit) {\n if (augmentTimeUnitDomain) {\n switch (fieldQ.timeUnit) {\n // TODO: this should not always be the case once Vega-Lite supports turning off domain augmenting (VL issue #1385)\n case timeunit_1.TimeUnit.SECONDS: return 60;\n case timeunit_1.TimeUnit.MINUTES: return 60;\n case timeunit_1.TimeUnit.HOURS: return 24;\n case timeunit_1.TimeUnit.DAY: return 7;\n case timeunit_1.TimeUnit.DATE: return 31;\n case timeunit_1.TimeUnit.MONTH: return 12;\n case timeunit_1.TimeUnit.QUARTER: return 4;\n case timeunit_1.TimeUnit.MILLISECONDS: return 1000;\n }\n }\n var unit = fieldQ.timeUnit;\n var timeStats = fieldSchema.timeStats;\n // if the cardinality for the timeUnit is not cached, calculate it\n if (!timeStats || !timeStats[unit]) {\n timeStats = __assign({}, timeStats, (_a = {}, _a[unit] = timeSummary(fieldQ.timeUnit, fieldSchema.stats), _a));\n }\n if (excludeInvalid) {\n return timeStats[unit].distinct - invalidCount(timeStats[unit].unique, ['Invalid Date', null]);\n }\n else {\n return timeStats[unit].distinct;\n }\n }\n else {\n if (fieldSchema) {\n if (excludeInvalid) {\n return fieldSchema.stats.distinct - invalidCount(fieldSchema.stats.unique, [NaN, null]);\n }\n else {\n return fieldSchema.stats.distinct;\n }\n }\n else {\n return null;\n }\n }\n var _a;\n };\n /**\n * Given an EncodingQuery with a timeUnit, returns true if the date field\n * has multiple distinct values for all parts of the timeUnit. Returns undefined\n * if the timeUnit is undefined.\n * i.e.\n * ('yearmonth', [Jan 1 2000, Feb 2 2000] returns false)\n * ('yearmonth', [Jan 1 2000, Feb 2 2001] returns true)\n */\n Schema.prototype.timeUnitHasVariation = function (fieldQ) {\n if (!fieldQ.timeUnit) {\n return;\n }\n // if there is no variation in `date`, there should not be variation in `day`\n if (fieldQ.timeUnit === timeunit_1.TimeUnit.DAY) {\n var dateEncQ = util_1.extend({}, fieldQ, { timeUnit: timeunit_1.TimeUnit.DATE });\n if (this.cardinality(dateEncQ, false, true) <= 1) {\n return false;\n }\n }\n var fullTimeUnit = fieldQ.timeUnit;\n for (var _i = 0, TIMEUNIT_PARTS_1 = timeunit_1.TIMEUNIT_PARTS; _i < TIMEUNIT_PARTS_1.length; _i++) {\n var timeUnitPart = TIMEUNIT_PARTS_1[_i];\n if (timeunit_1.containsTimeUnit(fullTimeUnit, timeUnitPart)) {\n // Create a clone of encQ, but with singleTimeUnit\n var singleUnitEncQ = util_1.extend({}, fieldQ, { timeUnit: timeUnitPart });\n if (this.cardinality(singleUnitEncQ, false, true) <= 1) {\n return false;\n }\n }\n }\n return true;\n };\n Schema.prototype.domain = function (fieldQueryParts) {\n // TODO: differentiate for field with bin / timeUnit\n var fieldSchema = this._fieldSchemaIndex[fieldQueryParts.field];\n var domain = util_1.keys(fieldSchema.stats.unique);\n if (fieldSchema.vlType === type_1.Type.QUANTITATIVE) {\n // return [min, max], coerced into number types\n return [+fieldSchema.stats.min, +fieldSchema.stats.max];\n }\n else if (fieldSchema.type === PrimitiveType.DATETIME) {\n // return [min, max] dates\n return [fieldSchema.stats.min, fieldSchema.stats.max];\n }\n else if (fieldSchema.type === PrimitiveType.INTEGER ||\n fieldSchema.type === PrimitiveType.NUMBER) {\n // coerce non-quantitative numerical data into number type\n domain = domain.map(function (x) { return +x; });\n return domain.sort(util_1.cmp);\n }\n else if ((fieldSchema.vlType === type_1.Type.ORDINAL) && fieldSchema.ordinalDomain) {\n return fieldSchema.ordinalDomain;\n }\n return domain.map(function (x) {\n // Convert 'null' to null as it is encoded similarly in datalib.\n // This is wrong when it is a string 'null' but that rarely happens.\n return x === 'null' ? null : x;\n }).sort(util_1.cmp);\n };\n /**\n * @return a Summary corresponding to the field of the given EncodingQuery\n */\n Schema.prototype.stats = function (fieldQ) {\n // TODO: differentiate for field with bin / timeUnit vs without\n var fieldSchema = this._fieldSchemaIndex[fieldQ.field];\n return fieldSchema ? fieldSchema.stats : null;\n };\n return Schema;\n}());\nexports.Schema = Schema;\n/**\n * @return a summary of the binning scheme determined from the given max number of bins\n */\nfunction binSummary(maxbins, summary) {\n var bin = dlBin({\n min: summary.min,\n max: summary.max,\n maxbins: maxbins\n });\n // start with summary, pre-binning\n var result = util_1.extend({}, summary);\n result.unique = binUnique(bin, summary.unique);\n result.distinct = (bin.stop - bin.start) / bin.step;\n result.min = bin.start;\n result.max = bin.stop;\n return result;\n}\n/** @return a modified version of the passed summary with unique and distinct set according to the timeunit.\n * Maps 'null' (string) keys to the null value and invalid dates to 'Invalid Date' in the unique dictionary.\n */\nfunction timeSummary(timeunit, summary) {\n var result = util_1.extend({}, summary);\n var unique = {};\n util_1.keys(summary.unique).forEach(function (dateString) {\n // don't convert null value because the Date constructor will actually convert it to a date\n var date = (dateString === 'null') ? null : new Date(dateString);\n // at this point, `date` is either the null value, a valid Date object, or \"Invalid Date\" which is a Date\n var key;\n if (date === null) {\n key = null;\n }\n else if (isNaN(date.getTime())) {\n key = 'Invalid Date';\n }\n else {\n key = ((timeunit === timeunit_1.TimeUnit.DAY) ? date.getDay() : timeunit_1.convert(timeunit, date)).toString();\n }\n unique[key] = (unique[key] || 0) + summary.unique[dateString];\n });\n result.unique = unique;\n result.distinct = util_1.keys(unique).length;\n return result;\n}\n/**\n * @return a new unique object based off of the old unique count and a binning scheme\n */\nfunction binUnique(bin, oldUnique) {\n var newUnique = {};\n for (var value in oldUnique) {\n var bucket = void 0;\n if (value === null) {\n bucket = null;\n }\n else if (isNaN(Number(value))) {\n bucket = NaN;\n }\n else {\n bucket = bin.value(Number(value));\n }\n newUnique[bucket] = (newUnique[bucket] || 0) + oldUnique[value];\n }\n return newUnique;\n}\n/** @return the number of items in list that occur as keys of unique */\nfunction invalidCount(unique, list) {\n return list.reduce(function (prev, cur) {\n return unique[cur] ? prev + 1 : prev;\n }, 0);\n}\nvar PrimitiveType;\n(function (PrimitiveType) {\n PrimitiveType[PrimitiveType[\"STRING\"] = 'string'] = \"STRING\";\n PrimitiveType[PrimitiveType[\"NUMBER\"] = 'number'] = \"NUMBER\";\n PrimitiveType[PrimitiveType[\"INTEGER\"] = 'integer'] = \"INTEGER\";\n PrimitiveType[PrimitiveType[\"BOOLEAN\"] = 'boolean'] = \"BOOLEAN\";\n PrimitiveType[PrimitiveType[\"DATETIME\"] = 'datetime'] = \"DATETIME\";\n})(PrimitiveType = exports.PrimitiveType || (exports.PrimitiveType = {}));\n\n\n/***/ }),\n/* 60 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************!*\\\n !*** ./~/core-js/library/modules/_descriptors.js ***!\n \\***************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(/*! ./_fails */ 72)(function(){\n return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n});\n\n/***/ }),\n/* 61 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/core-js/library/modules/_has.js ***!\n \\*******************************************/\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function(it, key){\n return hasOwnProperty.call(it, key);\n};\n\n/***/ }),\n/* 62 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************!*\\\n !*** ./~/vega-lite/build/src/aggregate.js ***!\n \\********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nvar AGGREGATE_OP_INDEX = {\n values: 1,\n count: 1,\n valid: 1,\n missing: 1,\n distinct: 1,\n sum: 1,\n mean: 1,\n average: 1,\n variance: 1,\n variancep: 1,\n stdev: 1,\n stdevp: 1,\n median: 1,\n q1: 1,\n q3: 1,\n ci0: 1,\n ci1: 1,\n min: 1,\n max: 1,\n argmin: 1,\n argmax: 1,\n};\nexports.AGGREGATE_OPS = util_1.flagKeys(AGGREGATE_OP_INDEX);\nfunction isAggregateOp(a) {\n return !!AGGREGATE_OP_INDEX[a];\n}\nexports.isAggregateOp = isAggregateOp;\nexports.COUNTING_OPS = ['count', 'valid', 'missing', 'distinct'];\nfunction isCountingAggregateOp(aggregate) {\n return aggregate && util_1.contains(exports.COUNTING_OPS, aggregate);\n}\nexports.isCountingAggregateOp = isCountingAggregateOp;\n/** Additive-based aggregation operations. These can be applied to stack. */\nexports.SUM_OPS = [\n 'count',\n 'sum',\n 'distinct',\n 'valid',\n 'missing'\n];\n/**\n * Aggregation operators that always produce values within the range [domainMin, domainMax].\n */\nexports.SHARED_DOMAIN_OPS = [\n 'mean',\n 'average',\n 'median',\n 'q1',\n 'q3',\n 'min',\n 'max',\n];\nexports.SHARED_DOMAIN_OP_INDEX = util_1.toSet(exports.SHARED_DOMAIN_OPS);\n\n\n/***/ }),\n/* 63 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/mark/valueref.js ***!\n \\********************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\n/**\n * Utility files for producing Vega ValueRef for marks\n */\nvar channel_1 = __webpack_require__(/*! ../../channel */ 3);\nvar fielddef_1 = __webpack_require__(/*! ../../fielddef */ 9);\nvar scale_1 = __webpack_require__(/*! ../../scale */ 5);\nvar util_1 = __webpack_require__(/*! ../../util */ 2);\nvar common_1 = __webpack_require__(/*! ../common */ 26);\n// TODO: we need to find a way to refactor these so that scaleName is a part of scale\n// but that's complicated. For now, this is a huge step moving forward.\n/**\n * @return Vega ValueRef for stackable x or y\n */\nfunction stackable(channel, channelDef, scaleName, scale, stack, defaultRef) {\n if (fielddef_1.isFieldDef(channelDef) && stack && channel === stack.fieldChannel) {\n // x or y use stack_end so that stacked line's point mark use stack_end too.\n return fieldRef(channelDef, scaleName, { suffix: 'end' });\n }\n return midPoint(channel, channelDef, scaleName, scale, stack, defaultRef);\n}\nexports.stackable = stackable;\n/**\n * @return Vega ValueRef for stackable x2 or y2\n */\nfunction stackable2(channel, aFieldDef, a2fieldDef, scaleName, scale, stack, defaultRef) {\n if (fielddef_1.isFieldDef(aFieldDef) && stack &&\n // If fieldChannel is X and channel is X2 (or Y and Y2)\n channel.charAt(0) === stack.fieldChannel.charAt(0)) {\n return fieldRef(aFieldDef, scaleName, { suffix: 'start' });\n }\n return midPoint(channel, a2fieldDef, scaleName, scale, stack, defaultRef);\n}\nexports.stackable2 = stackable2;\n/**\n * Value Ref for binned fields\n */\nfunction bin(fieldDef, scaleName, side, offset) {\n var binSuffix = side === 'start' ? undefined : 'end';\n return fieldRef(fieldDef, scaleName, { binSuffix: binSuffix }, offset ? { offset: offset } : {});\n}\nexports.bin = bin;\nfunction fieldRef(fieldDef, scaleName, opt, mixins) {\n var ref = {\n scale: scaleName,\n field: fielddef_1.field(fieldDef, opt),\n };\n if (mixins) {\n return tslib_1.__assign({}, ref, mixins);\n }\n return ref;\n}\nexports.fieldRef = fieldRef;\nfunction band(scaleName, band) {\n if (band === void 0) { band = true; }\n return {\n scale: scaleName,\n band: band\n };\n}\nexports.band = band;\n/**\n * Signal that returns the middle of a bin. Should only be used with x and y.\n */\nfunction binMidSignal(fieldDef, scaleName) {\n return {\n signal: \"(\" +\n (\"scale(\\\"\" + scaleName + \"\\\", \" + fielddef_1.field(fieldDef, { expr: 'datum' }) + \")\") +\n \" + \" +\n (\"scale(\\\"\" + scaleName + \"\\\", \" + fielddef_1.field(fieldDef, { binSuffix: 'end', expr: 'datum' }) + \")\") +\n \")/2\"\n };\n}\n/**\n * @returns {VgValueRef} Value Ref for xc / yc or mid point for other channels.\n */\nfunction midPoint(channel, channelDef, scaleName, scale, stack, defaultRef) {\n // TODO: datum support\n if (channelDef) {\n /* istanbul ignore else */\n if (fielddef_1.isFieldDef(channelDef)) {\n if (channelDef.bin) {\n // Use middle only for x an y to place marks in the center between start and end of the bin range.\n // We do not use the mid point for other channels (e.g. size) so that properties of legends and marks match.\n if (util_1.contains(['x', 'y'], channel) && channelDef.type === 'quantitative') {\n if (stack && stack.impute) {\n // For stack, we computed bin_mid so we can impute.\n return fieldRef(channelDef, scaleName, { binSuffix: 'mid' });\n }\n // For non-stack, we can just calculate bin mid on the fly using signal.\n return binMidSignal(channelDef, scaleName);\n }\n return fieldRef(channelDef, scaleName, common_1.binRequiresRange(channelDef, channel) ? { binSuffix: 'range' } : {});\n }\n var scaleType = scale.get('type');\n if (scale_1.hasDiscreteDomain(scaleType)) {\n if (scaleType === 'band') {\n // For band, to get mid point, need to offset by half of the band\n return fieldRef(channelDef, scaleName, { binSuffix: 'range' }, { band: 0.5 });\n }\n return fieldRef(channelDef, scaleName, { binSuffix: 'range' });\n }\n else {\n return fieldRef(channelDef, scaleName, {}); // no need for bin suffix\n }\n }\n else if (fielddef_1.isValueDef(channelDef)) {\n return { value: channelDef.value };\n }\n else {\n throw new Error('FieldDef without field or value.'); // FIXME add this to log.message\n }\n }\n if (defaultRef === 'zeroOrMin') {\n /* istanbul ignore else */\n if (channel === channel_1.X || channel === channel_1.X2) {\n return zeroOrMinX(scaleName, scale);\n }\n else if (channel === channel_1.Y || channel === channel_1.Y2) {\n return zeroOrMinY(scaleName, scale);\n }\n else {\n throw new Error(\"Unsupported channel \" + channel + \" for base function\"); // FIXME add this to log.message\n }\n }\n else if (defaultRef === 'zeroOrMax') {\n /* istanbul ignore else */\n if (channel === channel_1.X || channel === channel_1.X2) {\n return zeroOrMaxX(scaleName, scale);\n }\n else if (channel === channel_1.Y || channel === channel_1.Y2) {\n return zeroOrMaxY(scaleName, scale);\n }\n else {\n throw new Error(\"Unsupported channel \" + channel + \" for base function\"); // FIXME add this to log.message\n }\n }\n return defaultRef;\n}\nexports.midPoint = midPoint;\nfunction text(textDef, config) {\n // text\n if (textDef) {\n if (fielddef_1.isFieldDef(textDef)) {\n return common_1.formatSignalRef(textDef, textDef.format, 'datum', config);\n }\n else if (fielddef_1.isValueDef(textDef)) {\n return { value: textDef.value };\n }\n }\n return undefined;\n}\nexports.text = text;\nfunction mid(sizeRef) {\n return tslib_1.__assign({}, sizeRef, { mult: 0.5 });\n}\nexports.mid = mid;\nfunction zeroOrMinX(scaleName, scale) {\n if (scaleName) {\n // Log / Time / UTC scale do not support zero\n if (!util_1.contains([scale_1.ScaleType.LOG, scale_1.ScaleType.TIME, scale_1.ScaleType.UTC], scale.get('type')) &&\n scale.get('zero') !== false) {\n return {\n scale: scaleName,\n value: 0\n };\n }\n }\n // Put the mark on the x-axis\n return { value: 0 };\n}\n/**\n * @returns {VgValueRef} base value if scale exists and return max value if scale does not exist\n */\nfunction zeroOrMaxX(scaleName, scale) {\n if (scaleName) {\n // Log / Time / UTC scale do not support zero\n if (!util_1.contains([scale_1.ScaleType.LOG, scale_1.ScaleType.TIME, scale_1.ScaleType.UTC], scale.get('type')) &&\n scale.get('zero') !== false) {\n return {\n scale: scaleName,\n value: 0\n };\n }\n }\n return { field: { group: 'width' } };\n}\nfunction zeroOrMinY(scaleName, scale) {\n if (scaleName) {\n // Log / Time / UTC scale do not support zero\n if (!util_1.contains([scale_1.ScaleType.LOG, scale_1.ScaleType.TIME, scale_1.ScaleType.UTC], scale.get('type')) &&\n scale.get('zero') !== false) {\n return {\n scale: scaleName,\n value: 0\n };\n }\n }\n // Put the mark on the y-axis\n return { field: { group: 'height' } };\n}\n/**\n * @returns {VgValueRef} base value if scale exists and return max value if scale does not exist\n */\nfunction zeroOrMaxY(scaleName, scale) {\n if (scaleName) {\n // Log / Time / UTC scale do not support zero\n if (!util_1.contains([scale_1.ScaleType.LOG, scale_1.ScaleType.TIME, scale_1.ScaleType.UTC], scale.get('type')) &&\n scale.get('zero') !== false) {\n return {\n scale: scaleName,\n value: 0\n };\n }\n }\n // Put the mark on the y-axis\n return { value: 0 };\n}\n\n\n/***/ }),\n/* 64 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************!*\\\n !*** ./src/actions/redux-action.ts ***!\n \\*************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * Helpers for implementing actions with Typescript.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\n;\n;\n/**\n * Create a handleAction object\n */\nfunction createDispatchHandler() {\n return function (dispatch) { return ({\n handleAction: function (action) {\n // HACK: typing here is somewhat wrong -- we should remove any\n dispatch(action);\n }\n }); };\n}\nexports.createDispatchHandler = createDispatchHandler;\n\n\n/***/ }),\n/* 65 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************!*\\\n !*** ./src/reducers/util.ts ***!\n \\******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Immutable array splice\n */\nfunction removeItemFromArray(array, index) {\n return {\n item: array[index],\n array: array.slice(0, index).concat(array.slice(index + 1))\n };\n}\nexports.removeItemFromArray = removeItemFromArray;\nfunction insertItemToArray(array, index, item) {\n return array.slice(0, index).concat([\n item\n ], array.slice(index));\n}\nexports.insertItemToArray = insertItemToArray;\nfunction modifyItemInArray(array, index, modifier) {\n return array.slice(0, index).concat([\n modifier(array[index])\n ], array.slice(index + 1));\n}\nexports.modifyItemInArray = modifyItemInArray;\n\n\n/***/ }),\n/* 66 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************!*\\\n !*** ./src/selectors/dataset.ts ***!\n \\**********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar wildcard_1 = __webpack_require__(/*! compassql/build/src/wildcard */ 6);\nvar reselect_1 = __webpack_require__(/*! reselect */ 86);\nexports.selectData = function (state) { return state.undoable.present.dataset.data; };\nexports.selectDataset = function (state) { return state.undoable.present.dataset; };\nexports.selectSchema = function (state) { return state.undoable.present.dataset.schema; };\nvar ALL_PRESET_WILDCARD_FIELDS = [\n { field: wildcard_1.SHORT_WILDCARD, type: 'quantitative', description: 'Quantitative Fields' },\n { field: wildcard_1.SHORT_WILDCARD, type: 'nominal', description: 'Categorical Fields' },\n { field: wildcard_1.SHORT_WILDCARD, type: 'temporal', description: 'Temporal Fields' },\n];\nexports.selectPresetWildcardFields = reselect_1.createSelector(exports.selectSchema, function (schema) {\n if (!schema) {\n return [];\n }\n var typeIndex = schema.fieldSchemas.reduce(function (index, fieldSchema) {\n index[fieldSchema.vlType] = true;\n return index;\n }, {});\n return ALL_PRESET_WILDCARD_FIELDS.filter(function (fieldDef) { return typeIndex[fieldDef.type]; });\n});\nexports.selectSchemaFieldDefs = reselect_1.createSelector(exports.selectSchema, function (schema) {\n if (!schema) {\n return [];\n }\n return schema.fieldSchemas.map(function (fieldSchema) {\n var name = fieldSchema.name, vlType = fieldSchema.vlType;\n return { field: name, type: vlType };\n });\n});\n\n\n/***/ }),\n/* 67 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************!*\\\n !*** ./~/ajv/lib/compile/util.js ***!\n \\***********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n\nmodule.exports = {\n copy: copy,\n checkDataType: checkDataType,\n checkDataTypes: checkDataTypes,\n coerceToTypes: coerceToTypes,\n toHash: toHash,\n getProperty: getProperty,\n escapeQuotes: escapeQuotes,\n equal: __webpack_require__(/*! fast-deep-equal */ 142),\n ucs2length: __webpack_require__(/*! ./ucs2length */ 317),\n varOccurences: varOccurences,\n varReplace: varReplace,\n cleanUpCode: cleanUpCode,\n finalCleanUpCode: finalCleanUpCode,\n schemaHasRules: schemaHasRules,\n schemaHasRulesExcept: schemaHasRulesExcept,\n toQuotedString: toQuotedString,\n getPathExpr: getPathExpr,\n getPath: getPath,\n getData: getData,\n unescapeFragment: unescapeFragment,\n unescapeJsonPointer: unescapeJsonPointer,\n escapeFragment: escapeFragment,\n escapeJsonPointer: escapeJsonPointer\n};\n\n\nfunction copy(o, to) {\n to = to || {};\n for (var key in o) to[key] = o[key];\n return to;\n}\n\n\nfunction checkDataType(dataType, data, negate) {\n var EQUAL = negate ? ' !== ' : ' === '\n , AND = negate ? ' || ' : ' && '\n , OK = negate ? '!' : ''\n , NOT = negate ? '' : '!';\n switch (dataType) {\n case 'null': return data + EQUAL + 'null';\n case 'array': return OK + 'Array.isArray(' + data + ')';\n case 'object': return '(' + OK + data + AND +\n 'typeof ' + data + EQUAL + '\"object\"' + AND +\n NOT + 'Array.isArray(' + data + '))';\n case 'integer': return '(typeof ' + data + EQUAL + '\"number\"' + AND +\n NOT + '(' + data + ' % 1)' +\n AND + data + EQUAL + data + ')';\n default: return 'typeof ' + data + EQUAL + '\"' + dataType + '\"';\n }\n}\n\n\nfunction checkDataTypes(dataTypes, data) {\n switch (dataTypes.length) {\n case 1: return checkDataType(dataTypes[0], data, true);\n default:\n var code = '';\n var types = toHash(dataTypes);\n if (types.array && types.object) {\n code = types.null ? '(': '(!' + data + ' || ';\n code += 'typeof ' + data + ' !== \"object\")';\n delete types.null;\n delete types.array;\n delete types.object;\n }\n if (types.number) delete types.integer;\n for (var t in types)\n code += (code ? ' && ' : '' ) + checkDataType(t, data, true);\n\n return code;\n }\n}\n\n\nvar COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);\nfunction coerceToTypes(optionCoerceTypes, dataTypes) {\n if (Array.isArray(dataTypes)) {\n var types = [];\n for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);\n return paths[lvl - up];\n }\n\n if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);\n data = 'data' + ((lvl - up) || '');\n if (!jsonPointer) return data;\n }\n\n var expr = data;\n var segments = jsonPointer.split('/');\n for (var i=0; i= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n};\n\n/***/ }),\n/* 76 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************************!*\\\n !*** ./~/compassql/build/src/query/spec.js ***!\n \\*********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = __webpack_require__(/*! vega-lite/build/src/channel */ 3);\nvar wildcard_1 = __webpack_require__(/*! ../wildcard */ 6);\nvar property_1 = __webpack_require__(/*! ../property */ 18);\nvar util_1 = __webpack_require__(/*! ../util */ 13);\nvar encoding_1 = __webpack_require__(/*! ./encoding */ 14);\nvar util_2 = __webpack_require__(/*! datalib/src/util */ 32);\n/**\n * Convert a Vega-Lite's ExtendedUnitSpec into a CompassQL's SpecQuery\n * @param {ExtendedUnitSpec} spec\n * @returns\n */\nfunction fromSpec(spec) {\n return util_1.extend(spec.data ? { data: spec.data } : {}, spec.transform ? { transform: spec.transform } : {}, {\n mark: spec.mark,\n encodings: util_1.keys(spec.encoding).map(function (channel) {\n var encQ = { channel: channel };\n var channelDef = spec.encoding[channel];\n for (var prop in channelDef) {\n if (property_1.isEncodingTopLevelProperty(prop) && channelDef[prop] !== undefined) {\n // Currently bin, scale, axis, legend only support boolean, but not null.\n // Therefore convert null to false.\n if (util_1.contains(['bin', 'scale', 'axis', 'legend'], prop) && channelDef[prop] === null) {\n encQ[prop] = false;\n }\n else {\n encQ[prop] = channelDef[prop];\n }\n }\n }\n if (encoding_1.isFieldQuery(encQ) && encQ.aggregate === 'count' && !encQ.field) {\n encQ.field = '*';\n }\n return encQ;\n })\n }, spec.config ? { config: spec.config } : {});\n}\nexports.fromSpec = fromSpec;\nfunction isAggregate(specQ) {\n return util_1.some(specQ.encodings, function (encQ) {\n return (encoding_1.isFieldQuery(encQ) && !wildcard_1.isWildcard(encQ.aggregate) && !!encQ.aggregate) || encoding_1.isEnabledAutoCountQuery(encQ);\n });\n}\nexports.isAggregate = isAggregate;\n/**\n * @return the stack offset type for the specQuery\n */\nfunction stack(specQ) {\n var config = specQ.config;\n var stacked = config ? config.stack : undefined;\n // Should not have stack explicitly disabled\n if (util_1.contains(['none', null, false], stacked)) {\n return null;\n }\n // Should have stackable mark\n if (!util_1.contains(['bar', 'area'], specQ.mark)) {\n return null;\n }\n // Should be aggregate plot\n if (!isAggregate(specQ)) {\n return null;\n }\n var stackBy = specQ.encodings.reduce(function (sc, encQ) {\n if (util_1.contains(channel_1.NONSPATIAL_CHANNELS, encQ.channel) && (encoding_1.isValueQuery(encQ) || (encoding_1.isFieldQuery(encQ) && !encQ.aggregate))) {\n sc.push({\n channel: encQ.channel,\n fieldDef: encQ\n });\n }\n return sc;\n }, []);\n if (stackBy.length === 0) {\n return null;\n }\n // Has only one aggregate axis\n var xEncQ = specQ.encodings.reduce(function (f, encQ) {\n return f || (encQ.channel === channel_1.Channel.X ? encQ : null);\n }, null);\n var yEncQ = specQ.encodings.reduce(function (f, encQ) {\n return f || (encQ.channel === channel_1.Channel.Y ? encQ : null);\n }, null);\n // TODO(akshatsh): Check if autoCount undef is ok\n var xIsAggregate = (encoding_1.isFieldQuery(xEncQ) && !!xEncQ.aggregate) || (encoding_1.isAutoCountQuery(xEncQ) && !!xEncQ.autoCount);\n var yIsAggregate = (encoding_1.isFieldQuery(yEncQ) && !!yEncQ.aggregate) || (encoding_1.isAutoCountQuery(yEncQ) && !!yEncQ.autoCount);\n if (xIsAggregate !== yIsAggregate) {\n return {\n groupbyChannel: xIsAggregate ? (!!yEncQ ? channel_1.Y : null) : (!!xEncQ ? channel_1.X : null),\n groupByEncQ: xIsAggregate ? yEncQ : xEncQ,\n fieldChannel: xIsAggregate ? channel_1.X : channel_1.Y,\n fieldEncQ: xIsAggregate ? xEncQ : yEncQ,\n impute: util_1.contains(['area', 'line'], specQ.mark),\n stackBy: stackBy,\n offset: stacked || 'zero'\n };\n }\n return null;\n}\nexports.stack = stack;\nfunction hasWildcard(specQ, opt) {\n if (opt === void 0) { opt = {}; }\n var exclude = opt.exclude ? util_2.toMap(opt.exclude.map(property_1.toKey)) : {};\n if (wildcard_1.isWildcard(specQ.mark) && !exclude['mark']) {\n return true;\n }\n for (var _i = 0, _a = specQ.encodings; _i < _a.length; _i++) {\n var encQ = _a[_i];\n // TODO: implement more efficiently, just check only properties of encQ\n for (var key in encQ) {\n var parentProp = key;\n if (encQ.hasOwnProperty(parentProp) && property_1.isEncodingTopLevelProperty(parentProp)) {\n if (wildcard_1.isWildcard(encQ[parentProp]) && !exclude[parentProp]) {\n return true;\n }\n var propObj = encQ[parentProp];\n for (var childProp in propObj) {\n if (propObj.hasOwnProperty(childProp) && !util_1.contains(['enum', 'name'], childProp)) {\n var prop = {\n parent: parentProp,\n child: childProp\n };\n if (wildcard_1.isWildcard(propObj[childProp]) && !exclude[property_1.toKey(prop)]) {\n return true;\n }\n }\n }\n }\n }\n }\n return false;\n}\nexports.hasWildcard = hasWildcard;\n\n\n/***/ }),\n/* 77 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/core-js/library/modules/_is-object.js ***!\n \\*************************************************/\n/***/ (function(module, exports) {\n\nmodule.exports = function(it){\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n/***/ }),\n/* 78 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/core-js/library/modules/_iterators.js ***!\n \\*************************************************/\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n/***/ }),\n/* 79 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************!*\\\n !*** ./~/core-js/library/modules/_object-keys.js ***!\n \\***************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(/*! ./_object-keys-internal */ 196)\n , enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ 130);\n\nmodule.exports = Object.keys || function keys(O){\n return $keys(O, enumBugKeys);\n};\n\n/***/ }),\n/* 80 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************************!*\\\n !*** ./~/core-js/library/modules/_property-desc.js ***!\n \\*****************************************************/\n/***/ (function(module, exports) {\n\nmodule.exports = function(bitmap, value){\n return {\n enumerable : !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable : !(bitmap & 4),\n value : value\n };\n};\n\n/***/ }),\n/* 81 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/css-in-js-utils/lib/isPrefixedValue.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = isPrefixedValue;\n\nvar regex = /-webkit-|-moz-|-ms-/;\n\nfunction isPrefixedValue(value) {\n return typeof value === 'string' && value.match(regex) !== null;\n}\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 82 */\n/* exports provided: default */\n/* exports used: default */\n/*!*********************************!*\\\n !*** ./~/dom-align/es/utils.js ***!\n \\*********************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__propertyUtils__ = __webpack_require__(/*! ./propertyUtils */ 429);\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\n\nvar RE_NUM = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source;\n\nvar getComputedStyleX = void 0;\n\nfunction force(x, y) {\n return x + y;\n}\n\nfunction css(el, name, v) {\n var value = v;\n if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n for (var i in name) {\n if (name.hasOwnProperty(i)) {\n css(el, i, name[i]);\n }\n }\n return undefined;\n }\n if (typeof value !== 'undefined') {\n if (typeof value === 'number') {\n value = value + 'px';\n }\n el.style[name] = value;\n return undefined;\n }\n return getComputedStyleX(el, name);\n}\n\nfunction getClientPosition(elem) {\n var box = void 0;\n var x = void 0;\n var y = void 0;\n var doc = elem.ownerDocument;\n var body = doc.body;\n var docElem = doc && doc.documentElement;\n // 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式\n box = elem.getBoundingClientRect();\n\n // 注:jQuery 还考虑减去 docElem.clientLeft/clientTop\n // 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确\n // 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin\n\n x = box.left;\n y = box.top;\n\n // In IE, most of the time, 2 extra pixels are added to the top and left\n // due to the implicit 2-pixel inset border. In IE6/7 quirks mode and\n // IE6 standards mode, this border can be overridden by setting the\n // document element's border to zero -- thus, we cannot rely on the\n // offset always being 2 pixels.\n\n // In quirks mode, the offset can be determined by querying the body's\n // clientLeft/clientTop, but in standards mode, it is found by querying\n // the document element's clientLeft/clientTop. Since we already called\n // getClientBoundingRect we have already forced a reflow, so it is not\n // too expensive just to query them all.\n\n // ie 下应该减去窗口的边框吧,毕竟默认 absolute 都是相对窗口定位的\n // 窗口边框标准是设 documentElement ,quirks 时设置 body\n // 最好禁止在 body 和 html 上边框 ,但 ie < 9 html 默认有 2px ,减去\n // 但是非 ie 不可能设置窗口边框,body html 也不是窗口 ,ie 可以通过 html,body 设置\n // 标准 ie 下 docElem.clientTop 就是 border-top\n // ie7 html 即窗口边框改变不了。永远为 2\n // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框,即使设了 border-top 也为 0\n\n x -= docElem.clientLeft || body.clientLeft || 0;\n y -= docElem.clientTop || body.clientTop || 0;\n\n return {\n left: x,\n top: y\n };\n}\n\nfunction getScroll(w, top) {\n var ret = w['page' + (top ? 'Y' : 'X') + 'Offset'];\n var method = 'scroll' + (top ? 'Top' : 'Left');\n if (typeof ret !== 'number') {\n var d = w.document;\n // ie6,7,8 standard mode\n ret = d.documentElement[method];\n if (typeof ret !== 'number') {\n // quirks mode\n ret = d.body[method];\n }\n }\n return ret;\n}\n\nfunction getScrollLeft(w) {\n return getScroll(w);\n}\n\nfunction getScrollTop(w) {\n return getScroll(w, true);\n}\n\nfunction getOffset(el) {\n var pos = getClientPosition(el);\n var doc = el.ownerDocument;\n var w = doc.defaultView || doc.parentWindow;\n pos.left += getScrollLeft(w);\n pos.top += getScrollTop(w);\n return pos;\n}\n\n/**\n * A crude way of determining if an object is a window\n * @member util\n */\nfunction isWindow(obj) {\n // must use == for ie8\n /* eslint eqeqeq:0 */\n return obj !== null && obj !== undefined && obj == obj.window;\n}\n\nfunction getDocument(node) {\n if (isWindow(node)) {\n return node.document;\n }\n if (node.nodeType === 9) {\n return node;\n }\n return node.ownerDocument;\n}\n\nfunction _getComputedStyle(elem, name, cs) {\n var computedStyle = cs;\n var val = '';\n var d = getDocument(elem);\n computedStyle = computedStyle || d.defaultView.getComputedStyle(elem, null);\n\n // https://github.com/kissyteam/kissy/issues/61\n if (computedStyle) {\n val = computedStyle.getPropertyValue(name) || computedStyle[name];\n }\n\n return val;\n}\n\nvar _RE_NUM_NO_PX = new RegExp('^(' + RE_NUM + ')(?!px)[a-z%]+$', 'i');\nvar RE_POS = /^(top|right|bottom|left)$/;\nvar CURRENT_STYLE = 'currentStyle';\nvar RUNTIME_STYLE = 'runtimeStyle';\nvar LEFT = 'left';\nvar PX = 'px';\n\nfunction _getComputedStyleIE(elem, name) {\n // currentStyle maybe null\n // http://msdn.microsoft.com/en-us/library/ms535231.aspx\n var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];\n\n // 当 width/height 设置为百分比时,通过 pixelLeft 方式转换的 width/height 值\n // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19\n // 在 ie 下不对,需要直接用 offset 方式\n // borderWidth 等值也有问题,但考虑到 borderWidth 设为百分比的概率很小,这里就不考虑了\n\n // From the awesome hack by Dean Edwards\n // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n // If we're not dealing with a regular pixel number\n // but a number that has a weird ending, we need to convert it to pixels\n // exclude left right for relativity\n if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {\n // Remember the original values\n var style = elem.style;\n var left = style[LEFT];\n var rsLeft = elem[RUNTIME_STYLE][LEFT];\n\n // prevent flashing of content\n elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];\n\n // Put in the new values to get a computed value out\n style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;\n ret = style.pixelLeft + PX;\n\n // Revert the changed values\n style[LEFT] = left;\n\n elem[RUNTIME_STYLE][LEFT] = rsLeft;\n }\n return ret === '' ? 'auto' : ret;\n}\n\nif (typeof window !== 'undefined') {\n getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;\n}\n\nfunction getOffsetDirection(dir, option) {\n if (dir === 'left') {\n return option.useCssRight ? 'right' : dir;\n }\n return option.useCssBottom ? 'bottom' : dir;\n}\n\nfunction oppositeOffsetDirection(dir) {\n if (dir === 'left') {\n return 'right';\n } else if (dir === 'right') {\n return 'left';\n } else if (dir === 'top') {\n return 'bottom';\n } else if (dir === 'bottom') {\n return 'top';\n }\n}\n\n// 设置 elem 相对 elem.ownerDocument 的坐标\nfunction setLeftTop(elem, offset, option) {\n // set position first, in-case top/left are set even on static elem\n if (css(elem, 'position') === 'static') {\n elem.style.position = 'relative';\n }\n var presetH = -999;\n var presetV = -999;\n var horizontalProperty = getOffsetDirection('left', option);\n var verticalProperty = getOffsetDirection('top', option);\n var oppositeHorizontalProperty = oppositeOffsetDirection(horizontalProperty);\n var oppositeVerticalProperty = oppositeOffsetDirection(verticalProperty);\n\n if (horizontalProperty !== 'left') {\n presetH = 999;\n }\n\n if (verticalProperty !== 'top') {\n presetV = 999;\n }\n var originalTransition = '';\n var originalOffset = getOffset(elem);\n if ('left' in offset || 'top' in offset) {\n originalTransition = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__propertyUtils__[\"a\" /* getTransitionProperty */])(elem) || '';\n __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__propertyUtils__[\"b\" /* setTransitionProperty */])(elem, 'none');\n }\n if ('left' in offset) {\n elem.style[oppositeHorizontalProperty] = '';\n elem.style[horizontalProperty] = presetH + 'px';\n }\n if ('top' in offset) {\n elem.style[oppositeVerticalProperty] = '';\n elem.style[verticalProperty] = presetV + 'px';\n }\n var old = getOffset(elem);\n var originalStyle = {};\n for (var key in offset) {\n if (offset.hasOwnProperty(key)) {\n var dir = getOffsetDirection(key, option);\n var preset = key === 'left' ? presetH : presetV;\n var off = originalOffset[key] - old[key];\n if (dir === key) {\n originalStyle[dir] = preset + off;\n } else {\n originalStyle[dir] = preset - off;\n }\n }\n }\n css(elem, originalStyle);\n // force relayout\n force(elem.offsetTop, elem.offsetLeft);\n if ('left' in offset || 'top' in offset) {\n __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__propertyUtils__[\"b\" /* setTransitionProperty */])(elem, originalTransition);\n }\n var ret = {};\n for (var _key in offset) {\n if (offset.hasOwnProperty(_key)) {\n var _dir = getOffsetDirection(_key, option);\n var _off = offset[_key] - originalOffset[_key];\n if (_key === _dir) {\n ret[_dir] = originalStyle[_dir] + _off;\n } else {\n ret[_dir] = originalStyle[_dir] - _off;\n }\n }\n }\n css(elem, ret);\n}\n\nfunction setTransform(elem, offset) {\n var originalOffset = getOffset(elem);\n var originalXY = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__propertyUtils__[\"c\" /* getTransformXY */])(elem);\n var resultXY = { x: originalXY.x, y: originalXY.y };\n if ('left' in offset) {\n resultXY.x = originalXY.x + offset.left - originalOffset.left;\n }\n if ('top' in offset) {\n resultXY.y = originalXY.y + offset.top - originalOffset.top;\n }\n __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__propertyUtils__[\"d\" /* setTransformXY */])(elem, resultXY);\n}\n\nfunction setOffset(elem, offset, option) {\n if (option.useCssRight || option.useCssBottom) {\n setLeftTop(elem, offset, option);\n } else if (option.useCssTransform && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__propertyUtils__[\"e\" /* getTransformName */])() in document.body.style) {\n setTransform(elem, offset, option);\n } else {\n setLeftTop(elem, offset, option);\n }\n}\n\nfunction each(arr, fn) {\n for (var i = 0; i < arr.length; i++) {\n fn(arr[i]);\n }\n}\n\nfunction isBorderBoxFn(elem) {\n return getComputedStyleX(elem, 'boxSizing') === 'border-box';\n}\n\nvar BOX_MODELS = ['margin', 'border', 'padding'];\nvar CONTENT_INDEX = -1;\nvar PADDING_INDEX = 2;\nvar BORDER_INDEX = 1;\nvar MARGIN_INDEX = 0;\n\nfunction swap(elem, options, callback) {\n var old = {};\n var style = elem.style;\n var name = void 0;\n\n // Remember the old values, and insert the new ones\n for (name in options) {\n if (options.hasOwnProperty(name)) {\n old[name] = style[name];\n style[name] = options[name];\n }\n }\n\n callback.call(elem);\n\n // Revert the old values\n for (name in options) {\n if (options.hasOwnProperty(name)) {\n style[name] = old[name];\n }\n }\n}\n\nfunction getPBMWidth(elem, props, which) {\n var value = 0;\n var prop = void 0;\n var j = void 0;\n var i = void 0;\n for (j = 0; j < props.length; j++) {\n prop = props[j];\n if (prop) {\n for (i = 0; i < which.length; i++) {\n var cssProp = void 0;\n if (prop === 'border') {\n cssProp = '' + prop + which[i] + 'Width';\n } else {\n cssProp = prop + which[i];\n }\n value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;\n }\n }\n }\n return value;\n}\n\nvar domUtils = {};\n\neach(['Width', 'Height'], function (name) {\n domUtils['doc' + name] = function (refWin) {\n var d = refWin.document;\n return Math.max(\n // firefox chrome documentElement.scrollHeight< body.scrollHeight\n // ie standard mode : documentElement.scrollHeight> body.scrollHeight\n d.documentElement['scroll' + name],\n // quirks : documentElement.scrollHeight 最大等于可视窗口多一点?\n d.body['scroll' + name], domUtils['viewport' + name](d));\n };\n\n domUtils['viewport' + name] = function (win) {\n // pc browser includes scrollbar in window.innerWidth\n var prop = 'client' + name;\n var doc = win.document;\n var body = doc.body;\n var documentElement = doc.documentElement;\n var documentElementProp = documentElement[prop];\n // 标准模式取 documentElement\n // backcompat 取 body\n return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp;\n };\n});\n\n/*\n 得到元素的大小信息\n @param elem\n @param name\n @param {String} [extra] 'padding' : (css width) + padding\n 'border' : (css width) + padding + border\n 'margin' : (css width) + padding + border + margin\n */\nfunction getWH(elem, name, ex) {\n var extra = ex;\n if (isWindow(elem)) {\n return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);\n } else if (elem.nodeType === 9) {\n return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem);\n }\n var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n var borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;\n var computedStyle = getComputedStyleX(elem);\n var isBorderBox = isBorderBoxFn(elem, computedStyle);\n var cssBoxValue = 0;\n if (borderBoxValue === null || borderBoxValue === undefined || borderBoxValue <= 0) {\n borderBoxValue = undefined;\n // Fall back to computed then un computed css if necessary\n cssBoxValue = getComputedStyleX(elem, name);\n if (cssBoxValue === null || cssBoxValue === undefined || Number(cssBoxValue) < 0) {\n cssBoxValue = elem.style[name] || 0;\n }\n // Normalize '', auto, and prepare for extra\n cssBoxValue = parseFloat(cssBoxValue) || 0;\n }\n if (extra === undefined) {\n extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;\n }\n var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox;\n var val = borderBoxValue || cssBoxValue;\n if (extra === CONTENT_INDEX) {\n if (borderBoxValueOrIsBorderBox) {\n return val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle);\n }\n return cssBoxValue;\n } else if (borderBoxValueOrIsBorderBox) {\n if (extra === BORDER_INDEX) {\n return val;\n }\n return val + (extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which, computedStyle) : getPBMWidth(elem, ['margin'], which, computedStyle));\n }\n return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle);\n}\n\nvar cssShow = {\n position: 'absolute',\n visibility: 'hidden',\n display: 'block'\n};\n\n// fix #119 : https://github.com/kissyteam/kissy/issues/119\nfunction getWHIgnoreDisplay() {\n for (var _len = arguments.length, args = Array(_len), _key2 = 0; _key2 < _len; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var val = void 0;\n var elem = args[0];\n // in case elem is window\n // elem.offsetWidth === undefined\n if (elem.offsetWidth !== 0) {\n val = getWH.apply(undefined, args);\n } else {\n swap(elem, cssShow, function () {\n val = getWH.apply(undefined, args);\n });\n }\n return val;\n}\n\neach(['width', 'height'], function (name) {\n var first = name.charAt(0).toUpperCase() + name.slice(1);\n domUtils['outer' + first] = function (el, includeMargin) {\n return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX);\n };\n var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n\n domUtils[name] = function (elem, v) {\n var val = v;\n if (val !== undefined) {\n if (elem) {\n var computedStyle = getComputedStyleX(elem);\n var isBorderBox = isBorderBoxFn(elem);\n if (isBorderBox) {\n val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);\n }\n return css(elem, name, val);\n }\n return undefined;\n }\n return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);\n };\n});\n\nfunction mix(to, from) {\n for (var i in from) {\n if (from.hasOwnProperty(i)) {\n to[i] = from[i];\n }\n }\n return to;\n}\n\nvar utils = {\n getWindow: function getWindow(node) {\n if (node && node.document && node.setTimeout) {\n return node;\n }\n var doc = node.ownerDocument || node;\n return doc.defaultView || doc.parentWindow;\n },\n\n getDocument: getDocument,\n offset: function offset(el, value, option) {\n if (typeof value !== 'undefined') {\n setOffset(el, value, option || {});\n } else {\n return getOffset(el);\n }\n },\n\n isWindow: isWindow,\n each: each,\n css: css,\n clone: function clone(obj) {\n var i = void 0;\n var ret = {};\n for (i in obj) {\n if (obj.hasOwnProperty(i)) {\n ret[i] = obj[i];\n }\n }\n var overflow = obj.overflow;\n if (overflow) {\n for (i in obj) {\n if (obj.hasOwnProperty(i)) {\n ret.overflow[i] = obj.overflow[i];\n }\n }\n }\n return ret;\n },\n\n mix: mix,\n getWindowScrollLeft: function getWindowScrollLeft(w) {\n return getScrollLeft(w);\n },\n getWindowScrollTop: function getWindowScrollTop(w) {\n return getScrollTop(w);\n },\n merge: function merge() {\n var ret = {};\n\n for (var _len2 = arguments.length, args = Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n for (var i = 0; i < args.length; i++) {\n utils.mix(ret, args[i]);\n }\n return ret;\n },\n\n viewportWidth: 0,\n viewportHeight: 0\n};\n\nmix(utils, domUtils);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (utils);\n\n/***/ }),\n/* 83 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************!*\\\n !*** ./~/jsonschema/lib/helpers.js ***!\n \\*************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar uri = __webpack_require__(/*! url */ 153);\n\nvar ValidationError = exports.ValidationError = function ValidationError (message, instance, schema, propertyPath, name, argument) {\n if (propertyPath) {\n this.property = propertyPath;\n }\n if (message) {\n this.message = message;\n }\n if (schema) {\n if (schema.id) {\n this.schema = schema.id;\n } else {\n this.schema = schema;\n }\n }\n if (instance) {\n this.instance = instance;\n }\n this.name = name;\n this.argument = argument;\n this.stack = this.toString();\n};\n\nValidationError.prototype.toString = function toString() {\n return this.property + ' ' + this.message;\n};\n\nvar ValidatorResult = exports.ValidatorResult = function ValidatorResult(instance, schema, options, ctx) {\n this.instance = instance;\n this.schema = schema;\n this.propertyPath = ctx.propertyPath;\n this.errors = [];\n this.throwError = options && options.throwError;\n this.disableFormat = options && options.disableFormat === true;\n};\n\nValidatorResult.prototype.addError = function addError(detail) {\n var err;\n if (typeof detail == 'string') {\n err = new ValidationError(detail, this.instance, this.schema, this.propertyPath);\n } else {\n if (!detail) throw new Error('Missing error detail');\n if (!detail.message) throw new Error('Missing error message');\n if (!detail.name) throw new Error('Missing validator type');\n err = new ValidationError(detail.message, this.instance, this.schema, this.propertyPath, detail.name, detail.argument);\n }\n\n if (this.throwError) {\n throw err;\n }\n this.errors.push(err);\n return err;\n};\n\nValidatorResult.prototype.importErrors = function importErrors(res) {\n if (typeof res == 'string' || (res && res.validatorType)) {\n this.addError(res);\n } else if (res && res.errors) {\n Array.prototype.push.apply(this.errors, res.errors);\n }\n};\n\nfunction stringizer (v,i){\n return i+': '+v.toString()+'\\n';\n}\nValidatorResult.prototype.toString = function toString(res) {\n return this.errors.map(stringizer).join('');\n};\n\nObject.defineProperty(ValidatorResult.prototype, \"valid\", { get: function() {\n return !this.errors.length;\n} });\n\n/**\n * Describes a problem with a Schema which prevents validation of an instance\n * @name SchemaError\n * @constructor\n */\nvar SchemaError = exports.SchemaError = function SchemaError (msg, schema) {\n this.message = msg;\n this.schema = schema;\n Error.call(this, msg);\n Error.captureStackTrace(this, SchemaError);\n};\nSchemaError.prototype = Object.create(Error.prototype,\n { constructor: {value: SchemaError, enumerable: false}\n , name: {value: 'SchemaError', enumerable: false}\n });\n\nvar SchemaContext = exports.SchemaContext = function SchemaContext (schema, options, propertyPath, base, schemas) {\n this.schema = schema;\n this.options = options;\n this.propertyPath = propertyPath;\n this.base = base;\n this.schemas = schemas;\n};\n\nSchemaContext.prototype.resolve = function resolve (target) {\n return uri.resolve(this.base, target);\n};\n\nSchemaContext.prototype.makeChild = function makeChild(schema, propertyName){\n var propertyPath = (propertyName===undefined) ? this.propertyPath : this.propertyPath+makeSuffix(propertyName);\n var base = uri.resolve(this.base, schema.id||'');\n var ctx = new SchemaContext(schema, this.options, propertyPath, base, Object.create(this.schemas));\n if(schema.id && !ctx.schemas[base]){\n ctx.schemas[base] = schema;\n }\n return ctx;\n}\n\nvar FORMAT_REGEXPS = exports.FORMAT_REGEXPS = {\n 'date-time': /^\\d{4}-(?:0[0-9]{1}|1[0-2]{1})-(3[01]|0[1-9]|[12][0-9])[tT ](2[0-4]|[01][0-9]):([0-5][0-9]):(60|[0-5][0-9])(\\.\\d+)?([zZ]|[+-]([0-5][0-9]):(60|[0-5][0-9]))$/,\n 'date': /^\\d{4}-(?:0[0-9]{1}|1[0-2]{1})-(3[01]|0[1-9]|[12][0-9])$/,\n 'time': /^(2[0-4]|[01][0-9]):([0-5][0-9]):(60|[0-5][0-9])$/,\n\n 'email': /^(?:[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+\\.)*[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!\\.)){0,61}[a-zA-Z0-9]?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\\[(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\]))$/,\n 'ip-address': /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\n 'ipv6': /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/,\n 'uri': /^[a-zA-Z][a-zA-Z0-9+-.]*:[^\\s]*$/,\n\n 'color': /^(#?([0-9A-Fa-f]{3}){1,2}\\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\\(\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*\\))|(rgb\\(\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*\\)))$/,\n\n // hostname regex from: http://stackoverflow.com/a/1420225/5628\n 'hostname': /^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?$/,\n 'host-name': /^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?$/,\n\n 'alpha': /^[a-zA-Z]+$/,\n 'alphanumeric': /^[a-zA-Z0-9]+$/,\n 'utc-millisec': function (input) {\n return (typeof input === 'string') && parseFloat(input) === parseInt(input, 10) && !isNaN(input);\n },\n 'regex': function (input) {\n var result = true;\n try {\n new RegExp(input);\n } catch (e) {\n result = false;\n }\n return result;\n },\n 'style': /\\s*(.+?):\\s*([^;]+);?/g,\n 'phone': /^\\+(?:[0-9] ?){6,14}[0-9]$/\n};\n\nFORMAT_REGEXPS.regexp = FORMAT_REGEXPS.regex;\nFORMAT_REGEXPS.pattern = FORMAT_REGEXPS.regex;\nFORMAT_REGEXPS.ipv4 = FORMAT_REGEXPS['ip-address'];\n\nexports.isFormat = function isFormat (input, format, validator) {\n if (typeof input === 'string' && FORMAT_REGEXPS[format] !== undefined) {\n if (FORMAT_REGEXPS[format] instanceof RegExp) {\n return FORMAT_REGEXPS[format].test(input);\n }\n if (typeof FORMAT_REGEXPS[format] === 'function') {\n return FORMAT_REGEXPS[format](input);\n }\n } else if (validator && validator.customFormats &&\n typeof validator.customFormats[format] === 'function') {\n return validator.customFormats[format](input);\n }\n return true;\n};\n\nvar makeSuffix = exports.makeSuffix = function makeSuffix (key) {\n key = key.toString();\n // This function could be capable of outputting valid a ECMAScript string, but the\n // resulting code for testing which form to use would be tens of thousands of characters long\n // That means this will use the name form for some illegal forms\n if (!key.match(/[.\\s\\[\\]]/) && !key.match(/^[\\d]/)) {\n return '.' + key;\n }\n if (key.match(/^\\d+$/)) {\n return '[' + key + ']';\n }\n return '[' + JSON.stringify(key) + ']';\n};\n\nexports.deepCompareStrict = function deepCompareStrict (a, b) {\n if (typeof a !== typeof b) {\n return false;\n }\n if (a instanceof Array) {\n if (!(b instanceof Array)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n return a.every(function (v, i) {\n return deepCompareStrict(a[i], b[i]);\n });\n }\n if (typeof a === 'object') {\n if (!a || !b) {\n return a === b;\n }\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every(function (v) {\n return deepCompareStrict(a[v], b[v]);\n });\n }\n return a === b;\n};\n\nfunction deepMerger (target, dst, e, i) {\n if (typeof e === 'object') {\n dst[i] = deepMerge(target[i], e)\n } else {\n if (target.indexOf(e) === -1) {\n dst.push(e)\n }\n }\n}\n\nfunction copyist (src, dst, key) {\n dst[key] = src[key];\n}\n\nfunction copyistWithDeepMerge (target, src, dst, key) {\n if (typeof src[key] !== 'object' || !src[key]) {\n dst[key] = src[key];\n }\n else {\n if (!target[key]) {\n dst[key] = src[key];\n } else {\n dst[key] = deepMerge(target[key], src[key])\n }\n }\n}\n\nfunction deepMerge (target, src) {\n var array = Array.isArray(src);\n var dst = array && [] || {};\n\n if (array) {\n target = target || [];\n dst = dst.concat(target);\n src.forEach(deepMerger.bind(null, target, dst));\n } else {\n if (target && typeof target === 'object') {\n Object.keys(target).forEach(copyist.bind(null, target, dst));\n }\n Object.keys(src).forEach(copyistWithDeepMerge.bind(null, target, src, dst));\n }\n\n return dst;\n};\n\nmodule.exports.deepMerge = deepMerge;\n\n/**\n * Validates instance against the provided schema\n * Implements URI+JSON Pointer encoding, e.g. \"%7e\"=\"~0\"=>\"~\", \"~1\"=\"%2f\"=>\"/\"\n * @param o\n * @param s The path to walk o along\n * @return any\n */\nexports.objectGetPath = function objectGetPath(o, s) {\n var parts = s.split('/').slice(1);\n var k;\n while (typeof (k=parts.shift()) == 'string') {\n var n = decodeURIComponent(k.replace(/~0/,'~').replace(/~1/g,'/'));\n if (!(n in o)) return;\n o = o[n];\n }\n return o;\n};\n\nfunction pathEncoder (v) {\n return '/'+encodeURIComponent(v).replace(/~/g,'%7E');\n}\n/**\n * Accept an Array of property names and return a JSON Pointer URI fragment\n * @param Array a\n * @return {String}\n */\nexports.encodePath = function encodePointer(a){\n\t// ~ must be encoded explicitly because hacks\n\t// the slash is encoded by encodeURIComponent\n\treturn a.map(pathEncoder).join('');\n};\n\n\n/**\n * Calculate the number of decimal places a number uses\n * We need this to get correct results out of multipleOf and divisibleBy\n * when either figure is has decimal places, due to IEEE-754 float issues.\n * @param number\n * @returns {number}\n */\nexports.getDecimalPlaces = function getDecimalPlaces(number) {\n\n var decimalPlaces = 0;\n if (isNaN(number)) return decimalPlaces;\n\n if (typeof number !== 'number') {\n number = Number(number);\n }\n\n var parts = number.toString().split('e');\n if (parts.length === 2) {\n if (parts[1][0] !== '-') {\n return decimalPlaces;\n } else {\n decimalPlaces = Number(parts[1].slice(1));\n }\n }\n\n var decimalParts = parts[0].split('.');\n if (decimalParts.length === 2) {\n decimalPlaces += decimalParts[1].length;\n }\n\n return decimalPlaces;\n};\n\n\n\n/***/ }),\n/* 84 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************!*\\\n !*** ./~/react-tabs/lib/components/Tab.js ***!\n \\********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _propTypes = __webpack_require__(/*! prop-types */ 1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _react = __webpack_require__(/*! react */ 0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(/*! classnames */ 47);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DEFAULT_CLASS = 'react-tabs__tab';\n\nvar Tab = function (_Component) {\n _inherits(Tab, _Component);\n\n function Tab() {\n _classCallCheck(this, Tab);\n\n return _possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n Tab.prototype.componentDidMount = function componentDidMount() {\n this.checkFocus();\n };\n\n Tab.prototype.componentDidUpdate = function componentDidUpdate() {\n this.checkFocus();\n };\n\n Tab.prototype.checkFocus = function checkFocus() {\n if (this.props.selected && this.props.focus) {\n this.node.focus();\n }\n };\n\n Tab.prototype.render = function render() {\n var _cx,\n _this2 = this;\n\n var _props = this.props,\n children = _props.children,\n className = _props.className,\n disabled = _props.disabled,\n disabledClassName = _props.disabledClassName,\n focus = _props.focus,\n id = _props.id,\n panelId = _props.panelId,\n selected = _props.selected,\n selectedClassName = _props.selectedClassName,\n tabRef = _props.tabRef,\n attributes = _objectWithoutProperties(_props, ['children', 'className', 'disabled', 'disabledClassName', 'focus', 'id', 'panelId', 'selected', 'selectedClassName', 'tabRef']);\n\n return _react2.default.createElement(\n 'li',\n _extends({}, attributes, {\n className: (0, _classnames2.default)(className, (_cx = {}, _cx[selectedClassName] = selected, _cx[disabledClassName] = disabled, _cx)),\n ref: function ref(node) {\n _this2.node = node;\n if (tabRef) tabRef(node);\n },\n role: 'tab',\n id: id,\n 'aria-selected': selected ? 'true' : 'false',\n 'aria-disabled': disabled ? 'true' : 'false',\n 'aria-controls': panelId,\n tabIndex: selected ? '0' : null\n }),\n children\n );\n };\n\n return Tab;\n}(_react.Component);\n\nTab.defaultProps = {\n className: DEFAULT_CLASS,\n disabledClassName: DEFAULT_CLASS + '--disabled',\n focus: false,\n id: null,\n panelId: null,\n selected: false,\n selectedClassName: DEFAULT_CLASS + '--selected'\n};\nexports.default = Tab;\nTab.propTypes = undefined !== \"production\" ? {\n children: _propTypes2.default.oneOfType([_propTypes2.default.array, _propTypes2.default.object, _propTypes2.default.string]),\n className: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.array, _propTypes2.default.object]),\n disabled: _propTypes2.default.bool,\n disabledClassName: _propTypes2.default.string,\n focus: _propTypes2.default.bool, // private\n id: _propTypes2.default.string, // private\n panelId: _propTypes2.default.string, // private\n selected: _propTypes2.default.bool, // private\n selectedClassName: _propTypes2.default.string,\n tabRef: _propTypes2.default.func // private\n} : {};\n\n/***/ }),\n/* 85 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/react-tabs/lib/components/TabPanel.js ***!\n \\*************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _propTypes = __webpack_require__(/*! prop-types */ 1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _react = __webpack_require__(/*! react */ 0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(/*! classnames */ 47);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DEFAULT_CLASS = 'react-tabs__tab-panel';\n\nvar TabPanel = function (_Component) {\n _inherits(TabPanel, _Component);\n\n function TabPanel() {\n _classCallCheck(this, TabPanel);\n\n return _possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n TabPanel.prototype.render = function render() {\n var _cx;\n\n var _props = this.props,\n children = _props.children,\n className = _props.className,\n forceRender = _props.forceRender,\n id = _props.id,\n selected = _props.selected,\n selectedClassName = _props.selectedClassName,\n tabId = _props.tabId,\n attributes = _objectWithoutProperties(_props, ['children', 'className', 'forceRender', 'id', 'selected', 'selectedClassName', 'tabId']);\n\n return _react2.default.createElement(\n 'div',\n _extends({}, attributes, {\n className: (0, _classnames2.default)(className, (_cx = {}, _cx[selectedClassName] = selected, _cx)),\n role: 'tabpanel',\n id: id,\n 'aria-labelledby': tabId\n }),\n forceRender || selected ? children : null\n );\n };\n\n return TabPanel;\n}(_react.Component);\n\nTabPanel.defaultProps = {\n className: DEFAULT_CLASS,\n forceRender: false,\n selectedClassName: DEFAULT_CLASS + '--selected',\n style: {}\n};\nexports.default = TabPanel;\nTabPanel.propTypes = undefined !== \"production\" ? {\n children: _propTypes2.default.node,\n className: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.array, _propTypes2.default.object]),\n forceRender: _propTypes2.default.bool,\n id: _propTypes2.default.string, // private\n selected: _propTypes2.default.bool, // private\n selectedClassName: _propTypes2.default.string,\n tabId: _propTypes2.default.string // private\n} : {};\n\n/***/ }),\n/* 86 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************!*\\\n !*** ./~/reselect/lib/index.js ***!\n \\*********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.defaultMemoize = defaultMemoize;\nexports.createSelectorCreator = createSelectorCreator;\nexports.createStructuredSelector = createStructuredSelector;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction defaultEqualityCheck(a, b) {\n return a === b;\n}\n\nfunction defaultMemoize(func) {\n var equalityCheck = arguments.length <= 1 || arguments[1] === undefined ? defaultEqualityCheck : arguments[1];\n\n var lastArgs = null;\n var lastResult = null;\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (lastArgs === null || lastArgs.length !== args.length || !args.every(function (value, index) {\n return equalityCheck(value, lastArgs[index]);\n })) {\n lastResult = func.apply(undefined, args);\n }\n lastArgs = args;\n return lastResult;\n };\n}\n\nfunction getDependencies(funcs) {\n var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs;\n\n if (!dependencies.every(function (dep) {\n return typeof dep === 'function';\n })) {\n var dependencyTypes = dependencies.map(function (dep) {\n return typeof dep;\n }).join(', ');\n throw new Error('Selector creators expect all input-selectors to be functions, ' + ('instead received the following types: [' + dependencyTypes + ']'));\n }\n\n return dependencies;\n}\n\nfunction createSelectorCreator(memoize) {\n for (var _len2 = arguments.length, memoizeOptions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n memoizeOptions[_key2 - 1] = arguments[_key2];\n }\n\n return function () {\n for (var _len3 = arguments.length, funcs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n funcs[_key3] = arguments[_key3];\n }\n\n var recomputations = 0;\n var resultFunc = funcs.pop();\n var dependencies = getDependencies(funcs);\n\n var memoizedResultFunc = memoize.apply(undefined, [function () {\n recomputations++;\n return resultFunc.apply(undefined, arguments);\n }].concat(memoizeOptions));\n\n var selector = function selector(state, props) {\n for (var _len4 = arguments.length, args = Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {\n args[_key4 - 2] = arguments[_key4];\n }\n\n var params = dependencies.map(function (dependency) {\n return dependency.apply(undefined, [state, props].concat(args));\n });\n return memoizedResultFunc.apply(undefined, _toConsumableArray(params));\n };\n\n selector.resultFunc = resultFunc;\n selector.recomputations = function () {\n return recomputations;\n };\n selector.resetRecomputations = function () {\n return recomputations = 0;\n };\n return selector;\n };\n}\n\nvar createSelector = exports.createSelector = createSelectorCreator(defaultMemoize);\n\nfunction createStructuredSelector(selectors) {\n var selectorCreator = arguments.length <= 1 || arguments[1] === undefined ? createSelector : arguments[1];\n\n if (typeof selectors !== 'object') {\n throw new Error('createStructuredSelector expects first argument to be an object ' + ('where each property is a selector, instead received a ' + typeof selectors));\n }\n var objectKeys = Object.keys(selectors);\n return selectorCreator(objectKeys.map(function (key) {\n return selectors[key];\n }), function () {\n for (var _len5 = arguments.length, values = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n values[_key5] = arguments[_key5];\n }\n\n return values.reduce(function (composition, value, index) {\n composition[objectKeys[index]] = value;\n return composition;\n }, {});\n });\n}\n\n/***/ }),\n/* 87 */\n/* exports provided: default, accessorName, accessorFields */\n/* exports used: default, accessorName, accessorFields */\n/*!*************************************************!*\\\n !*** ./~/vega-lite/~/vega-util/src/accessor.js ***!\n \\*************************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = accessorName;\n/* harmony export (immutable) */ __webpack_exports__[\"c\"] = accessorFields;\n/* harmony default export */ __webpack_exports__[\"a\"] = (function(fn, fields, name) {\n fn.fields = fields || [];\n fn.fname = name;\n return fn;\n});\n\nfunction accessorName(fn) {\n return fn == null ? null : fn.fname;\n}\n\nfunction accessorFields(fn) {\n return fn == null ? null : fn.fields;\n}\n\n\n/***/ }),\n/* 88 */\n/* exports provided: default, accessorName, accessorFields */\n/* exports used: default, accessorName, accessorFields */\n/*!*************************************!*\\\n !*** ./~/vega-util/src/accessor.js ***!\n \\*************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = accessorName;\n/* harmony export (immutable) */ __webpack_exports__[\"c\"] = accessorFields;\n/* harmony default export */ __webpack_exports__[\"a\"] = (function(fn, fields, name) {\n return (\n fn.fields = fields || [],\n fn.fname = name,\n fn\n );\n});\n\nfunction accessorName(fn) {\n return fn == null ? null : fn.fname;\n}\n\nfunction accessorFields(fn) {\n return fn == null ? null : fn.fields;\n}\n\n\n/***/ }),\n/* 89 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************!*\\\n !*** (webpack)/buildin/global.js ***!\n \\***********************************/\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 90 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************!*\\\n !*** ./src/actions/log.ts ***!\n \\****************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LOG_ERRORS_ADD = 'LOG_ERRORS_ADD';\nexports.LOG_WARNINGS_ADD = 'LOG_WARNINGS_ADD';\nexports.LOG_WARNINGS_CLEAR = 'LOG_WARNINGS_CLEAR';\nexports.LOG_ERRORS_CLEAR = 'LOG_ERRORS_CLEAR';\n\n\n/***/ }),\n/* 91 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************!*\\\n !*** ./src/actions/result.ts ***!\n \\*******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar api_1 = __webpack_require__(/*! ../api/api */ 259);\nvar selectors_1 = __webpack_require__(/*! ../selectors */ 12);\nvar RESULT_ACTION_TYPE_INDEX = {\n RESULT_REQUEST: 1,\n RESULT_RECEIVE: 1,\n RESULT_LIMIT_INCREASE: 1,\n // Result modify actions\n RESULT_MODIFY_FIELD_PROP: 1,\n RESULT_MODIFY_NESTED_FIELD_PROP: 1\n};\nfunction isResultAction(action) {\n return RESULT_ACTION_TYPE_INDEX[action.type];\n}\nexports.isResultAction = isResultAction;\nexports.RESULT_REQUEST = 'RESULT_REQUEST';\nexports.RESULT_LIMIT_INCREASE = 'RESULT_LIMIT_INCREASE';\nexports.RESULT_RECEIVE = 'RESULT_RECEIVE';\nexports.RESULT_MODIFY_FIELD_PROP = 'RESULT_MODIFY_FIELD_PROP';\nexports.RESULT_MODIFY_NESTED_FIELD_PROP = 'RESULT_MODIFY_NESTED_FIELD_PROP';\nfunction resultRequest(resultType, query, filterKey) {\n return function (dispatch, getState) {\n var schema = selectors_1.selectSchema(getState());\n var data = selectors_1.selectData(getState());\n var config = selectors_1.selectConfig(getState());\n dispatch({\n type: exports.RESULT_REQUEST,\n payload: { resultType: resultType }\n });\n // TODO: pass in config\n return api_1.fetchCompassQLRecommend(query, schema, data, config).then(function (preFilteredPlots) {\n var plots = (filterKey ?\n preFilteredPlots.filter(function (p) { return p.groupByKey !== filterKey; }) :\n preFilteredPlots).map(function (p) { return p.plot; });\n dispatch({\n type: exports.RESULT_RECEIVE,\n payload: { query: query, plots: plots, resultType: resultType }\n });\n });\n };\n}\nexports.resultRequest = resultRequest;\n\n\n/***/ }),\n/* 92 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************!*\\\n !*** ./src/actions/shelf-preview.ts ***!\n \\**************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SHELF_PREVIEW_SPEC = 'SHELF_PREVIEW_SPEC';\nexports.SHELF_PREVIEW_QUERY = 'SHELF_PREVIEW_QUERY';\nexports.SHELF_PREVIEW_DISABLE = 'SHELF_PREVIEW_DISABLE';\n\n\n/***/ }),\n/* 93 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************!*\\\n !*** ./src/models/result/index.ts ***!\n \\************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__export(__webpack_require__(/*! ./plot */ 708));\nexports.DEFAULT_RESULT = {\n isLoading: false,\n plots: null,\n query: null,\n limit: 8\n};\nexports.DEFAULT_RESULT_INDEX = {\n main: exports.DEFAULT_RESULT,\n addCategoricalField: exports.DEFAULT_RESULT,\n addQuantitativeField: exports.DEFAULT_RESULT,\n addTemporalField: exports.DEFAULT_RESULT,\n alternativeEncodings: exports.DEFAULT_RESULT,\n histograms: exports.DEFAULT_RESULT,\n summaries: exports.DEFAULT_RESULT\n};\nexports.RESULT_TYPES = \n// Need to cast as keys return string[] by default\nObject.keys(exports.DEFAULT_RESULT_INDEX);\n\n\n/***/ }),\n/* 94 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************!*\\\n !*** external \"react-tether\" ***!\n \\*******************************/\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_94__;\n\n/***/ }),\n/* 95 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************!*\\\n !*** ./src/models/config.ts ***!\n \\******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n;\nexports.DEFAULT_VOYAGER_CONFIG = {\n showDataSourceSelector: true,\n serverUrl: null,\n hideHeader: false,\n hideFooter: false,\n relatedViews: 'initiallyShown',\n wildcards: 'enabled'\n};\n\n\n/***/ }),\n/* 96 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************!*\\\n !*** ./src/selectors/result.ts ***!\n \\*********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:enable:no-unused-variable\nvar reselect_1 = __webpack_require__(/*! reselect */ 86);\nvar result_1 = __webpack_require__(/*! ../models/result */ 93);\nvar shelf_1 = __webpack_require__(/*! ./shelf */ 58);\nvar tab_1 = __webpack_require__(/*! ./tab */ 173);\nexports.selectResult = result_1.RESULT_TYPES.reduce(function (selectors, resultType) {\n selectors[resultType] = reselect_1.createSelector(tab_1.selectActiveTab, function (plotTabState) { return plotTabState.result[resultType]; });\n return selectors;\n}, {});\nexports.selectResultLimit = result_1.RESULT_TYPES.reduce(function (selectors, resultType) {\n selectors[resultType] = reselect_1.createSelector(exports.selectResult[resultType], function (result) { return result.limit; });\n return selectors;\n}, {});\n// This one is not exported as it does not correctly include filter transforms yet\nvar selectResultPlots = result_1.RESULT_TYPES.reduce(function (selectors, resultType) {\n selectors[resultType] = reselect_1.createSelector(exports.selectResult[resultType], function (result) { return result.plots; });\n return selectors;\n}, {});\nexports.selectMainSpec = reselect_1.createSelector(shelf_1.selectIsQuerySpecific, shelf_1.selectIsQueryEmpty, selectResultPlots.main, function (isQuerySpecific, isQueryEmpty, mainPlots) {\n if (!isQuerySpecific || !mainPlots || isQueryEmpty) {\n return undefined;\n }\n return mainPlots[0].spec;\n});\n\n\n/***/ }),\n/* 97 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/babel-runtime/helpers/typeof.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _iterator = __webpack_require__(/*! ../core-js/symbol/iterator */ 345);\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _symbol = __webpack_require__(/*! ../core-js/symbol */ 344);\n\nvar _symbol2 = _interopRequireDefault(_symbol);\n\nvar _typeof = typeof _symbol2.default === \"function\" && typeof _iterator2.default === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = typeof _symbol2.default === \"function\" && _typeof(_iterator2.default) === \"symbol\" ? function (obj) {\n return typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n} : function (obj) {\n return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n};\n\n/***/ }),\n/* 98 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************!*\\\n !*** ./~/compassql/build/src/model.js ***!\n \\****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar type_1 = __webpack_require__(/*! vega-lite/build/src/type */ 16);\nvar property_1 = __webpack_require__(/*! ./property */ 18);\nvar wildcard_1 = __webpack_require__(/*! ./wildcard */ 6);\nvar wildcardindex_1 = __webpack_require__(/*! ./wildcardindex */ 369);\nvar spec_1 = __webpack_require__(/*! ./query/spec */ 76);\nvar encoding_1 = __webpack_require__(/*! ./query/encoding */ 14);\nvar groupby_1 = __webpack_require__(/*! ./query/groupby */ 186);\nvar shorthand_1 = __webpack_require__(/*! ./query/shorthand */ 99);\nvar util_1 = __webpack_require__(/*! ./util */ 13);\nvar util_2 = __webpack_require__(/*! datalib/src/util */ 32);\nvar nest_1 = __webpack_require__(/*! ./nest */ 125);\n/**\n * Internal class for specQuery that provides helper for the enumeration process.\n */\nvar SpecQueryModel = /** @class */ (function () {\n function SpecQueryModel(spec, wildcardIndex, schema, opt, wildcardAssignment) {\n this._rankingScore = {};\n this._spec = spec;\n this._channelFieldCount = spec.encodings.reduce(function (m, encQ) {\n if (!wildcard_1.isWildcard(encQ.channel) && (!encoding_1.isAutoCountQuery(encQ) || encQ.autoCount !== false)) {\n m[encQ.channel + ''] = 1;\n }\n return m;\n }, {});\n this._wildcardIndex = wildcardIndex;\n this._assignedWildcardIndex = wildcardAssignment;\n this._opt = opt;\n this._schema = schema;\n }\n /**\n * Build an WildcardIndex by detecting enumeration specifiers\n * in the input specQuery and replace short wildcards with\n * full ones that includes both names and enumValues.\n *\n * @return a SpecQueryModel that wraps the specQuery and the WildcardIndex.\n */\n SpecQueryModel.build = function (specQ, schema, opt) {\n var wildcardIndex = new wildcardindex_1.WildcardIndex();\n // mark\n if (wildcard_1.isWildcard(specQ.mark)) {\n var name_1 = wildcard_1.getDefaultName(property_1.Property.MARK);\n specQ.mark = wildcard_1.initWildcard(specQ.mark, name_1, opt.enum.mark);\n wildcardIndex.setMark(specQ.mark);\n }\n // TODO: transform\n // encodings\n specQ.encodings.forEach(function (encQ, index) {\n if (encoding_1.isAutoCountQuery(encQ)) {\n // This is only for testing purpose\n console.warn('A field with autoCount should not be included as autoCount meant to be an internal object.');\n encQ.type = type_1.Type.QUANTITATIVE; // autoCount is always quantitative\n }\n if (encoding_1.isFieldQuery(encQ) && encQ.type === undefined) {\n // type is optional -- we automatically augment wildcard if not specified\n encQ.type = wildcard_1.SHORT_WILDCARD;\n }\n // For each property of the encodingQuery, enumerate\n property_1.ENCODING_TOPLEVEL_PROPS.forEach(function (prop) {\n if (wildcard_1.isWildcard(encQ[prop])) {\n // Assign default wildcard name and enum values.\n var defaultWildcardName = wildcard_1.getDefaultName(prop) + index;\n var defaultEnumValues = wildcard_1.getDefaultEnumValues(prop, schema, opt);\n var wildcard = encQ[prop] = wildcard_1.initWildcard(encQ[prop], defaultWildcardName, defaultEnumValues);\n // Add index of the encoding mapping to the property's wildcard index.\n wildcardIndex.setEncodingProperty(index, prop, wildcard);\n }\n });\n // For each nested property of the encoding query (e.g., encQ.bin.maxbins)\n property_1.ENCODING_NESTED_PROPS.forEach(function (prop) {\n var propObj = encQ[prop.parent]; // the property object e.g., encQ.bin\n if (propObj) {\n var child = prop.child;\n if (wildcard_1.isWildcard(propObj[child])) {\n // Assign default wildcard name and enum values.\n var defaultWildcardName = wildcard_1.getDefaultName(prop) + index;\n var defaultEnumValues = wildcard_1.getDefaultEnumValues(prop, schema, opt);\n var wildcard = propObj[child] = wildcard_1.initWildcard(propObj[child], defaultWildcardName, defaultEnumValues);\n // Add index of the encoding mapping to the property's wildcard index.\n wildcardIndex.setEncodingProperty(index, prop, wildcard);\n }\n }\n });\n });\n // AUTO COUNT\n // Add Auto Count Field\n if (opt.autoAddCount) {\n var channel = {\n name: wildcard_1.getDefaultName(property_1.Property.CHANNEL) + specQ.encodings.length,\n enum: wildcard_1.getDefaultEnumValues(property_1.Property.CHANNEL, schema, opt)\n };\n var autoCount = {\n name: wildcard_1.getDefaultName(property_1.Property.AUTOCOUNT) + specQ.encodings.length,\n enum: [false, true]\n };\n var countEncQ = {\n channel: channel,\n autoCount: autoCount,\n type: type_1.Type.QUANTITATIVE\n };\n specQ.encodings.push(countEncQ);\n var index = specQ.encodings.length - 1;\n // Add index of the encoding mapping to the property's wildcard index.\n wildcardIndex.setEncodingProperty(index, property_1.Property.CHANNEL, channel);\n wildcardIndex.setEncodingProperty(index, property_1.Property.AUTOCOUNT, autoCount);\n }\n return new SpecQueryModel(specQ, wildcardIndex, schema, opt, {});\n };\n Object.defineProperty(SpecQueryModel.prototype, \"wildcardIndex\", {\n get: function () {\n return this._wildcardIndex;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SpecQueryModel.prototype, \"schema\", {\n get: function () {\n return this._schema;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SpecQueryModel.prototype, \"specQuery\", {\n get: function () {\n return this._spec;\n },\n enumerable: true,\n configurable: true\n });\n SpecQueryModel.prototype.duplicate = function () {\n return new SpecQueryModel(util_1.duplicate(this._spec), this._wildcardIndex, this._schema, this._opt, util_1.duplicate(this._assignedWildcardIndex));\n };\n SpecQueryModel.prototype.setMark = function (mark) {\n var name = this._wildcardIndex.mark.name;\n this._assignedWildcardIndex[name] = this._spec.mark = mark;\n };\n SpecQueryModel.prototype.resetMark = function () {\n var wildcard = this._spec.mark = this._wildcardIndex.mark;\n delete this._assignedWildcardIndex[wildcard.name];\n };\n SpecQueryModel.prototype.getMark = function () {\n return this._spec.mark;\n };\n SpecQueryModel.prototype.getEncodingProperty = function (index, prop) {\n var encQ = this._spec.encodings[index];\n if (property_1.isEncodingNestedProp(prop)) {\n return encQ[prop.parent][prop.child];\n }\n return encQ[prop]; // encoding property (non-nested)\n };\n SpecQueryModel.prototype.setEncodingProperty = function (index, prop, value, wildcard) {\n var encQ = this._spec.encodings[index];\n if (prop === property_1.Property.CHANNEL && encQ.channel && !wildcard_1.isWildcard(encQ.channel)) {\n // If there is an old channel\n this._channelFieldCount[encQ.channel]--;\n }\n if (property_1.isEncodingNestedProp(prop)) {\n encQ[prop.parent][prop.child] = value;\n }\n else if (property_1.hasNestedProperty(prop) && value === true) {\n encQ[prop] = util_1.extend({}, encQ[prop], // copy all existing properties\n { enum: undefined, name: undefined } // except name and values to it no longer an wildcard\n );\n }\n else {\n encQ[prop] = value;\n }\n this._assignedWildcardIndex[wildcard.name] = value;\n if (prop === property_1.Property.CHANNEL) {\n // If there is a new channel, make sure it exists and add it to the count.\n this._channelFieldCount[value] = (this._channelFieldCount[value] || 0) + 1;\n }\n };\n SpecQueryModel.prototype.resetEncodingProperty = function (index, prop, wildcard) {\n var encQ = this._spec.encodings[index];\n if (prop === property_1.Property.CHANNEL) {\n this._channelFieldCount[encQ.channel]--;\n }\n // reset it to wildcard\n if (property_1.isEncodingNestedProp(prop)) {\n encQ[prop.parent][prop.child] = wildcard;\n }\n else {\n encQ[prop] = wildcard;\n }\n // add remove value that is reset from the assignment map\n delete this._assignedWildcardIndex[wildcard.name];\n };\n SpecQueryModel.prototype.channelUsed = function (channel) {\n // do not include encoding that has autoCount = false because it is not a part of the output spec.\n return this._channelFieldCount[channel] > 0;\n };\n SpecQueryModel.prototype.stack = function () {\n return spec_1.stack(this._spec);\n };\n SpecQueryModel.prototype.getEncodings = function () {\n // do not include encoding that has autoCount = false because it is not a part of the output spec.\n return this._spec.encodings.filter(function (encQ) { return !encoding_1.isDisabledAutoCountQuery(encQ); });\n };\n SpecQueryModel.prototype.getEncodingQueryByChannel = function (channel) {\n for (var _i = 0, _a = this._spec.encodings; _i < _a.length; _i++) {\n var specEncoding = _a[_i];\n if (specEncoding.channel === channel) {\n return specEncoding;\n }\n }\n return undefined;\n };\n SpecQueryModel.prototype.getEncodingQueryByIndex = function (i) {\n return this._spec.encodings[i];\n };\n SpecQueryModel.prototype.isAggregate = function () {\n return spec_1.isAggregate(this._spec);\n };\n SpecQueryModel.prototype.toShorthand = function (groupBy) {\n if (groupBy) {\n if (util_2.isString(groupBy)) {\n return nest_1.getGroupByKey(this.specQuery, groupBy);\n }\n var parsedGroupBy = groupby_1.parseGroupBy(groupBy);\n return shorthand_1.spec(this._spec, parsedGroupBy.include, parsedGroupBy.replacer);\n }\n return shorthand_1.spec(this._spec);\n };\n SpecQueryModel.prototype._encoding = function () {\n var encoding = {};\n for (var _i = 0, _a = this._spec.encodings; _i < _a.length; _i++) {\n var encQ = _a[_i];\n // Need to cast here so we can assign properties later\n var fieldDef = {};\n // For count field that is automatically added, convert to correct vega-lite fieldDef\n if (encoding_1.isEnabledAutoCountQuery(encQ)) {\n fieldDef = {\n aggregate: 'count',\n field: '*',\n type: 'quantitative'\n };\n }\n else if (encoding_1.isValueQuery(encQ) || encoding_1.isDisabledAutoCountQuery(encQ)) {\n continue; // Do not include this in the output.\n }\n // if channel is a wildcard, return null\n if (wildcard_1.isWildcard(encQ.channel))\n return null;\n // assemble other property into a field def.\n var PROPERTIES = [property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.FIELD, property_1.Property.TYPE, property_1.Property.SCALE, property_1.Property.SORT, property_1.Property.AXIS, property_1.Property.LEGEND];\n for (var _b = 0, PROPERTIES_1 = PROPERTIES; _b < PROPERTIES_1.length; _b++) {\n var prop = PROPERTIES_1[_b];\n // if the property's a wildcard, return null\n var encodingProperty = encQ[prop];\n if (wildcard_1.isWildcard(encodingProperty)) {\n return null;\n }\n else {\n // all channels support this prop\n var isSupportedByChannel = (!shorthand_1.PROPERTY_SUPPORTED_CHANNELS[prop] || shorthand_1.PROPERTY_SUPPORTED_CHANNELS[prop][encQ.channel]);\n if (isSupportedByChannel) {\n if (encodingProperty !== undefined) {\n if (property_1.ENCODING_NESTED_PROP_PARENT_INDEX[prop]) {\n for (var childProp in encQ[prop]) {\n // ensure nested properties are not wildcard before assigning to field def\n if (wildcard_1.isWildcard(encQ[prop][childProp])) {\n return null;\n }\n }\n }\n fieldDef[prop] = encodingProperty;\n }\n if (prop === property_1.Property.SCALE && encoding_1.isFieldQuery(encQ) && encQ.type === type_1.Type.ORDINAL) {\n var scale = encQ.scale;\n var ordinalDomain = this._schema.fieldSchema(encQ.field).ordinalDomain;\n if (scale !== null && ordinalDomain) {\n fieldDef[property_1.Property.SCALE] = __assign({ domain: ordinalDomain }, (util_1.isObject(scale) ? scale : {}));\n }\n }\n }\n }\n }\n if (fieldDef.bin === false) {\n // exclude bin false\n delete fieldDef.bin;\n }\n encoding[encQ.channel] = fieldDef;\n }\n return encoding;\n };\n /**\n * Convert a query to a Vega-Lite spec if it is completed.\n * @return a Vega-Lite spec if completed, null otherwise.\n */\n SpecQueryModel.prototype.toSpec = function (data) {\n if (wildcard_1.isWildcard(this._spec.mark))\n return null;\n var spec = {};\n data = data || this._spec.data;\n if (data) {\n spec.data = data;\n }\n if (this._spec.transform) {\n spec.transform = this._spec.transform;\n }\n spec.mark = this._spec.mark;\n spec.encoding = this._encoding();\n if (spec.encoding === null) {\n return null;\n }\n if (this._spec.config || this._opt.defaultSpecConfig)\n spec.config = util_1.extend({}, this._opt.defaultSpecConfig, this._spec.config);\n return spec;\n };\n SpecQueryModel.prototype.getRankingScore = function (rankingName) {\n return this._rankingScore[rankingName];\n };\n SpecQueryModel.prototype.setRankingScore = function (rankingName, score) {\n this._rankingScore[rankingName] = score;\n };\n return SpecQueryModel;\n}());\nexports.SpecQueryModel = SpecQueryModel;\nfunction getTopSpecQueryItem(specQuery) {\n var topItem = specQuery.items[0];\n while (topItem && isSpecQueryGroup(topItem)) {\n topItem = topItem.items[0];\n }\n return topItem;\n}\nexports.getTopSpecQueryItem = getTopSpecQueryItem;\nfunction isSpecQueryGroup(item) {\n return item.items !== undefined;\n}\nexports.isSpecQueryGroup = isSpecQueryGroup;\n\n\n/***/ }),\n/* 99 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/compassql/build/src/query/shorthand.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar aggregate_1 = __webpack_require__(/*! vega-lite/build/src/aggregate */ 62);\nvar channel_1 = __webpack_require__(/*! vega-lite/build/src/channel */ 3);\nvar timeunit_1 = __webpack_require__(/*! vega-lite/build/src/timeunit */ 23);\nvar type_1 = __webpack_require__(/*! vega-lite/build/src/type */ 16);\nvar util_1 = __webpack_require__(/*! datalib/src/util */ 32);\nvar encoding_1 = __webpack_require__(/*! ./encoding */ 14);\nvar spec_1 = __webpack_require__(/*! ./spec */ 76);\nvar wildcard_1 = __webpack_require__(/*! ../wildcard */ 6);\nvar property_1 = __webpack_require__(/*! ../property */ 18);\nvar propindex_1 = __webpack_require__(/*! ../propindex */ 48);\nvar util_2 = __webpack_require__(/*! ../util */ 13);\nfunction getReplacerIndex(replaceIndex) {\n return replaceIndex.map(function (r) { return getReplacer(r); });\n}\nexports.getReplacerIndex = getReplacerIndex;\nfunction getReplacer(replace) {\n return function (s) {\n if (replace[s] !== undefined) {\n return replace[s];\n }\n return s;\n };\n}\nexports.getReplacer = getReplacer;\nfunction value(v, replacer) {\n if (wildcard_1.isWildcard(v)) {\n // Return the enum array if it's a full wildcard, or just return SHORT_WILDCARD for short ones.\n if (!wildcard_1.isShortWildcard(v) && v.enum) {\n return wildcard_1.SHORT_WILDCARD + JSON.stringify(v.enum);\n }\n else {\n return wildcard_1.SHORT_WILDCARD;\n }\n }\n if (replacer) {\n return replacer(v);\n }\n return v;\n}\nexports.value = value;\nfunction replace(v, replacer) {\n if (replacer) {\n return replacer(v);\n }\n return v;\n}\nexports.replace = replace;\nexports.REPLACE_NONE = new propindex_1.PropIndex();\nexports.INCLUDE_ALL = \n// FIXME: remove manual TRANSFORM concat once we really support enumerating transform.\n[].concat(property_1.DEFAULT_PROP_PRECEDENCE, property_1.SORT_PROPS, [property_1.Property.TRANSFORM, property_1.Property.STACK])\n .reduce(function (pi, prop) { return pi.set(prop, true); }, new propindex_1.PropIndex());\nfunction vlSpec(vlspec, include, replace) {\n if (include === void 0) { include = exports.INCLUDE_ALL; }\n if (replace === void 0) { replace = exports.REPLACE_NONE; }\n var specQ = spec_1.fromSpec(vlspec);\n return spec(specQ, include, replace);\n}\nexports.vlSpec = vlSpec;\nexports.PROPERTY_SUPPORTED_CHANNELS = {\n axis: { x: true, y: true, row: true, column: true },\n legend: { color: true, opacity: true, size: true, shape: true },\n scale: { x: true, y: true, color: true, opacity: true, row: true, column: true, size: true, shape: true },\n sort: { x: true, y: true, path: true, order: true }\n};\n/**\n * Returns a shorthand for a spec query\n * @param specQ a spec query\n * @param include Dict Set listing property types (key) to be included in the shorthand\n * @param replace Dictionary of replace function for values of a particular property type (key)\n */\nfunction spec(specQ, include, replace) {\n if (include === void 0) { include = exports.INCLUDE_ALL; }\n if (replace === void 0) { replace = exports.REPLACE_NONE; }\n var parts = [];\n if (include.get(property_1.Property.MARK)) {\n parts.push(value(specQ.mark, replace.get(property_1.Property.MARK)));\n }\n if (specQ.transform && specQ.transform.length > 0) {\n parts.push('transform:' + JSON.stringify(specQ.transform));\n }\n // TODO: extract this to its own stack method\n if (include.get(property_1.Property.STACK)) {\n var _stack = spec_1.stack(specQ);\n if (_stack) {\n // TODO: Refactor this once we have child stack property.\n // Exclude type since we don't care about type in stack\n var includeExceptType = include.duplicate().set('type', false);\n var field = fieldDef(_stack.fieldEncQ, includeExceptType, replace);\n var groupby = _stack.groupByEncQ ? fieldDef(_stack.groupByEncQ, includeExceptType, replace) : undefined;\n parts.push('stack={field:' + field + ',' +\n (groupby ? 'by:' + groupby + ',' : '') +\n 'offset:' + _stack.offset + '}');\n }\n }\n if (specQ.encodings) {\n var encodings = specQ.encodings.reduce(function (encQs, encQ) {\n // Exclude encoding mapping with autoCount=false as they are basically disabled.\n if (!encoding_1.isDisabledAutoCountQuery(encQ)) {\n var str = encoding(encQ, include, replace);\n if (str) {\n encQs.push(str);\n }\n }\n return encQs;\n }, [])\n .sort() // sort at the end to ignore order\n .join('|');\n if (encodings) {\n parts.push(encodings);\n }\n }\n return parts.join('|');\n}\nexports.spec = spec;\n/**\n * Returns a shorthand for an encoding query\n * @param encQ an encoding query\n * @param include Dict Set listing property types (key) to be included in the shorthand\n * @param replace Dictionary of replace function for values of a particular property type (key)\n */\nfunction encoding(encQ, include, replace) {\n if (include === void 0) { include = exports.INCLUDE_ALL; }\n if (replace === void 0) { replace = exports.REPLACE_NONE; }\n var parts = [];\n if (include.get(property_1.Property.CHANNEL)) {\n parts.push(value(encQ.channel, replace.get(property_1.Property.CHANNEL)));\n }\n if (encoding_1.isFieldQuery(encQ)) {\n var fieldDefStr = fieldDef(encQ, include, replace);\n if (fieldDefStr) {\n parts.push(fieldDefStr);\n }\n }\n else if (encoding_1.isValueQuery(encQ)) {\n parts.push(encQ.value);\n }\n return parts.join(':');\n}\nexports.encoding = encoding;\n/**\n * Returns a field definition shorthand for an encoding query\n * @param encQ an encoding query\n * @param include Dict Set listing property types (key) to be included in the shorthand\n * @param replace Dictionary of replace function for values of a particular property type (key)\n */\nfunction fieldDef(encQ, include, replacer) {\n if (include === void 0) { include = exports.INCLUDE_ALL; }\n if (replacer === void 0) { replacer = exports.REPLACE_NONE; }\n if (include.get(property_1.Property.AGGREGATE) && encoding_1.isDisabledAutoCountQuery(encQ)) {\n return '-';\n }\n var fn = func(encQ, include, replacer);\n var props = fieldDefProps(encQ, include, replacer);\n var fieldAndParams;\n if (encoding_1.isFieldQuery(encQ)) {\n // field\n fieldAndParams = include.get('field') ? value(encQ.field, replacer.get('field')) : '...';\n // type\n if (include.get(property_1.Property.TYPE)) {\n if (wildcard_1.isWildcard(encQ.type)) {\n fieldAndParams += ',' + value(encQ.type, replacer.get(property_1.Property.TYPE));\n }\n else {\n var typeShort = ((encQ.type || type_1.Type.QUANTITATIVE) + '').substr(0, 1);\n fieldAndParams += ',' + value(typeShort, replacer.get(property_1.Property.TYPE));\n }\n }\n // encoding properties\n fieldAndParams += props.map(function (p) {\n var val = p.value instanceof Array ? '[' + p.value + ']' : p.value;\n return ',' + p.key + '=' + val;\n }).join('');\n }\n else if (encoding_1.isAutoCountQuery(encQ)) {\n fieldAndParams = '*,q';\n }\n if (!fieldAndParams) {\n return null;\n }\n if (fn) {\n var fnPrefix = util_1.isString(fn) ? fn : wildcard_1.SHORT_WILDCARD +\n (util_2.keys(fn).length > 0 ? JSON.stringify(fn) : '');\n return fnPrefix + '(' + fieldAndParams + ')';\n }\n return fieldAndParams;\n}\nexports.fieldDef = fieldDef;\n/**\n * Return function part of\n */\nfunction func(fieldQ, include, replacer) {\n if (include.get(property_1.Property.AGGREGATE) && fieldQ.aggregate && !wildcard_1.isWildcard(fieldQ.aggregate)) {\n return replace(fieldQ.aggregate, replacer.get(property_1.Property.AGGREGATE));\n }\n else if (include.get(property_1.Property.AGGREGATE) && encoding_1.isEnabledAutoCountQuery(fieldQ)) {\n // autoCount is considered a part of aggregate\n return replace('count', replacer.get(property_1.Property.AGGREGATE));\n ;\n }\n else if (include.get(property_1.Property.TIMEUNIT) && fieldQ.timeUnit && !wildcard_1.isWildcard(fieldQ.timeUnit)) {\n return replace(fieldQ.timeUnit, replacer.get(property_1.Property.TIMEUNIT));\n }\n else if (include.get(property_1.Property.BIN) && fieldQ.bin && !wildcard_1.isWildcard(fieldQ.bin)) {\n return 'bin';\n }\n else {\n var fn = null;\n for (var _i = 0, _a = [property_1.Property.AGGREGATE, property_1.Property.AUTOCOUNT, property_1.Property.TIMEUNIT, property_1.Property.BIN]; _i < _a.length; _i++) {\n var prop = _a[_i];\n var val = fieldQ[prop];\n if (include.get(prop) && fieldQ[prop] && wildcard_1.isWildcard(val)) {\n // assign fnEnumIndex[prop] = array of enum values or just \"?\" if it is SHORT_WILDCARD\n fn = fn || {};\n fn[prop] = wildcard_1.isShortWildcard(val) ? val : val.enum;\n }\n }\n if (fn && fieldQ.hasFn) {\n fn.hasFn = true;\n }\n return fn;\n }\n}\n/**\n * Return key-value of parameters of field defs\n */\nfunction fieldDefProps(fieldQ, include, replacer) {\n /** Encoding properties e.g., Scale, Axis, Legend */\n var props = [];\n // Parameters of function such as bin will be just top-level properties\n if (!util_2.isBoolean(fieldQ.bin) && !wildcard_1.isShortWildcard(fieldQ.bin)) {\n var bin = fieldQ.bin;\n for (var child in bin) {\n var prop = property_1.getEncodingNestedProp('bin', child);\n if (prop && include.get(prop) && bin[child] !== undefined) {\n props.push({\n key: child,\n value: value(bin[child], replacer.get(prop))\n });\n }\n }\n // Sort to make sure that parameter are ordered consistently\n props.sort(function (a, b) { return a.key.localeCompare(b.key); });\n }\n for (var _i = 0, _a = [property_1.Property.SCALE, property_1.Property.SORT, property_1.Property.AXIS, property_1.Property.LEGEND]; _i < _a.length; _i++) {\n var parent_1 = _a[_i];\n if (!wildcard_1.isWildcard(fieldQ.channel) && !exports.PROPERTY_SUPPORTED_CHANNELS[parent_1][fieldQ.channel]) {\n continue;\n }\n if (include.get(parent_1) && fieldQ[parent_1] !== undefined) {\n var parentValue = fieldQ[parent_1];\n if (util_2.isBoolean(parentValue) || parentValue === null) {\n // `scale`, `axis`, `legend` can be false/null.\n props.push({\n key: parent_1 + '',\n value: parentValue || false // return true or false (false if null)\n });\n }\n else if (util_1.isString(parentValue)) {\n // `sort` can be a string (ascending/descending).\n props.push({\n key: parent_1 + '',\n value: replace(JSON.stringify(parentValue), replacer.get(parent_1))\n });\n }\n else {\n var nestedPropChildren = [];\n for (var child in parentValue) {\n var nestedProp = property_1.getEncodingNestedProp(parent_1, child);\n if (nestedProp && include.get(nestedProp) && parentValue[child] !== undefined) {\n nestedPropChildren.push({\n key: child,\n value: value(parentValue[child], replacer.get(nestedProp))\n });\n }\n }\n if (nestedPropChildren.length > 0) {\n var nestedPropObject = nestedPropChildren.sort(function (a, b) { return a.key.localeCompare(b.key); })\n .reduce(function (o, item) {\n o[item.key] = item.value;\n return o;\n }, {});\n // Sort to make sure that parameter are ordered consistently\n props.push({\n key: parent_1 + '',\n value: JSON.stringify(nestedPropObject)\n });\n }\n }\n }\n }\n return props;\n}\nfunction parse(shorthand) {\n // TODO(https://github.com/uwdata/compassql/issues/259):\n // Do not split directly, but use an upgraded version of `getClosingBraceIndex()`\n var splitShorthand = shorthand.split('|');\n var specQ = {\n mark: splitShorthand[0],\n encodings: []\n };\n for (var i = 1; i < splitShorthand.length; i++) {\n var part = splitShorthand[i];\n var splitPart = splitWithTail(part, ':', 1);\n var splitPartKey = splitPart[0];\n var splitPartValue = splitPart[1];\n if (channel_1.isChannel(splitPartKey) || splitPartKey === '?') {\n var encQ = shorthandParser.encoding(splitPartKey, splitPartValue);\n specQ.encodings.push(encQ);\n continue;\n }\n if (splitPartKey === 'transform') {\n specQ.transform = JSON.parse(splitPartValue);\n continue;\n }\n }\n return specQ;\n}\nexports.parse = parse;\n/**\n * Split a string n times into substrings with the specified delimiter and return them as an array.\n * @param str The string to be split\n * @param delim The delimiter string used to separate the string\n * @param number The value used to determine how many times the string is split\n */\nfunction splitWithTail(str, delim, count) {\n var result = [];\n var lastIndex = 0;\n for (var i = 0; i < count; i++) {\n var indexOfDelim = str.indexOf(delim, lastIndex);\n if (indexOfDelim !== -1) {\n result.push(str.substring(lastIndex, indexOfDelim));\n lastIndex = indexOfDelim + 1;\n }\n else {\n break;\n }\n }\n result.push(str.substr(lastIndex));\n // If the specified count is greater than the number of delimiters that exist in the string,\n // an empty string will be pushed count minus number of delimiter occurence times.\n if (result.length !== count + 1) {\n while (result.length !== count + 1) {\n result.push('');\n }\n }\n return result;\n}\nexports.splitWithTail = splitWithTail;\nvar shorthandParser;\n(function (shorthandParser) {\n function encoding(channel, fieldDefShorthand) {\n var encQMixins = fieldDefShorthand.indexOf('(') !== -1 ?\n fn(fieldDefShorthand) :\n rawFieldDef(splitWithTail(fieldDefShorthand, ',', 2));\n return __assign({ channel: channel }, encQMixins);\n }\n shorthandParser.encoding = encoding;\n function rawFieldDef(fieldDefPart) {\n var fieldQ = {};\n fieldQ.field = fieldDefPart[0];\n fieldQ.type = type_1.getFullName(fieldDefPart[1].toUpperCase()) || '?';\n var partParams = fieldDefPart[2];\n var closingBraceIndex = 0;\n var i = 0;\n while (i < partParams.length) {\n var propEqualSignIndex = partParams.indexOf('=', i);\n var parsedValue = void 0;\n if (propEqualSignIndex !== -1) {\n var prop = partParams.substring(i, propEqualSignIndex);\n if (partParams[i + prop.length + 1] === '{') {\n var openingBraceIndex = i + prop.length + 1;\n closingBraceIndex = getClosingIndex(openingBraceIndex, partParams, '}');\n var value_1 = partParams.substring(openingBraceIndex, closingBraceIndex + 1);\n parsedValue = JSON.parse(value_1);\n // index after next comma\n i = closingBraceIndex + 2;\n }\n else if (partParams[i + prop.length + 1] === '[') {\n // find closing square bracket\n var openingBracketIndex = i + prop.length + 1;\n var closingBracketIndex = getClosingIndex(openingBracketIndex, partParams, ']');\n var value_2 = partParams.substring(openingBracketIndex, closingBracketIndex + 1);\n parsedValue = JSON.parse(value_2);\n // index after next comma\n i = closingBracketIndex + 2;\n }\n else {\n var propIndex = i;\n // Substring until the next comma (or end of the string)\n var nextCommaIndex = partParams.indexOf(',', i + prop.length);\n if (nextCommaIndex === -1) {\n nextCommaIndex = partParams.length;\n }\n // index after next comma\n i = nextCommaIndex + 1;\n parsedValue = JSON.parse(partParams.substring(propIndex + prop.length + 1, nextCommaIndex));\n }\n if (property_1.hasNestedProperty(prop)) {\n fieldQ[prop] = parsedValue;\n }\n else {\n // prop is a property of the aggregation function such as bin\n fieldQ.bin = fieldQ.bin || {};\n fieldQ.bin[prop] = parsedValue;\n }\n }\n else {\n // something is wrong with the format of the partParams\n // exits loop if don't have then infintie loop\n break;\n }\n }\n return fieldQ;\n }\n shorthandParser.rawFieldDef = rawFieldDef;\n function getClosingIndex(openingBraceIndex, str, closingChar) {\n for (var i = openingBraceIndex; i < str.length; i++) {\n if (str[i] === closingChar) {\n return i;\n }\n }\n }\n shorthandParser.getClosingIndex = getClosingIndex;\n function fn(fieldDefShorthand) {\n var fieldQ = {};\n // Aggregate, Bin, TimeUnit as wildcard case\n if (fieldDefShorthand[0] === '?') {\n var closingBraceIndex = getClosingIndex(1, fieldDefShorthand, '}');\n var fnEnumIndex = JSON.parse(fieldDefShorthand.substring(1, closingBraceIndex + 1));\n for (var encodingProperty in fnEnumIndex) {\n if (util_2.isArray(fnEnumIndex[encodingProperty])) {\n fieldQ[encodingProperty] = { enum: fnEnumIndex[encodingProperty] };\n }\n else {\n fieldQ[encodingProperty] = fnEnumIndex[encodingProperty];\n }\n }\n return __assign({}, fieldQ, rawFieldDef(splitWithTail(fieldDefShorthand.substring(closingBraceIndex + 2, fieldDefShorthand.length - 1), ',', 2)));\n }\n else {\n var func_1 = fieldDefShorthand.substring(0, fieldDefShorthand.indexOf('('));\n var insideFn = fieldDefShorthand.substring(func_1.length + 1, fieldDefShorthand.length - 1);\n var insideFnParts = splitWithTail(insideFn, ',', 2);\n if (aggregate_1.isAggregateOp(func_1)) {\n return __assign({ aggregate: func_1 }, rawFieldDef(insideFnParts));\n }\n else if (timeunit_1.isTimeUnit(func_1)) {\n return __assign({ timeUnit: func_1 }, rawFieldDef(insideFnParts));\n }\n else if (func_1 === 'bin') {\n return __assign({ bin: {} }, rawFieldDef(insideFnParts));\n }\n }\n }\n shorthandParser.fn = fn;\n})(shorthandParser = exports.shorthandParser || (exports.shorthandParser = {}));\n\n\n/***/ }),\n/* 100 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/core-js/library/modules/_object-pie.js ***!\n \\**************************************************/\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n/***/ }),\n/* 101 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/core-js/library/modules/_to-object.js ***!\n \\*************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(/*! ./_defined */ 129);\nmodule.exports = function(it){\n return Object(defined(it));\n};\n\n/***/ }),\n/* 102 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/core-js/library/modules/_uid.js ***!\n \\*******************************************/\n/***/ (function(module, exports) {\n\nvar id = 0\n , px = Math.random();\nmodule.exports = function(key){\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n/***/ }),\n/* 103 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************!*\\\n !*** ./~/fbjs/lib/invariant.js ***!\n \\*********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (undefined !== 'production') {\n validateFormat = function validateFormat(format) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n validateFormat(format);\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n\nmodule.exports = invariant;\n\n/***/ }),\n/* 104 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************!*\\\n !*** ./~/react-onclickoutside/index.js ***!\n \\*****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * A higher-order-component for handling onClickOutside for React components.\n */\n(function(root) {\n\n // administrative\n var registeredComponents = [];\n var handlers = [];\n var IGNORE_CLASS = 'ignore-react-onclickoutside';\n var DEFAULT_EVENTS = ['mousedown', 'touchstart'];\n\n /**\n * Check whether some DOM node is our Component's node.\n */\n var isNodeFound = function(current, componentNode, ignoreClass) {\n if (current === componentNode) {\n return true;\n }\n // SVG elements do not technically reside in the rendered DOM, so\n // they do not have classList directly, but they offer a link to their\n // corresponding element, which can have classList. This extra check is for\n // that case.\n // See: http://www.w3.org/TR/SVG11/struct.html#InterfaceSVGUseElement\n // Discussion: https://github.com/Pomax/react-onclickoutside/pull/17\n if (current.correspondingElement) {\n return current.correspondingElement.classList.contains(ignoreClass);\n }\n return current.classList.contains(ignoreClass);\n };\n\n /**\n * Try to find our node in a hierarchy of nodes, returning the document\n * node as highest noode if our node is not found in the path up.\n */\n var findHighest = function(current, componentNode, ignoreClass) {\n if (current === componentNode) {\n return true;\n }\n\n // If source=local then this event came from 'somewhere'\n // inside and should be ignored. We could handle this with\n // a layered approach, too, but that requires going back to\n // thinking in terms of Dom node nesting, running counter\n // to React's 'you shouldn't care about the DOM' philosophy.\n while(current.parentNode) {\n if (isNodeFound(current, componentNode, ignoreClass)) {\n return true;\n }\n current = current.parentNode;\n }\n return current;\n };\n\n /**\n * Check if the browser scrollbar was clicked\n */\n var clickedScrollbar = function(evt) {\n return document.documentElement.clientWidth <= evt.clientX || document.documentElement.clientHeight <= evt.clientY;\n };\n\n /**\n * Generate the event handler that checks whether a clicked DOM node\n * is inside of, or lives outside of, our Component's node tree.\n */\n var generateOutsideCheck = function(componentNode, componentInstance, eventHandler, ignoreClass, excludeScrollbar, preventDefault, stopPropagation) {\n return function(evt) {\n if (preventDefault) {\n evt.preventDefault();\n }\n if (stopPropagation) {\n evt.stopPropagation();\n }\n var current = evt.target;\n if((excludeScrollbar && clickedScrollbar(evt)) || (findHighest(current, componentNode, ignoreClass) !== document)) {\n return;\n }\n eventHandler(evt);\n };\n };\n\n /**\n * This function generates the HOC function that you'll use\n * in order to impart onOutsideClick listening to an\n * arbitrary component. It gets called at the end of the\n * bootstrapping code to yield an instance of the\n * onClickOutsideHOC function defined inside setupHOC().\n */\n function setupHOC(root, React, ReactDOM, createReactClass) {\n\n // The actual Component-wrapping HOC:\n return function onClickOutsideHOC(Component, config) {\n var wrapComponentWithOnClickOutsideHandling = createReactClass({\n statics: {\n /**\n * Access the wrapped Component's class.\n */\n getClass: function() {\n if (Component.getClass) {\n return Component.getClass();\n }\n return Component;\n }\n },\n\n /**\n * Access the wrapped Component's instance.\n */\n getInstance: function() {\n return Component.prototype.isReactComponent ? this.refs.instance : this;\n },\n\n // this is given meaning in componentDidMount\n __outsideClickHandler: function() {},\n\n getDefaultProps: function() {\n return {\n excludeScrollbar: config && config.excludeScrollbar\n };\n },\n\n /**\n * Add click listeners to the current document,\n * linked to this component's state.\n */\n componentDidMount: function() {\n // If we are in an environment without a DOM such\n // as shallow rendering or snapshots then we exit\n // early to prevent any unhandled errors being thrown.\n if (typeof document === 'undefined' || !document.createElement){\n return;\n }\n\n var instance = this.getInstance();\n var clickOutsideHandler;\n\n if(config && typeof config.handleClickOutside === 'function') {\n clickOutsideHandler = config.handleClickOutside(instance);\n if(typeof clickOutsideHandler !== 'function') {\n throw new Error('Component lacks a function for processing outside click events specified by the handleClickOutside config option.');\n }\n } else if(typeof instance.handleClickOutside === 'function') {\n if (React.Component.prototype.isPrototypeOf(instance)) {\n clickOutsideHandler = instance.handleClickOutside.bind(instance);\n } else {\n clickOutsideHandler = instance.handleClickOutside;\n }\n } else if(typeof instance.props.handleClickOutside === 'function') {\n clickOutsideHandler = instance.props.handleClickOutside;\n } else {\n throw new Error('Component lacks a handleClickOutside(event) function for processing outside click events.');\n }\n\n var componentNode = ReactDOM.findDOMNode(instance);\n if (componentNode === null) {\n console.warn('Antipattern warning: there was no DOM node associated with the component that is being wrapped by outsideClick.');\n console.warn([\n 'This is typically caused by having a component that starts life with a render function that',\n 'returns `null` (due to a state or props value), so that the component \\'exist\\' in the React',\n 'chain of components, but not in the DOM.\\n\\nInstead, you need to refactor your code so that the',\n 'decision of whether or not to show your component is handled by the parent, in their render()',\n 'function.\\n\\nIn code, rather than:\\n\\n A{render(){return check? <.../> : null;}\\n B{render(){
}\\n\\nmake sure that you',\n 'use:\\n\\n A{render(){return <.../>}\\n B{render(){return <...>{ check ? : null }<...>}}\\n\\nThat is:',\n 'the parent is always responsible for deciding whether or not to render any of its children.',\n 'It is not the child\\'s responsibility to decide whether a render instruction from above should',\n 'get ignored or not by returning `null`.\\n\\nWhen any component gets its render() function called,',\n 'that is the signal that it should be rendering its part of the UI. It may in turn decide not to',\n 'render all of *its* children, but it should never return `null` for itself. It is not responsible',\n 'for that decision.'\n ].join(' '));\n }\n\n var fn = this.__outsideClickHandler = generateOutsideCheck(\n componentNode,\n instance,\n clickOutsideHandler,\n this.props.outsideClickIgnoreClass || IGNORE_CLASS,\n this.props.excludeScrollbar, // fallback not needed, prop always exists because of getDefaultProps\n this.props.preventDefault || false,\n this.props.stopPropagation || false\n );\n\n var pos = registeredComponents.length;\n registeredComponents.push(this);\n handlers[pos] = fn;\n\n // If there is a truthy disableOnClickOutside property for this\n // component, don't immediately start listening for outside events.\n if (!this.props.disableOnClickOutside) {\n this.enableOnClickOutside();\n }\n },\n\n /**\n * Track for disableOnClickOutside props changes and enable/disable click outside\n */\n componentWillReceiveProps: function(nextProps) {\n if (this.props.disableOnClickOutside && !nextProps.disableOnClickOutside) {\n this.enableOnClickOutside();\n } else if (!this.props.disableOnClickOutside && nextProps.disableOnClickOutside) {\n this.disableOnClickOutside();\n }\n },\n\n /**\n * Remove the document's event listeners\n */\n componentWillUnmount: function() {\n this.disableOnClickOutside();\n this.__outsideClickHandler = false;\n var pos = registeredComponents.indexOf(this);\n if( pos>-1) {\n // clean up so we don't leak memory\n if (handlers[pos]) { handlers.splice(pos, 1); }\n registeredComponents.splice(pos, 1);\n }\n },\n\n /**\n * Can be called to explicitly enable event listening\n * for clicks and touches outside of this element.\n */\n enableOnClickOutside: function() {\n var fn = this.__outsideClickHandler;\n if (typeof document !== 'undefined') {\n var events = this.props.eventTypes || DEFAULT_EVENTS;\n if (!events.forEach) {\n events = [events];\n }\n events.forEach(function (eventName) {\n document.addEventListener(eventName, fn);\n });\n }\n },\n\n /**\n * Can be called to explicitly disable event listening\n * for clicks and touches outside of this element.\n */\n disableOnClickOutside: function() {\n var fn = this.__outsideClickHandler;\n if (typeof document !== 'undefined') {\n var events = this.props.eventTypes || DEFAULT_EVENTS;\n if (!events.forEach) {\n events = [events];\n }\n events.forEach(function (eventName) {\n document.removeEventListener(eventName, fn);\n });\n }\n },\n\n /**\n * Pass-through render\n */\n render: function() {\n var passedProps = this.props;\n var props = {};\n Object.keys(this.props).forEach(function(key) {\n if (key !== 'excludeScrollbar') {\n props[key] = passedProps[key];\n }\n });\n if (Component.prototype.isReactComponent) {\n props.ref = 'instance';\n }\n props.disableOnClickOutside = this.disableOnClickOutside;\n props.enableOnClickOutside = this.enableOnClickOutside;\n return React.createElement(Component, props);\n }\n });\n\n // Add display name for React devtools\n (function bindWrappedComponentName(c, wrapper) {\n var componentName = c.displayName || c.name || 'Component';\n wrapper.displayName = 'OnClickOutside(' + componentName + ')';\n }(Component, wrapComponentWithOnClickOutsideHandling));\n\n return wrapComponentWithOnClickOutsideHandling;\n };\n }\n\n /**\n * This function sets up the library in ways that\n * work with the various modulde loading solutions\n * used in JavaScript land today.\n */\n function setupBinding(root, factory) {\n if (true) {\n // AMD. Register as an anonymous module.\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! react */ 0),__webpack_require__(/*! react-dom */ 24),__webpack_require__(/*! create-react-class */ 53)], __WEBPACK_AMD_DEFINE_RESULT__ = function(React, ReactDom, createReactClass) {\n if (!createReactClass) createReactClass = React.createClass;\n return factory(root, React, ReactDom, createReactClass);\n }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof exports === 'object') {\n // Node. Note that this does not work with strict\n // CommonJS, but only CommonJS-like environments\n // that support module.exports\n module.exports = factory(root, require('react'), require('react-dom'), require('create-react-class'));\n } else {\n // Browser globals (root is window)\n var createReactClass = React.createClass ? React.createClass : window.createReactClass;\n root.onClickOutside = factory(root, React, ReactDOM, createReactClass);\n }\n }\n\n // Make it all happen\n setupBinding(root, setupHOC);\n\n}(this));\n\n\n/***/ }),\n/* 105 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************************!*\\\n !*** ./~/react-tabs/lib/components/TabList.js ***!\n \\************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _propTypes = __webpack_require__(/*! prop-types */ 1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _react = __webpack_require__(/*! react */ 0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = __webpack_require__(/*! classnames */ 47);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar TabList = function (_Component) {\n _inherits(TabList, _Component);\n\n function TabList() {\n _classCallCheck(this, TabList);\n\n return _possibleConstructorReturn(this, _Component.apply(this, arguments));\n }\n\n TabList.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n className = _props.className,\n attributes = _objectWithoutProperties(_props, ['children', 'className']);\n\n return _react2.default.createElement(\n 'ul',\n _extends({}, attributes, { className: (0, _classnames2.default)(className), role: 'tablist' }),\n children\n );\n };\n\n return TabList;\n}(_react.Component);\n\nTabList.defaultProps = {\n className: 'react-tabs__tab-list'\n};\nexports.default = TabList;\nTabList.propTypes = undefined !== \"production\" ? {\n children: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.array]),\n className: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.array, _propTypes2.default.object])\n} : {};\n\n/***/ }),\n/* 106 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/scale/domain.js ***!\n \\*******************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar vega_util_1 = __webpack_require__(/*! vega-util */ 35);\nvar aggregate_1 = __webpack_require__(/*! ../../aggregate */ 62);\nvar bin_1 = __webpack_require__(/*! ../../bin */ 155);\nvar channel_1 = __webpack_require__(/*! ../../channel */ 3);\nvar data_1 = __webpack_require__(/*! ../../data */ 55);\nvar datetime_1 = __webpack_require__(/*! ../../datetime */ 108);\nvar log = __webpack_require__(/*! ../../log */ 7);\nvar scale_1 = __webpack_require__(/*! ../../scale */ 5);\nvar sort_1 = __webpack_require__(/*! ../../sort */ 239);\nvar util = __webpack_require__(/*! ../../util */ 2);\nvar vega_schema_1 = __webpack_require__(/*! ../../vega.schema */ 45);\nvar vega_schema_2 = __webpack_require__(/*! ../../vega.schema */ 45);\nvar common_1 = __webpack_require__(/*! ../common */ 26);\nvar optimize_1 = __webpack_require__(/*! ../data/optimize */ 597);\nvar model_1 = __webpack_require__(/*! ../model */ 33);\nvar selection_1 = __webpack_require__(/*! ../selection/selection */ 22);\nfunction parseScaleDomain(model) {\n if (model_1.isUnitModel(model)) {\n parseUnitScaleDomain(model);\n }\n else {\n parseNonUnitScaleDomain(model);\n }\n}\nexports.parseScaleDomain = parseScaleDomain;\nfunction parseUnitScaleDomain(model) {\n var scales = model.specifiedScales;\n var localScaleComponents = model.component.scales;\n util.keys(localScaleComponents).forEach(function (channel) {\n var specifiedScale = scales[channel];\n var specifiedDomain = specifiedScale ? specifiedScale.domain : undefined;\n var domains = parseDomainForChannel(model, channel);\n var localScaleCmpt = localScaleComponents[channel];\n localScaleCmpt.domains = domains;\n if (scale_1.isSelectionDomain(specifiedDomain)) {\n // As scale parsing occurs before selection parsing, we use a temporary\n // signal here and append the scale.domain definition. This is replaced\n // with the correct domainRaw signal during scale assembly.\n // For more information, see isRawSelectionDomain in selection.ts.\n // FIXME: replace this with a special property in the scaleComponent\n localScaleCmpt.set('domainRaw', {\n signal: selection_1.SELECTION_DOMAIN + JSON.stringify(specifiedDomain)\n }, true);\n }\n });\n}\nfunction parseNonUnitScaleDomain(model) {\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n parseScaleDomain(child);\n }\n var localScaleComponents = model.component.scales;\n util.keys(localScaleComponents).forEach(function (channel) {\n // FIXME: Arvind -- Please revise logic for merging selectionDomain / domainRaw\n var domains;\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n var childComponent = child.component.scales[channel];\n if (childComponent) {\n if (domains === undefined) {\n domains = childComponent.domains;\n }\n else {\n domains = domains.concat(childComponent.domains);\n }\n }\n }\n if (model_1.isFacetModel(model)) {\n domains.forEach(function (domain) {\n // Replace the scale domain with data output from a cloned subtree after the facet.\n if (vega_schema_1.isDataRefDomain(domain)) {\n // use data from cloned subtree (which is the same as data but with a prefix added once)\n domain.data = optimize_1.FACET_SCALE_PREFIX + domain.data.replace(optimize_1.FACET_SCALE_PREFIX, '');\n }\n });\n }\n localScaleComponents[channel].domains = domains;\n });\n}\n/**\n * Remove unaggregated domain if it is not applicable\n * Add unaggregated domain if domain is not specified and config.scale.useUnaggregatedDomain is true.\n */\nfunction normalizeUnaggregatedDomain(domain, fieldDef, scaleType, scaleConfig) {\n if (domain === 'unaggregated') {\n var _a = canUseUnaggregatedDomain(fieldDef, scaleType), valid = _a.valid, reason = _a.reason;\n if (!valid) {\n log.warn(reason);\n return undefined;\n }\n }\n else if (domain === undefined && scaleConfig.useUnaggregatedDomain) {\n // Apply config if domain is not specified.\n var valid = canUseUnaggregatedDomain(fieldDef, scaleType).valid;\n if (valid) {\n return 'unaggregated';\n }\n }\n return domain;\n}\nfunction parseDomainForChannel(model, channel) {\n var scaleType = model.getScaleComponent(channel).get('type');\n var domain = normalizeUnaggregatedDomain(model.scaleDomain(channel), model.fieldDef(channel), scaleType, model.config.scale);\n if (domain !== model.scaleDomain(channel)) {\n model.specifiedScales[channel] = tslib_1.__assign({}, model.specifiedScales[channel], { domain: domain });\n }\n // If channel is either X or Y then union them with X2 & Y2 if they exist\n if (channel === 'x' && model.channelHasField('x2')) {\n if (model.channelHasField('x')) {\n return parseSingleChannelDomain(scaleType, domain, model, 'x').concat(parseSingleChannelDomain(scaleType, domain, model, 'x2'));\n }\n else {\n return parseSingleChannelDomain(scaleType, domain, model, 'x2');\n }\n }\n else if (channel === 'y' && model.channelHasField('y2')) {\n if (model.channelHasField('y')) {\n return parseSingleChannelDomain(scaleType, domain, model, 'y').concat(parseSingleChannelDomain(scaleType, domain, model, 'y2'));\n }\n else {\n return parseSingleChannelDomain(scaleType, domain, model, 'y2');\n }\n }\n return parseSingleChannelDomain(scaleType, domain, model, channel);\n}\nexports.parseDomainForChannel = parseDomainForChannel;\nfunction parseSingleChannelDomain(scaleType, domain, model, channel) {\n var fieldDef = model.fieldDef(channel);\n if (domain && domain !== 'unaggregated' && !scale_1.isSelectionDomain(domain)) {\n if (fieldDef.bin) {\n log.warn(log.message.conflictedDomain(channel));\n }\n else {\n if (datetime_1.isDateTime(domain[0])) {\n return domain.map(function (dt) {\n return { signal: \"{data: \" + datetime_1.dateTimeExpr(dt, true) + \"}\" };\n });\n }\n return [domain];\n }\n }\n var stack = model.stack;\n if (stack && channel === stack.fieldChannel) {\n if (stack.offset === 'normalize') {\n return [[0, 1]];\n }\n var data = model.requestDataName(data_1.MAIN);\n return [{\n data: data,\n field: model.field(channel, { suffix: 'start' })\n }, {\n data: data,\n field: model.field(channel, { suffix: 'end' })\n }];\n }\n var sort = channel_1.isScaleChannel(channel) ? domainSort(model, channel, scaleType) : undefined;\n if (domain === 'unaggregated') {\n var data = model.requestDataName(data_1.MAIN);\n return [{\n data: data,\n field: model.field(channel, { aggregate: 'min' })\n }, {\n data: data,\n field: model.field(channel, { aggregate: 'max' })\n }];\n }\n else if (fieldDef.bin) {\n if (scale_1.isBinScale(scaleType)) {\n var signal = model.getName(bin_1.binToString(fieldDef.bin) + \"_\" + fieldDef.field + \"_bins\");\n return [{ signal: \"sequence(\" + signal + \".start, \" + signal + \".stop + \" + signal + \".step, \" + signal + \".step)\" }];\n }\n if (scale_1.hasDiscreteDomain(scaleType)) {\n // ordinal bin scale takes domain from bin_range, ordered by bin start\n // This is useful for both axis-based scale (x/y) and legend-based scale (other channels).\n return [{\n // If sort by aggregation of a specified sort field, we need to use RAW table,\n // so we can aggregate values for the scale independently from the main aggregation.\n data: util.isBoolean(sort) ? model.requestDataName(data_1.MAIN) : model.requestDataName(data_1.RAW),\n // Use range if we added it and the scale does not support computing a range as a signal.\n field: model.field(channel, common_1.binRequiresRange(fieldDef, channel) ? { binSuffix: 'range' } : {}),\n // we have to use a sort object if sort = true to make the sort correct by bin start\n sort: sort === true || !sort_1.isSortField(sort) ? {\n field: model.field(channel, {}),\n op: 'min' // min or max doesn't matter since we sort by the start of the bin range\n } : sort\n }];\n }\n else {\n if (channel === 'x' || channel === 'y') {\n // X/Y position have to include start and end for non-ordinal scale\n var data = model.requestDataName(data_1.MAIN);\n return [{\n data: data,\n field: model.field(channel, {})\n }, {\n data: data,\n field: model.field(channel, { binSuffix: 'end' })\n }];\n }\n else {\n // TODO: use bin_mid\n return [{\n data: model.requestDataName(data_1.MAIN),\n field: model.field(channel, {})\n }];\n }\n }\n }\n else if (sort) {\n return [{\n // If sort by aggregation of a specified sort field, we need to use RAW table,\n // so we can aggregate values for the scale independently from the main aggregation.\n data: util.isBoolean(sort) ? model.requestDataName(data_1.MAIN) : model.requestDataName(data_1.RAW),\n field: model.field(channel),\n sort: sort\n }];\n }\n else {\n return [{\n data: model.requestDataName(data_1.MAIN),\n field: model.field(channel)\n }];\n }\n}\nfunction domainSort(model, channel, scaleType) {\n if (!scale_1.hasDiscreteDomain(scaleType)) {\n return undefined;\n }\n var sort = model.sort(channel);\n // Sorted based on an aggregate calculation over a specified sort field (only for ordinal scale)\n if (sort_1.isSortField(sort)) {\n return sort;\n }\n if (sort === 'descending') {\n return {\n op: 'min',\n field: model.field(channel),\n order: 'descending'\n };\n }\n if (util.contains(['ascending', undefined /* default =ascending*/], sort)) {\n return true;\n }\n // sort === 'none'\n return undefined;\n}\nexports.domainSort = domainSort;\n/**\n * Determine if a scale can use unaggregated domain.\n * @return {Boolean} Returns true if all of the following conditons applies:\n * 1. `scale.domain` is `unaggregated`\n * 2. Aggregation function is not `count` or `sum`\n * 3. The scale is quantitative or time scale.\n */\nfunction canUseUnaggregatedDomain(fieldDef, scaleType) {\n if (!fieldDef.aggregate) {\n return {\n valid: false,\n reason: log.message.unaggregateDomainHasNoEffectForRawField(fieldDef)\n };\n }\n if (!aggregate_1.SHARED_DOMAIN_OP_INDEX[fieldDef.aggregate]) {\n return {\n valid: false,\n reason: log.message.unaggregateDomainWithNonSharedDomainOp(fieldDef.aggregate)\n };\n }\n if (fieldDef.type === 'quantitative') {\n if (scaleType === 'log') {\n return {\n valid: false,\n reason: log.message.unaggregatedDomainWithLogScale(fieldDef)\n };\n }\n }\n return { valid: true };\n}\nexports.canUseUnaggregatedDomain = canUseUnaggregatedDomain;\n/**\n * Converts an array of domains to a single Vega scale domain.\n */\nfunction mergeDomains(domains) {\n var uniqueDomains = util.unique(domains.map(function (domain) {\n // ignore sort property when computing the unique domains\n if (vega_schema_1.isDataRefDomain(domain)) {\n var _s = domain.sort, domainWithoutSort = tslib_1.__rest(domain, [\"sort\"]);\n return domainWithoutSort;\n }\n return domain;\n }), util.hash);\n var sorts = util.unique(domains.map(function (d) {\n if (vega_schema_1.isDataRefDomain(d)) {\n var s = d.sort;\n if (s !== undefined && !util.isBoolean(s)) {\n if (s.op === 'count') {\n // let's make sure that if op is count, we don't use a field\n delete s.field;\n }\n if (s.order === 'ascending') {\n // drop order: ascending as it is the default\n delete s.order;\n }\n }\n return s;\n }\n return undefined;\n }).filter(function (s) { return s !== undefined; }), util.hash);\n if (uniqueDomains.length === 1) {\n var domain = domains[0];\n if (vega_schema_1.isDataRefDomain(domain) && sorts.length > 0) {\n var sort_2 = sorts[0];\n if (sorts.length > 1) {\n log.warn(log.message.MORE_THAN_ONE_SORT);\n sort_2 = true;\n }\n return tslib_1.__assign({}, domain, { sort: sort_2 });\n }\n return domain;\n }\n // only keep simple sort properties that work with unioned domains\n var onlySimpleSorts = sorts.filter(function (s) {\n if (util.isBoolean(s)) {\n return true;\n }\n if (s.op === 'count') {\n return true;\n }\n log.warn(log.message.domainSortDropped(s));\n return false;\n });\n var sort = true;\n if (onlySimpleSorts.length === 1) {\n sort = onlySimpleSorts[0];\n }\n else if (onlySimpleSorts.length > 1) {\n // ignore sort = false if we have another sort property\n var filteredSorts = onlySimpleSorts.filter(function (s) { return s !== false; });\n if (filteredSorts.length > 1) {\n log.warn(log.message.MORE_THAN_ONE_SORT);\n sort = true;\n }\n else {\n sort = filteredSorts[0];\n }\n }\n var allData = util.unique(domains.map(function (d) {\n if (vega_schema_1.isDataRefDomain(d)) {\n return d.data;\n }\n return null;\n }), function (x) { return x; });\n if (allData.length === 1 && allData[0] !== null) {\n // create a union domain of different fields with a single data source\n var domain = {\n data: allData[0],\n fields: uniqueDomains.map(function (d) { return d.field; }),\n sort: sort\n };\n return domain;\n }\n return { fields: uniqueDomains, sort: sort };\n}\nexports.mergeDomains = mergeDomains;\n/**\n * Return a field if a scale single field.\n * Return `undefined` otherwise.\n *\n */\nfunction getFieldFromDomain(domain) {\n if (vega_schema_1.isDataRefDomain(domain) && vega_util_1.isString(domain.field)) {\n return domain.field;\n }\n else if (vega_schema_2.isDataRefUnionedDomain(domain)) {\n var field = void 0;\n for (var _i = 0, _a = domain.fields; _i < _a.length; _i++) {\n var nonUnionDomain = _a[_i];\n if (vega_schema_1.isDataRefDomain(nonUnionDomain) && vega_util_1.isString(nonUnionDomain.field)) {\n if (!field) {\n field = nonUnionDomain.field;\n }\n else if (field !== nonUnionDomain.field) {\n log.warn('Detected faceted independent scales that union domain of multiple fields from different data sources. We will use the first field. The result view size may be incorrect.');\n return field;\n }\n }\n }\n log.warn('Detected faceted independent scales that union domain of identical fields from different source detected. We will assume that this is the same field from a different fork of the same data source. However, if this is not case, the result view size maybe incorrect.');\n return field;\n }\n else if (vega_schema_2.isFieldRefUnionDomain(domain) && vega_util_1.isString) {\n log.warn('Detected faceted independent scales that union domain of multiple fields from the same data source. We will use the first field. The result view size may be incorrect.');\n var field = domain.fields[0];\n return vega_util_1.isString(field) ? field : undefined;\n }\n return undefined;\n}\nexports.getFieldFromDomain = getFieldFromDomain;\nfunction assembleDomain(model, channel) {\n var scaleComponent = model.component.scales[channel];\n var domains = scaleComponent.domains.map(function (domain) {\n // Correct references to data as the original domain's data was determined\n // in parseScale, which happens before parseData. Thus the original data\n // reference can be incorrect.\n if (vega_schema_1.isDataRefDomain(domain)) {\n domain.data = model.lookupDataSource(domain.data);\n }\n return domain;\n });\n // domains is an array that has to be merged into a single vega domain\n return mergeDomains(domains);\n}\nexports.assembleDomain = assembleDomain;\n\n\n/***/ }),\n/* 107 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/selection/transforms/scales.js ***!\n \\**********************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar log_1 = __webpack_require__(/*! ../../../log */ 7);\nvar scale_1 = __webpack_require__(/*! ../../../scale */ 5);\nvar util_1 = __webpack_require__(/*! ../../../util */ 2);\nvar selection_1 = __webpack_require__(/*! ../selection */ 22);\nvar scaleBindings = {\n has: function (selCmpt) {\n return selCmpt.type === 'interval' && selCmpt.resolve === 'global' &&\n selCmpt.bind && selCmpt.bind === 'scales';\n },\n parse: function (model, selDef, selCmpt) {\n var bound = selCmpt.scales = [];\n selCmpt.project.forEach(function (p) {\n var channel = p.channel;\n var scale = model.getScaleComponent(channel);\n var scaleType = scale ? scale.get('type') : undefined;\n if (!scale || !scale_1.hasContinuousDomain(scaleType) || scale_1.isBinScale(scaleType)) {\n log_1.warn('Scale bindings are currently only supported for scales with unbinned, continuous domains.');\n return;\n }\n scale.set('domainRaw', { signal: selection_1.channelSignalName(selCmpt, channel, 'data') }, true);\n bound.push(channel);\n });\n },\n topLevelSignals: function (model, selCmpt, signals) {\n // Top-level signals are only needed when coordinating composed views.\n if (!model.parent) {\n return signals;\n }\n var channels = selCmpt.scales.filter(function (channel) {\n return !(signals.filter(function (s) { return s.name === selection_1.channelSignalName(selCmpt, channel, 'data'); }).length);\n });\n return signals.concat(channels.map(function (channel) {\n return { name: selection_1.channelSignalName(selCmpt, channel, 'data') };\n }));\n },\n signals: function (model, selCmpt, signals) {\n // Nested signals need only push to top-level signals when within composed views.\n if (model.parent) {\n selCmpt.scales.forEach(function (channel) {\n var signal = signals.filter(function (s) { return s.name === selection_1.channelSignalName(selCmpt, channel, 'data'); })[0];\n signal.push = 'outer';\n delete signal.value;\n delete signal.update;\n });\n }\n return signals;\n }\n};\nexports.default = scaleBindings;\nfunction domain(model, channel) {\n var scale = util_1.stringValue(model.scaleName(channel));\n return \"domain(\" + scale + \")\";\n}\nexports.domain = domain;\n\n\n/***/ }),\n/* 108 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/vega-lite/build/src/datetime.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// DateTime definition object\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar log = __webpack_require__(/*! ./log */ 7);\nvar util_1 = __webpack_require__(/*! ./util */ 2);\n/*\n * A designated year that starts on Sunday.\n */\nvar SUNDAY_YEAR = 2006;\nfunction isDateTime(o) {\n return !!o && (!!o.year || !!o.quarter || !!o.month || !!o.date || !!o.day ||\n !!o.hours || !!o.minutes || !!o.seconds || !!o.milliseconds);\n}\nexports.isDateTime = isDateTime;\nexports.MONTHS = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];\nexports.SHORT_MONTHS = exports.MONTHS.map(function (m) { return m.substr(0, 3); });\nexports.DAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\nexports.SHORT_DAYS = exports.DAYS.map(function (d) { return d.substr(0, 3); });\nfunction normalizeQuarter(q) {\n if (util_1.isNumber(q)) {\n if (q > 4) {\n log.warn(log.message.invalidTimeUnit('quarter', q));\n }\n // We accept 1-based quarter, so need to readjust to 0-based quarter\n return (q - 1) + '';\n }\n else {\n // Invalid quarter\n throw new Error(log.message.invalidTimeUnit('quarter', q));\n }\n}\nfunction normalizeMonth(m) {\n if (util_1.isNumber(m)) {\n // We accept 1-based month, so need to readjust to 0-based month\n return (m - 1) + '';\n }\n else {\n var lowerM = m.toLowerCase();\n var monthIndex = exports.MONTHS.indexOf(lowerM);\n if (monthIndex !== -1) {\n return monthIndex + ''; // 0 for january, ...\n }\n var shortM = lowerM.substr(0, 3);\n var shortMonthIndex = exports.SHORT_MONTHS.indexOf(shortM);\n if (shortMonthIndex !== -1) {\n return shortMonthIndex + '';\n }\n // Invalid month\n throw new Error(log.message.invalidTimeUnit('month', m));\n }\n}\nfunction normalizeDay(d) {\n if (util_1.isNumber(d)) {\n // mod so that this can be both 0-based where 0 = sunday\n // and 1-based where 7=sunday\n return (d % 7) + '';\n }\n else {\n var lowerD = d.toLowerCase();\n var dayIndex = exports.DAYS.indexOf(lowerD);\n if (dayIndex !== -1) {\n return dayIndex + ''; // 0 for january, ...\n }\n var shortD = lowerD.substr(0, 3);\n var shortDayIndex = exports.SHORT_DAYS.indexOf(shortD);\n if (shortDayIndex !== -1) {\n return shortDayIndex + '';\n }\n // Invalid day\n throw new Error(log.message.invalidTimeUnit('day', d));\n }\n}\n/**\n * Return Vega Expression for a particular date time.\n * @param d\n * @param normalize whether to normalize quarter, month, day.\n */\nfunction dateTimeExpr(d, normalize) {\n if (normalize === void 0) { normalize = false; }\n var units = [];\n if (normalize && d.day !== undefined) {\n if (util_1.keys(d).length > 1) {\n log.warn(log.message.droppedDay(d));\n d = util_1.duplicate(d);\n delete d.day;\n }\n }\n if (d.year !== undefined) {\n units.push(d.year);\n }\n else if (d.day !== undefined) {\n // Set year to 2006 for working with day since January 1 2006 is a Sunday\n units.push(SUNDAY_YEAR);\n }\n else {\n units.push(0);\n }\n if (d.month !== undefined) {\n var month = normalize ? normalizeMonth(d.month) : d.month;\n units.push(month);\n }\n else if (d.quarter !== undefined) {\n var quarter = normalize ? normalizeQuarter(d.quarter) : d.quarter;\n units.push(quarter + '*3');\n }\n else {\n units.push(0); // months start at zero in JS\n }\n if (d.date !== undefined) {\n units.push(d.date);\n }\n else if (d.day !== undefined) {\n // HACK: Day only works as a standalone unit\n // This is only correct because we always set year to 2006 for day\n var day = normalize ? normalizeDay(d.day) : d.day;\n units.push(day + '+1');\n }\n else {\n units.push(1); // Date starts at 1 in JS\n }\n // Note: can't use TimeUnit enum here as importing it will create\n // circular dependency problem!\n for (var _i = 0, _a = ['hours', 'minutes', 'seconds', 'milliseconds']; _i < _a.length; _i++) {\n var timeUnit = _a[_i];\n if (d[timeUnit] !== undefined) {\n units.push(d[timeUnit]);\n }\n else {\n units.push(0);\n }\n }\n if (d.utc) {\n return \"utc(\" + units.join(', ') + \")\";\n }\n else {\n return \"datetime(\" + units.join(', ') + \")\";\n }\n}\nexports.dateTimeExpr = dateTimeExpr;\n\n\n/***/ }),\n/* 109 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************!*\\\n !*** ./~/vega-lite/build/src/filter.js ***!\n \\*****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar selection_1 = __webpack_require__(/*! ./compile/selection/selection */ 22);\nvar datetime_1 = __webpack_require__(/*! ./datetime */ 108);\nvar fielddef_1 = __webpack_require__(/*! ./fielddef */ 9);\nvar timeunit_1 = __webpack_require__(/*! ./timeunit */ 23);\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nfunction isSelectionFilter(filter) {\n return filter && filter['selection'];\n}\nexports.isSelectionFilter = isSelectionFilter;\nfunction isEqualFilter(filter) {\n return filter && !!filter.field && filter.equal !== undefined;\n}\nexports.isEqualFilter = isEqualFilter;\nfunction isRangeFilter(filter) {\n if (filter && filter.field) {\n if (util_1.isArray(filter.range) && filter.range.length === 2) {\n return true;\n }\n }\n return false;\n}\nexports.isRangeFilter = isRangeFilter;\nfunction isOneOfFilter(filter) {\n return filter && !!filter.field && (util_1.isArray(filter.oneOf) ||\n util_1.isArray(filter.in) // backward compatibility\n );\n}\nexports.isOneOfFilter = isOneOfFilter;\nfunction isFieldFilter(filter) {\n return isOneOfFilter(filter) || isEqualFilter(filter) || isRangeFilter(filter);\n}\nexports.isFieldFilter = isFieldFilter;\n/**\n * Converts a filter into an expression.\n */\n// model is only used for selection filters.\nfunction expression(model, filterOp, node) {\n return util_1.logicalExpr(filterOp, function (filter) {\n if (util_1.isString(filter)) {\n return filter;\n }\n else if (isSelectionFilter(filter)) {\n return selection_1.predicate(model, filter.selection, node);\n }\n else {\n return fieldFilterExpression(filter);\n }\n });\n}\nexports.expression = expression;\n// This method is used by Voyager. Do not change its behavior without changing Voyager.\nfunction fieldFilterExpression(filter, useInRange) {\n if (useInRange === void 0) { useInRange = true; }\n var fieldExpr = filter.timeUnit ?\n // For timeUnit, cast into integer with time() so we can use ===, inrange, indexOf to compare values directly.\n // TODO: We calculate timeUnit on the fly here. Consider if we would like to consolidate this with timeUnit pipeline\n // TODO: support utc\n ('time(' + timeunit_1.fieldExpr(filter.timeUnit, filter.field) + ')') :\n fielddef_1.field(filter, { expr: 'datum' });\n if (isEqualFilter(filter)) {\n return fieldExpr + '===' + valueExpr(filter.equal, filter.timeUnit);\n }\n else if (isOneOfFilter(filter)) {\n // \"oneOf\" was formerly \"in\" -- so we need to add backward compatibility\n var oneOf = filter.oneOf || filter['in'];\n return 'indexof([' +\n oneOf.map(function (v) { return valueExpr(v, filter.timeUnit); }).join(',') +\n '], ' + fieldExpr + ') !== -1';\n }\n else if (isRangeFilter(filter)) {\n var lower = filter.range[0];\n var upper = filter.range[1];\n if (lower !== null && upper !== null && useInRange) {\n return 'inrange(' + fieldExpr + ', [' +\n valueExpr(lower, filter.timeUnit) + ', ' +\n valueExpr(upper, filter.timeUnit) + '])';\n }\n var exprs = [];\n if (lower !== null) {\n exprs.push(fieldExpr + \" >= \" + valueExpr(lower, filter.timeUnit));\n }\n if (upper !== null) {\n exprs.push(fieldExpr + \" <= \" + valueExpr(upper, filter.timeUnit));\n }\n return exprs.length > 0 ? exprs.join(' && ') : 'true';\n }\n /* istanbul ignore next: it should never reach here */\n throw new Error(\"Invalid field filter: \" + JSON.stringify(filter));\n}\nexports.fieldFilterExpression = fieldFilterExpression;\nfunction valueExpr(v, timeUnit) {\n if (datetime_1.isDateTime(v)) {\n var expr = datetime_1.dateTimeExpr(v, true);\n return 'time(' + expr + ')';\n }\n if (timeunit_1.isLocalSingleTimeUnit(timeUnit)) {\n var datetime = {};\n datetime[timeUnit] = v;\n var expr = datetime_1.dateTimeExpr(datetime, true);\n return 'time(' + expr + ')';\n }\n else if (timeunit_1.isUtcSingleTimeUnit(timeUnit)) {\n return valueExpr(v, timeunit_1.getLocalTimeUnit(timeUnit));\n }\n return JSON.stringify(v);\n}\nfunction normalizeFilter(f) {\n if (isFieldFilter(f) && f.timeUnit) {\n return tslib_1.__assign({}, f, { timeUnit: timeunit_1.normalizeTimeUnit(f.timeUnit) });\n }\n return f;\n}\nexports.normalizeFilter = normalizeFilter;\n\n\n/***/ }),\n/* 110 */\n/* exports provided: default */\n/* exports used: default */\n/*!********************************************************!*\\\n !*** ./~/vega-lite/~/vega-util/src/splitAccessPath.js ***!\n \\********************************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__error__ = __webpack_require__(/*! ./error */ 240);\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function(p) {\n var path = [],\n q = null,\n b = 0,\n n = p.length,\n s = '',\n i, j, c;\n\n p = p + '';\n\n function push() {\n path.push(s + p.substring(i, j));\n s = '';\n i = j + 1;\n }\n\n for (i=j=0; j i) {\n push();\n } else {\n i = j + 1;\n }\n } else if (c === '[') {\n if (j > i) push();\n b = i = j + 1;\n } else if (c === ']') {\n if (!b) __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__error__[\"a\" /* default */])('Access path missing open bracket: ' + p);\n if (b > 0) push();\n b = 0;\n i = j + 1;\n }\n }\n\n if (b) __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__error__[\"a\" /* default */])('Access path missing closing bracket: ' + p);\n if (q) __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__error__[\"a\" /* default */])('Access path missing closing quote: ' + p);\n\n if (j > i) {\n j++;\n push();\n }\n\n return path;\n});\n\n\n/***/ }),\n/* 111 */\n/* exports provided: default */\n/* exports used: default */\n/*!****************************************************!*\\\n !*** ./~/vega-lite/~/vega-util/src/stringValue.js ***!\n \\****************************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = $;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__isArray__ = __webpack_require__(/*! ./isArray */ 162);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__isObject__ = __webpack_require__(/*! ./isObject */ 244);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__isString__ = __webpack_require__(/*! ./isString */ 245);\n\n\n\n\nfunction $(x) {\n return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__isArray__[\"a\" /* default */])(x) ? '[' + x.map($) + ']'\n : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__isObject__[\"a\" /* default */])(x) || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__isString__[\"a\" /* default */])(x) ?\n // Output valid JSON and JS source strings.\n // See http://timelessrepo.com/json-isnt-a-javascript-subset\n JSON.stringify(x).replace('\\u2028','\\\\u2028').replace('\\u2029', '\\\\u2029')\n : x;\n}\n\n\n/***/ }),\n/* 112 */\n/* exports provided: default */\n/* exports used: default */\n/*!********************************************!*\\\n !*** ./~/vega-util/src/splitAccessPath.js ***!\n \\********************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__error__ = __webpack_require__(/*! ./error */ 247);\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function(p) {\n var path = [],\n q = null,\n b = 0,\n n = p.length,\n s = '',\n i, j, c;\n\n p = p + '';\n\n function push() {\n path.push(s + p.substring(i, j));\n s = '';\n i = j + 1;\n }\n\n for (i=j=0; j i) ? push() : (i = j + 1);\n else if (c === '[') {\n if (j > i) push();\n b = i = j + 1;\n }\n else if (c === ']') {\n if (!b) __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__error__[\"a\" /* default */])('Access path missing open bracket: ' + p);\n if (b > 0) push();\n b = 0;\n i = j + 1;\n }\n }\n\n if (b) __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__error__[\"a\" /* default */])('Access path missing closing bracket: ' + p);\n if (q) __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__error__[\"a\" /* default */])('Access path missing closing quote: ' + p);\n if (j > i) ++j, push();\n return path;\n});\n\n\n/***/ }),\n/* 113 */\n/* exports provided: default */\n/* exports used: default */\n/*!****************************************!*\\\n !*** ./~/vega-util/src/stringValue.js ***!\n \\****************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = $;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__isArray__ = __webpack_require__(/*! ./isArray */ 166);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__isObject__ = __webpack_require__(/*! ./isObject */ 252);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__isString__ = __webpack_require__(/*! ./isString */ 253);\n\n\n\n\nfunction $(x) {\n return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__isArray__[\"a\" /* default */])(x) ? '[' + x.map($) + ']'\n : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__isObject__[\"a\" /* default */])(x) || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__isString__[\"a\" /* default */])(x) ?\n // Output valid JSON and JS source strings.\n // See http://timelessrepo.com/json-isnt-a-javascript-subset\n JSON.stringify(x).replace('\\u2028','\\\\u2028').replace('\\u2029', '\\\\u2029')\n : x;\n}\n\n\n/***/ }),\n/* 114 */\n/* unknown exports provided */\n/* exports used: default */\n/*!******************************!*\\\n !*** ./~/warning/browser.js ***!\n \\******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = function() {};\n\nif (undefined !== 'production') {\n warning = function(condition, format, args) {\n var len = arguments.length;\n args = new Array(len > 2 ? len - 2 : 0);\n for (var key = 2; key < len; key++) {\n args[key - 2] = arguments[key];\n }\n if (format === undefined) {\n throw new Error(\n '`warning(condition, format, ...args)` requires a warning ' +\n 'message argument'\n );\n }\n\n if (format.length < 10 || (/^[s\\W]*$/).test(format)) {\n throw new Error(\n 'The warning format should be able to uniquely identify this ' +\n 'warning. Please, use a more descriptive format than: ' + format\n );\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' +\n format.replace(/%s/g, function() {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch(x) {}\n }\n };\n}\n\nmodule.exports = warning;\n\n\n/***/ }),\n/* 115 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************!*\\\n !*** ./src/actions/bookmark.ts ***!\n \\*********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BOOKMARK_ADD_PLOT = 'BOOKMARK_ADD_PLOT';\nexports.BOOKMARK_REMOVE_PLOT = 'BOOKMARK_REMOVE_PLOT';\nexports.BOOKMARK_MODIFY_NOTE = 'BOOKMARK_MODIFY_NOTE';\nexports.BOOKMARK_CLEAR_ALL = 'BOOKMARK_CLEAR_ALL';\n\n\n/***/ }),\n/* 116 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************!*\\\n !*** ./src/actions/related-views.ts ***!\n \\**************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RELATED_VIEWS_HIDE_TOGGLE = 'RELATED_VIEWS_HIDE_TOGGLE';\n\n\n/***/ }),\n/* 117 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************!*\\\n !*** ./src/actions/reset.ts ***!\n \\******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RESET = 'RESET';\n\n\n/***/ }),\n/* 118 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************!*\\\n !*** ./src/components/field/index.tsx ***!\n \\****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar wildcard_1 = __webpack_require__(/*! compassql/build/src/wildcard */ 6);\nvar React = __webpack_require__(/*! react */ 0);\nvar CSSModules = __webpack_require__(/*! react-css-modules */ 8);\nvar react_dnd_1 = __webpack_require__(/*! react-dnd */ 119);\nvar TetherComponent = __webpack_require__(/*! react-tether */ 94);\nvar constants_1 = __webpack_require__(/*! ../../constants */ 39);\nvar filter_1 = __webpack_require__(/*! ../../models/shelf/filter */ 46);\nvar styles = __webpack_require__(/*! ./field.scss */ 293);\n;\n;\nvar FieldBase = (function (_super) {\n __extends(FieldBase, _super);\n function FieldBase(props) {\n var _this = _super.call(this, props) || this;\n _this.fieldRefHandler = function (ref) {\n _this.field = ref;\n };\n _this.popupRefHandler = function (ref) {\n _this.popup = ref;\n };\n _this.state = ({\n popupIsOpened: false\n });\n // Bind - https://facebook.github.io/react/docs/handling-events.html\n _this.onFilterToggle = _this.onFilterToggle.bind(_this);\n _this.onAdd = _this.onAdd.bind(_this);\n _this.onDoubleClick = _this.onDoubleClick.bind(_this);\n _this.togglePopup = _this.togglePopup.bind(_this);\n return _this;\n }\n FieldBase.prototype.componentWillUpdate = function (nextProps, nextState) {\n if (!nextState) {\n return;\n }\n if (nextState.popupIsOpened) {\n document.addEventListener('click', this.handleClickOutside.bind(this), true);\n }\n else if (this.state.popupIsOpened) {\n document.removeEventListener('click', this.handleClickOutside.bind(this), true);\n }\n };\n FieldBase.prototype.render = function () {\n var _a = this.props, connectDragSource = _a.connectDragSource, fieldDef = _a.fieldDef, isPill = _a.isPill, popupComponent = _a.popupComponent;\n var fn = fieldDef.fn, field = fieldDef.field, description = fieldDef.description;\n var isWildcardField = wildcard_1.isWildcard(field) || this.props.isEnumeratedWildcardField;\n /** Whether the fieldDef has a function that involves field. (Count doesn't involve a specific field.) */\n var isFieldFn = fn && fn !== 'count';\n var fnName;\n if (wildcard_1.isWildcard(fn)) {\n fnName = (fn.enum.length > 1) ? '?' : fn.enum[0];\n }\n else {\n fnName = fn;\n }\n var component = (React.createElement(\"span\", { styleName: isWildcardField ? 'wildcard-field-pill' : isPill ? 'field-pill' : 'field', onDoubleClick: this.onDoubleClick },\n this.renderCaretTypeSpan(),\n this.renderFuncSpan(fnName),\n React.createElement(\"span\", { styleName: isFieldFn ? 'fn-text' : 'text' }, wildcard_1.isWildcard(field) ? description : field !== '*' ? field : ''),\n this.renderAddFilterSpan(),\n this.renderAddSpan(),\n this.renderRemoveSpan()));\n // Wrap with connect dragSource if it is injected\n if (!popupComponent) {\n return connectDragSource ? connectDragSource(component) : component;\n }\n else {\n return (React.createElement(\"div\", { ref: this.fieldRefHandler },\n React.createElement(TetherComponent, { attachment: \"top left\", targetAttachment: \"bottom left\" },\n connectDragSource ? connectDragSource(component) : component,\n React.createElement(\"div\", { ref: this.popupRefHandler }, this.state.popupIsOpened && popupComponent))));\n }\n };\n FieldBase.prototype.onFilterToggle = function () {\n var _a = this.props, filter = _a.filter, fieldDef = _a.fieldDef;\n filter.onToggle(fieldDef);\n };\n FieldBase.prototype.renderCaretTypeSpan = function () {\n var _a = this.props, caretShow = _a.caretShow, fieldDef = _a.fieldDef, popupComponent = _a.popupComponent;\n var type = fieldDef.type;\n var icon = TYPE_ICONS[type];\n var title = TYPE_NAMES[type];\n return (React.createElement(\"span\", { styleName: \"caret-type\", onClick: this.togglePopup },\n caretShow && React.createElement(\"i\", { className: (popupComponent ? '' : 'hidden ') + 'fa fa-caret-down' }),\n caretShow && ' ',\n type && React.createElement(\"i\", { className: 'fa ' + icon, styleName: \"type\", title: title })));\n };\n FieldBase.prototype.renderAddSpan = function () {\n return this.props.onAdd && (React.createElement(\"span\", null,\n React.createElement(\"a\", { onClick: this.onAdd },\n React.createElement(\"i\", { className: \"fa fa-plus\" }))));\n };\n FieldBase.prototype.renderRemoveSpan = function () {\n var onRemove = this.props.onRemove;\n return onRemove && (React.createElement(\"span\", null,\n React.createElement(\"a\", { onClick: onRemove },\n React.createElement(\"i\", { className: \"fa fa-times\" }))));\n };\n FieldBase.prototype.renderAddFilterSpan = function () {\n var _a = this.props, filter = _a.filter, fieldDef = _a.fieldDef;\n if (filter && !wildcard_1.isWildcard(fieldDef.field)) {\n var style = filter.active ? '' : 'filter-button-unadded';\n return this.props.filter && (React.createElement(\"span\", { styleName: style },\n React.createElement(\"a\", { onClick: this.onFilterToggle },\n React.createElement(\"i\", { className: 'fa fa-filter' }))));\n }\n };\n FieldBase.prototype.renderFuncSpan = function (fnName) {\n return (React.createElement(\"span\", { styleName: \"func\", title: fnName }, fnName));\n };\n FieldBase.prototype.onAdd = function () {\n this.props.onAdd(this.props.fieldDef);\n };\n FieldBase.prototype.onDoubleClick = function () {\n if (this.props.onDoubleClick) {\n this.props.onDoubleClick(this.props.fieldDef);\n }\n };\n FieldBase.prototype.handleClickOutside = function (e) {\n if (!this.field || this.field.contains(e.target) || this.popup.contains(e.target)) {\n return;\n }\n this.closePopup();\n };\n FieldBase.prototype.closePopup = function () {\n if (this.props.popupComponent) {\n this.setState({\n popupIsOpened: false\n });\n }\n };\n FieldBase.prototype.togglePopup = function () {\n if (this.props.popupComponent) {\n this.setState({\n popupIsOpened: !this.state.popupIsOpened\n });\n }\n };\n return FieldBase;\n}(React.PureComponent));\n;\n// FIXME add icon for key\nvar TYPE_NAMES = {\n nominal: 'text',\n ordinal: 'text-ordinal',\n quantitative: 'number',\n temporal: 'time',\n geographic: 'geo'\n};\nvar TYPE_ICONS = {\n nominal: 'fa-font',\n ordinal: 'fa-font',\n quantitative: 'fa-hashtag',\n temporal: 'fa-calendar',\n};\nvar fieldSource = {\n beginDrag: function (props) {\n var fieldDef = props.fieldDef, parentId = props.parentId, schema = props.schema;\n var domain;\n if (!wildcard_1.isWildcard(fieldDef.field) && fieldDef.field !== '*') {\n domain = schema.domain({ field: fieldDef.field });\n }\n var filter = filter_1.createDefaultFilter(fieldDef, domain);\n return { fieldDef: fieldDef, parentId: parentId, filter: filter };\n },\n canDrag: function (props, monitor) {\n return props.draggable;\n }\n};\n/**\n * Specifies which props to inject into your component.\n */\nvar collect = function (connect, monitor) {\n return {\n // Call this function inside render()\n // to let React DnD handle the drag events:\n connectDragSource: connect.dragSource(),\n // You can ask the monitor about the current drag state:\n isDragging: monitor.isDragging()\n };\n};\n// HACK: do type casting to suppress compile error for: https://github.com/Microsoft/TypeScript/issues/13526\nexports.Field = react_dnd_1.DragSource(constants_1.DraggableType.FIELD, fieldSource, collect)(CSSModules(FieldBase, styles));\n\n\n/***/ }),\n/* 119 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************!*\\\n !*** external \"react-dnd\" ***!\n \\****************************/\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_119__;\n\n/***/ }),\n/* 120 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************!*\\\n !*** external \"redux\" ***!\n \\************************/\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_120__;\n\n/***/ }),\n/* 121 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************!*\\\n !*** ./~/ajv/lib/compile/error_classes.js ***!\n \\********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar resolve = __webpack_require__(/*! ./resolve */ 122);\n\nmodule.exports = {\n Validation: errorSubclass(ValidationError),\n MissingRef: errorSubclass(MissingRefError)\n};\n\n\nfunction ValidationError(errors) {\n this.message = 'validation failed';\n this.errors = errors;\n this.ajv = this.validation = true;\n}\n\n\nMissingRefError.message = function (baseId, ref) {\n return 'can\\'t resolve reference ' + ref + ' from id ' + baseId;\n};\n\n\nfunction MissingRefError(baseId, ref, message) {\n this.message = message || MissingRefError.message(baseId, ref);\n this.missingRef = resolve.url(baseId, ref);\n this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));\n}\n\n\nfunction errorSubclass(Subclass) {\n Subclass.prototype = Object.create(Error.prototype);\n Subclass.prototype.constructor = Subclass;\n return Subclass;\n}\n\n\n/***/ }),\n/* 122 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************!*\\\n !*** ./~/ajv/lib/compile/resolve.js ***!\n \\**************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar url = __webpack_require__(/*! url */ 153)\n , equal = __webpack_require__(/*! fast-deep-equal */ 142)\n , util = __webpack_require__(/*! ./util */ 67)\n , SchemaObject = __webpack_require__(/*! ./schema_obj */ 178)\n , traverse = __webpack_require__(/*! json-schema-traverse */ 467);\n\nmodule.exports = resolve;\n\nresolve.normalizeId = normalizeId;\nresolve.fullPath = getFullPath;\nresolve.url = resolveUrl;\nresolve.ids = resolveIds;\nresolve.inlineRef = inlineRef;\nresolve.schema = resolveSchema;\n\n/**\n * [resolve and compile the references ($ref)]\n * @this Ajv\n * @param {Function} compile reference to schema compilation funciton (localCompile)\n * @param {Object} root object with information about the root schema for the current schema\n * @param {String} ref reference to resolve\n * @return {Object|Function} schema object (if the schema can be inlined) or validation function\n */\nfunction resolve(compile, root, ref) {\n /* jshint validthis: true */\n var refVal = this._refs[ref];\n if (typeof refVal == 'string') {\n if (this._refs[refVal]) refVal = this._refs[refVal];\n else return resolve.call(this, compile, root, refVal);\n }\n\n refVal = refVal || this._schemas[ref];\n if (refVal instanceof SchemaObject) {\n return inlineRef(refVal.schema, this._opts.inlineRefs)\n ? refVal.schema\n : refVal.validate || this._compile(refVal);\n }\n\n var res = resolveSchema.call(this, root, ref);\n var schema, v, baseId;\n if (res) {\n schema = res.schema;\n root = res.root;\n baseId = res.baseId;\n }\n\n if (schema instanceof SchemaObject) {\n v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);\n } else if (schema !== undefined) {\n v = inlineRef(schema, this._opts.inlineRefs)\n ? schema\n : compile.call(this, schema, root, undefined, baseId);\n }\n\n return v;\n}\n\n\n/**\n * Resolve schema, its root and baseId\n * @this Ajv\n * @param {Object} root root object with properties schema, refVal, refs\n * @param {String} ref reference to resolve\n * @return {Object} object with properties schema, root, baseId\n */\nfunction resolveSchema(root, ref) {\n /* jshint validthis: true */\n var p = url.parse(ref, false, true)\n , refPath = _getFullPath(p)\n , baseId = getFullPath(this._getId(root.schema));\n if (refPath !== baseId) {\n var id = normalizeId(refPath);\n var refVal = this._refs[id];\n if (typeof refVal == 'string') {\n return resolveRecursive.call(this, root, refVal, p);\n } else if (refVal instanceof SchemaObject) {\n if (!refVal.validate) this._compile(refVal);\n root = refVal;\n } else {\n refVal = this._schemas[id];\n if (refVal instanceof SchemaObject) {\n if (!refVal.validate) this._compile(refVal);\n if (id == normalizeId(ref))\n return { schema: refVal, root: root, baseId: baseId };\n root = refVal;\n } else {\n return;\n }\n }\n if (!root.schema) return;\n baseId = getFullPath(this._getId(root.schema));\n }\n return getJsonPointer.call(this, p, baseId, root.schema, root);\n}\n\n\n/* @this Ajv */\nfunction resolveRecursive(root, ref, parsedRef) {\n /* jshint validthis: true */\n var res = resolveSchema.call(this, root, ref);\n if (res) {\n var schema = res.schema;\n var baseId = res.baseId;\n root = res.root;\n var id = this._getId(schema);\n if (id) baseId = resolveUrl(baseId, id);\n return getJsonPointer.call(this, parsedRef, baseId, schema, root);\n }\n}\n\n\nvar PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);\n/* @this Ajv */\nfunction getJsonPointer(parsedRef, baseId, schema, root) {\n /* jshint validthis: true */\n parsedRef.hash = parsedRef.hash || '';\n if (parsedRef.hash.slice(0,2) != '#/') return;\n var parts = parsedRef.hash.split('/');\n\n for (var i = 1; i < parts.length; i++) {\n var part = parts[i];\n if (part) {\n part = util.unescapeFragment(part);\n schema = schema[part];\n if (schema === undefined) break;\n var id;\n if (!PREVENT_SCOPE_CHANGE[part]) {\n id = this._getId(schema);\n if (id) baseId = resolveUrl(baseId, id);\n if (schema.$ref) {\n var $ref = resolveUrl(baseId, schema.$ref);\n var res = resolveSchema.call(this, root, $ref);\n if (res) {\n schema = res.schema;\n root = res.root;\n baseId = res.baseId;\n }\n }\n }\n }\n }\n if (schema !== undefined && schema !== root.schema)\n return { schema: schema, root: root, baseId: baseId };\n}\n\n\nvar SIMPLE_INLINED = util.toHash([\n 'type', 'format', 'pattern',\n 'maxLength', 'minLength',\n 'maxProperties', 'minProperties',\n 'maxItems', 'minItems',\n 'maximum', 'minimum',\n 'uniqueItems', 'multipleOf',\n 'required', 'enum'\n]);\nfunction inlineRef(schema, limit) {\n if (limit === false) return false;\n if (limit === undefined || limit === true) return checkNoRef(schema);\n else if (limit) return countKeys(schema) <= limit;\n}\n\n\nfunction checkNoRef(schema) {\n var item;\n if (Array.isArray(schema)) {\n for (var i=0; i 0 ? includes_1[l - 1].duplicate() : new propindex_1.PropIndex());\n replaces.push(l > 0 ? replaces[l - 1].duplicate() : new propindex_1.PropIndex());\n var groupBy = queryNest[l].groupBy;\n if (util_1.isArray(groupBy)) {\n // If group is array, it's an array of extended group by that need to be parsed\n var parsedGroupBy = groupby_1.parseGroupBy(groupBy, includes_1[l], replaces[l]);\n replacers_1.push(parsedGroupBy.replacer);\n }\n }\n // With includes and replacers, now we can construct the nesting tree\n specModels.forEach(function (specM) {\n var path = '';\n var group = rootGroup_1;\n for (var l = 0; l < queryNest.length; l++) {\n var groupBy = group.groupBy = queryNest[l].groupBy;\n group.orderGroupBy = queryNest[l].orderGroupBy;\n var key = util_1.isArray(groupBy) ?\n shorthand_1.spec(specM.specQuery, includes_1[l], replacers_1[l]) :\n groupRegistry[groupBy](specM.specQuery);\n path += '/' + key;\n if (!groupIndex_1[path]) {\n groupIndex_1[path] = {\n name: key,\n path: path,\n items: [],\n };\n group.items.push(groupIndex_1[path]);\n }\n group = groupIndex_1[path];\n }\n group.items.push(specM);\n });\n return rootGroup_1;\n }\n else {\n // no nesting, just return a flat group\n return {\n name: '',\n path: '',\n items: specModels,\n };\n }\n}\nexports.nest = nest;\n// TODO: move this to groupBy, rename properly, and export\nvar GROUP_BY_FIELD = [property_1.Property.FIELD];\nvar PARSED_GROUP_BY_FIELD = groupby_1.parseGroupBy(GROUP_BY_FIELD);\nfunction getGroupByKey(specM, groupBy) {\n return groupRegistry[groupBy](specM);\n}\nexports.getGroupByKey = getGroupByKey;\nregisterKeyFn(exports.FIELD, function (specQ) {\n return shorthand_1.spec(specQ, PARSED_GROUP_BY_FIELD.include, PARSED_GROUP_BY_FIELD.replacer);\n});\nexports.PARSED_GROUP_BY_FIELD_TRANSFORM = groupby_1.parseGroupBy(groupby_1.GROUP_BY_FIELD_TRANSFORM);\nregisterKeyFn(exports.FIELD_TRANSFORM, function (specQ) {\n return shorthand_1.spec(specQ, exports.PARSED_GROUP_BY_FIELD_TRANSFORM.include, exports.PARSED_GROUP_BY_FIELD_TRANSFORM.replacer);\n});\nexports.PARSED_GROUP_BY_ENCODING = groupby_1.parseGroupBy(groupby_1.GROUP_BY_ENCODING);\nregisterKeyFn(exports.ENCODING, function (specQ) {\n return shorthand_1.spec(specQ, exports.PARSED_GROUP_BY_ENCODING.include, exports.PARSED_GROUP_BY_ENCODING.replacer);\n});\nregisterKeyFn(exports.SPEC, function (specQ) { return JSON.stringify(specQ); });\n\n\n/***/ }),\n/* 126 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************************!*\\\n !*** ./~/compassql/build/src/ranking/effectiveness/type.js ***!\n \\*************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar scale_1 = __webpack_require__(/*! vega-lite/build/src/scale */ 5);\nvar type_1 = __webpack_require__(/*! vega-lite/build/src/type */ 16);\nvar encoding_1 = __webpack_require__(/*! ../../query/encoding */ 14);\nvar expandedtype_1 = __webpack_require__(/*! ../../query/expandedtype */ 31);\n/**\n * Finer grained data types that takes binning and timeUnit into account.\n */\nvar ExtendedType;\n(function (ExtendedType) {\n ExtendedType[ExtendedType[\"Q\"] = type_1.Type.QUANTITATIVE] = \"Q\";\n ExtendedType[ExtendedType[\"BIN_Q\"] = 'bin_' + type_1.Type.QUANTITATIVE] = \"BIN_Q\";\n ExtendedType[ExtendedType[\"T\"] = type_1.Type.TEMPORAL] = \"T\";\n /**\n * Time Unit Temporal Field with time scale.\n */\n ExtendedType[ExtendedType[\"TIMEUNIT_T\"] = 'timeUnit_time'] = \"TIMEUNIT_T\";\n /**\n * Time Unit Temporal Field with ordinal scale.\n */\n ExtendedType[ExtendedType[\"TIMEUNIT_O\"] = 'timeUnit_' + type_1.Type.ORDINAL] = \"TIMEUNIT_O\";\n ExtendedType[ExtendedType[\"O\"] = type_1.Type.ORDINAL] = \"O\";\n ExtendedType[ExtendedType[\"N\"] = type_1.Type.NOMINAL] = \"N\";\n ExtendedType[ExtendedType[\"K\"] = expandedtype_1.ExpandedType.KEY] = \"K\";\n ExtendedType[ExtendedType[\"NONE\"] = '-'] = \"NONE\";\n})(ExtendedType = exports.ExtendedType || (exports.ExtendedType = {}));\nexports.Q = ExtendedType.Q;\nexports.BIN_Q = ExtendedType.BIN_Q;\nexports.T = ExtendedType.T;\nexports.TIMEUNIT_T = ExtendedType.TIMEUNIT_T;\nexports.TIMEUNIT_O = ExtendedType.TIMEUNIT_O;\nexports.O = ExtendedType.O;\nexports.N = ExtendedType.N;\nexports.K = ExtendedType.K;\nexports.NONE = ExtendedType.NONE;\nfunction getExtendedType(fieldQ) {\n if (fieldQ.bin) {\n return ExtendedType.BIN_Q;\n }\n else if (fieldQ.timeUnit) {\n var sType = encoding_1.scaleType(fieldQ);\n return scale_1.hasDiscreteDomain(sType) ? ExtendedType.TIMEUNIT_O : ExtendedType.TIMEUNIT_T;\n }\n return fieldQ.type;\n}\nexports.getExtendedType = getExtendedType;\n\n\n/***/ }),\n/* 127 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/core-js/library/modules/_cof.js ***!\n \\*******************************************/\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function(it){\n return toString.call(it).slice(8, -1);\n};\n\n/***/ }),\n/* 128 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/core-js/library/modules/_ctx.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(/*! ./_a-function */ 381);\nmodule.exports = function(fn, that, length){\n aFunction(fn);\n if(that === undefined)return fn;\n switch(length){\n case 1: return function(a){\n return fn.call(that, a);\n };\n case 2: return function(a, b){\n return fn.call(that, a, b);\n };\n case 3: return function(a, b, c){\n return fn.call(that, a, b, c);\n };\n }\n return function(/* ...args */){\n return fn.apply(that, arguments);\n };\n};\n\n/***/ }),\n/* 129 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************!*\\\n !*** ./~/core-js/library/modules/_defined.js ***!\n \\***********************************************/\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function(it){\n if(it == undefined)throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n/***/ }),\n/* 130 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************************!*\\\n !*** ./~/core-js/library/modules/_enum-bug-keys.js ***!\n \\*****************************************************/\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n/***/ }),\n/* 131 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************!*\\\n !*** ./~/core-js/library/modules/_library.js ***!\n \\***********************************************/\n/***/ (function(module, exports) {\n\nmodule.exports = true;\n\n/***/ }),\n/* 132 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************************!*\\\n !*** ./~/core-js/library/modules/_object-create.js ***!\n \\*****************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(/*! ./_an-object */ 71)\n , dPs = __webpack_require__(/*! ./_object-dps */ 397)\n , enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ 130)\n , IE_PROTO = __webpack_require__(/*! ./_shared-key */ 136)('IE_PROTO')\n , Empty = function(){ /* empty */ }\n , PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function(){\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(/*! ./_dom-create */ 190)('iframe')\n , i = enumBugKeys.length\n , lt = '<'\n , gt = '>'\n , iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(/*! ./_html */ 387).appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties){\n var result;\n if(O !== null){\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty;\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n/* 133 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************!*\\\n !*** ./~/core-js/library/modules/_object-gopd.js ***!\n \\***************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(/*! ./_object-pie */ 100)\n , createDesc = __webpack_require__(/*! ./_property-desc */ 80)\n , toIObject = __webpack_require__(/*! ./_to-iobject */ 52)\n , toPrimitive = __webpack_require__(/*! ./_to-primitive */ 139)\n , has = __webpack_require__(/*! ./_has */ 61)\n , IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ 191)\n , gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(/*! ./_descriptors */ 60) ? gOPD : function getOwnPropertyDescriptor(O, P){\n O = toIObject(O);\n P = toPrimitive(P, true);\n if(IE8_DOM_DEFINE)try {\n return gOPD(O, P);\n } catch(e){ /* empty */ }\n if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n/***/ }),\n/* 134 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************!*\\\n !*** ./~/core-js/library/modules/_object-gops.js ***!\n \\***************************************************/\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n/***/ }),\n/* 135 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************************************!*\\\n !*** ./~/core-js/library/modules/_set-to-string-tag.js ***!\n \\*********************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(/*! ./_object-dp */ 51).f\n , has = __webpack_require__(/*! ./_has */ 61)\n , TAG = __webpack_require__(/*! ./_wks */ 37)('toStringTag');\n\nmodule.exports = function(it, tag, stat){\n if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});\n};\n\n/***/ }),\n/* 136 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/core-js/library/modules/_shared-key.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(/*! ./_shared */ 137)('keys')\n , uid = __webpack_require__(/*! ./_uid */ 102);\nmodule.exports = function(key){\n return shared[key] || (shared[key] = uid(key));\n};\n\n/***/ }),\n/* 137 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************************!*\\\n !*** ./~/core-js/library/modules/_shared.js ***!\n \\**********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(/*! ./_global */ 50)\n , SHARED = '__core-js_shared__'\n , store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function(key){\n return store[key] || (store[key] = {});\n};\n\n/***/ }),\n/* 138 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/core-js/library/modules/_to-integer.js ***!\n \\**************************************************/\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil\n , floor = Math.floor;\nmodule.exports = function(it){\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n/***/ }),\n/* 139 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************************!*\\\n !*** ./~/core-js/library/modules/_to-primitive.js ***!\n \\****************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(/*! ./_is-object */ 77);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function(it, S){\n if(!isObject(it))return it;\n var fn, val;\n if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\n/***/ }),\n/* 140 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/core-js/library/modules/_wks-define.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(/*! ./_global */ 50)\n , core = __webpack_require__(/*! ./_core */ 25)\n , LIBRARY = __webpack_require__(/*! ./_library */ 131)\n , wksExt = __webpack_require__(/*! ./_wks-ext */ 141)\n , defineProperty = __webpack_require__(/*! ./_object-dp */ 51).f;\nmodule.exports = function(name){\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\n};\n\n/***/ }),\n/* 141 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************!*\\\n !*** ./~/core-js/library/modules/_wks-ext.js ***!\n \\***********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.f = __webpack_require__(/*! ./_wks */ 37);\n\n/***/ }),\n/* 142 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************!*\\\n !*** ./~/fast-deep-equal/index.js ***!\n \\************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n var arrA = Array.isArray(a)\n , arrB = Array.isArray(b)\n , i;\n\n if (arrA && arrB) {\n if (a.length != b.length) return false;\n for (i = 0; i < a.length; i++)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n if (arrA != arrB) return false;\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n var keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) return false;\n\n var dateA = a instanceof Date\n , dateB = b instanceof Date;\n if (dateA && dateB) return a.getTime() == b.getTime();\n if (dateA != dateB) return false;\n\n var regexpA = a instanceof RegExp\n , regexpB = b instanceof RegExp;\n if (regexpA && regexpB) return a.toString() == b.toString();\n if (regexpA != regexpB) return false;\n\n for (i = 0; i < keys.length; i++)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = 0; i < keys.length; i++)\n if(!equal(a[keys[i]], b[keys[i]])) return false;\n\n return true;\n }\n\n return false;\n};\n\n\n/***/ }),\n/* 143 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************!*\\\n !*** ./~/fbjs/lib/emptyFunction.js ***!\n \\*************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n return function () {\n return arg;\n };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n return arg;\n};\n\nmodule.exports = emptyFunction;\n\n/***/ }),\n/* 144 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************!*\\\n !*** ./~/fbjs/lib/warning.js ***!\n \\*******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n\n\nvar emptyFunction = __webpack_require__(/*! ./emptyFunction */ 143);\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (undefined !== 'production') {\n (function () {\n var printWarning = function printWarning(format) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n\n warning = function warning(condition, format) {\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n\n if (format.indexOf('Failed Composite propType: ') === 0) {\n return; // Ignore CompositeComponent proptype check.\n }\n\n if (!condition) {\n for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n args[_key2 - 2] = arguments[_key2];\n }\n\n printWarning.apply(undefined, [format].concat(args));\n }\n };\n })();\n}\n\nmodule.exports = warning;\n\n/***/ }),\n/* 145 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/inline-style-prefixer/dynamic/index.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createPrefixer = __webpack_require__(/*! ./createPrefixer */ 439);\n\nvar _createPrefixer2 = _interopRequireDefault(_createPrefixer);\n\nvar _cursor = __webpack_require__(/*! ./plugins/cursor */ 442);\n\nvar _cursor2 = _interopRequireDefault(_cursor);\n\nvar _crossFade = __webpack_require__(/*! ./plugins/crossFade */ 441);\n\nvar _crossFade2 = _interopRequireDefault(_crossFade);\n\nvar _filter = __webpack_require__(/*! ./plugins/filter */ 443);\n\nvar _filter2 = _interopRequireDefault(_filter);\n\nvar _flex = __webpack_require__(/*! ./plugins/flex */ 444);\n\nvar _flex2 = _interopRequireDefault(_flex);\n\nvar _flexboxOld = __webpack_require__(/*! ./plugins/flexboxOld */ 445);\n\nvar _flexboxOld2 = _interopRequireDefault(_flexboxOld);\n\nvar _gradient = __webpack_require__(/*! ./plugins/gradient */ 446);\n\nvar _gradient2 = _interopRequireDefault(_gradient);\n\nvar _imageSet = __webpack_require__(/*! ./plugins/imageSet */ 447);\n\nvar _imageSet2 = _interopRequireDefault(_imageSet);\n\nvar _position = __webpack_require__(/*! ./plugins/position */ 448);\n\nvar _position2 = _interopRequireDefault(_position);\n\nvar _sizing = __webpack_require__(/*! ./plugins/sizing */ 449);\n\nvar _sizing2 = _interopRequireDefault(_sizing);\n\nvar _transition = __webpack_require__(/*! ./plugins/transition */ 450);\n\nvar _transition2 = _interopRequireDefault(_transition);\n\nvar _static = __webpack_require__(/*! ../static */ 452);\n\nvar _static2 = _interopRequireDefault(_static);\n\nvar _dynamicData = __webpack_require__(/*! ./dynamicData */ 440);\n\nvar _dynamicData2 = _interopRequireDefault(_dynamicData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar plugins = [_crossFade2.default, _cursor2.default, _filter2.default, _flexboxOld2.default, _gradient2.default, _imageSet2.default, _position2.default, _sizing2.default, _transition2.default, _flex2.default];\n\nvar Prefixer = (0, _createPrefixer2.default)({\n prefixMap: _dynamicData2.default.prefixMap,\n plugins: plugins\n}, _static2.default);\nexports.default = Prefixer;\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 146 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************************!*\\\n !*** ./~/inline-style-prefixer/utils/capitalizeString.js ***!\n \\***********************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = capitalizeString;\nfunction capitalizeString(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 147 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/prop-types/lib/ReactPropTypesSecret.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n\n\n/***/ }),\n/* 148 */\n/* exports provided: default */\n/* exports used: default */\n/*!**********************************!*\\\n !*** ./~/rc-slider/es/Handle.js ***!\n \\**********************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends__ = __webpack_require__(/*! babel-runtime/helpers/extends */ 17);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_objectWithoutProperties__ = __webpack_require__(/*! babel-runtime/helpers/objectWithoutProperties */ 75);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_objectWithoutProperties___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_objectWithoutProperties__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck__ = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ 27);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass__ = __webpack_require__(/*! babel-runtime/helpers/createClass */ 28);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_possibleConstructorReturn__ = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ 30);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_possibleConstructorReturn___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_possibleConstructorReturn__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_inherits__ = __webpack_require__(/*! babel-runtime/helpers/inherits */ 29);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_inherits___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_inherits__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_react__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_react__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_prop_types__ = __webpack_require__(/*! prop-types */ 1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_prop_types__);\n\n\n\n\n\n\n\n\n\nvar Handle = function (_React$Component) {\n __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_inherits___default()(Handle, _React$Component);\n\n function Handle() {\n __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_classCallCheck___default()(this, Handle);\n\n return __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_possibleConstructorReturn___default()(this, (Handle.__proto__ || Object.getPrototypeOf(Handle)).apply(this, arguments));\n }\n\n __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_createClass___default()(Handle, [{\n key: 'render',\n value: function render() {\n var _props = this.props,\n className = _props.className,\n vertical = _props.vertical,\n offset = _props.offset,\n style = _props.style,\n disabled = _props.disabled,\n min = _props.min,\n max = _props.max,\n value = _props.value,\n restProps = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_objectWithoutProperties___default()(_props, ['className', 'vertical', 'offset', 'style', 'disabled', 'min', 'max', 'value']);\n\n var postionStyle = vertical ? { bottom: offset + '%' } : { left: offset + '%' };\n var elStyle = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends___default()({}, style, postionStyle);\n var ariaProps = {};\n if (value !== undefined) {\n ariaProps = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends___default()({}, ariaProps, {\n 'aria-valuemin': min,\n 'aria-valuemax': max,\n 'aria-valuenow': value,\n 'aria-disabled': !!disabled\n });\n }\n return __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement('div', __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends___default()({\n role: 'slider',\n tabIndex: '0'\n }, ariaProps, restProps, {\n className: className,\n style: elStyle\n }));\n }\n }]);\n\n return Handle;\n}(__WEBPACK_IMPORTED_MODULE_6_react___default.a.Component);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Handle);\n\n\nHandle.propTypes = {\n className: __WEBPACK_IMPORTED_MODULE_7_prop_types___default.a.string,\n vertical: __WEBPACK_IMPORTED_MODULE_7_prop_types___default.a.bool,\n offset: __WEBPACK_IMPORTED_MODULE_7_prop_types___default.a.number,\n style: __WEBPACK_IMPORTED_MODULE_7_prop_types___default.a.object,\n disabled: __WEBPACK_IMPORTED_MODULE_7_prop_types___default.a.bool,\n min: __WEBPACK_IMPORTED_MODULE_7_prop_types___default.a.number,\n max: __WEBPACK_IMPORTED_MODULE_7_prop_types___default.a.number,\n value: __WEBPACK_IMPORTED_MODULE_7_prop_types___default.a.number\n};\n\n/***/ }),\n/* 149 */\n/* exports provided: isEventFromHandle, isValueOutOfRange, isNotTouchEvent, getClosestPoint, getPrecision, getMousePosition, getTouchPosition, getHandleCenterPosition, ensureValueInRange, ensureValuePrecision, pauseEvent, getKeyboardValueMutator */\n/* exports used: isValueOutOfRange, pauseEvent, ensureValueInRange, ensureValuePrecision, getMousePosition, isEventFromHandle, getHandleCenterPosition, isNotTouchEvent, getTouchPosition, getKeyboardValueMutator */\n/*!*********************************!*\\\n !*** ./~/rc-slider/es/utils.js ***!\n \\*********************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"f\"] = isEventFromHandle;\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isValueOutOfRange;\n/* harmony export (immutable) */ __webpack_exports__[\"h\"] = isNotTouchEvent;\n/* unused harmony export getClosestPoint */\n/* unused harmony export getPrecision */\n/* harmony export (immutable) */ __webpack_exports__[\"e\"] = getMousePosition;\n/* harmony export (immutable) */ __webpack_exports__[\"i\"] = getTouchPosition;\n/* harmony export (immutable) */ __webpack_exports__[\"g\"] = getHandleCenterPosition;\n/* harmony export (immutable) */ __webpack_exports__[\"c\"] = ensureValueInRange;\n/* harmony export (immutable) */ __webpack_exports__[\"d\"] = ensureValuePrecision;\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = pauseEvent;\n/* harmony export (immutable) */ __webpack_exports__[\"j\"] = getKeyboardValueMutator;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__ = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ 123);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react_dom__ = __webpack_require__(/*! react-dom */ 24);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react_dom___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react_dom__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__ = __webpack_require__(/*! rc-util/es/KeyCode */ 504);\n\n\n\n\nfunction isEventFromHandle(e, handles) {\n return Object.keys(handles).some(function (key) {\n return e.target === __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1_react_dom__[\"findDOMNode\"])(handles[key]);\n });\n}\n\nfunction isValueOutOfRange(value, _ref) {\n var min = _ref.min,\n max = _ref.max;\n\n return value < min || value > max;\n}\n\nfunction isNotTouchEvent(e) {\n return e.touches.length > 1 || e.type.toLowerCase() === 'touchend' && e.touches.length > 0;\n}\n\nfunction getClosestPoint(val, _ref2) {\n var marks = _ref2.marks,\n step = _ref2.step,\n min = _ref2.min;\n\n var points = Object.keys(marks).map(parseFloat);\n if (step !== null) {\n var closestStep = Math.round((val - min) / step) * step + min;\n points.push(closestStep);\n }\n var diffs = points.map(function (point) {\n return Math.abs(val - point);\n });\n return points[diffs.indexOf(Math.min.apply(Math, __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_toConsumableArray___default()(diffs)))];\n}\n\nfunction getPrecision(step) {\n var stepString = step.toString();\n var precision = 0;\n if (stepString.indexOf('.') >= 0) {\n precision = stepString.length - stepString.indexOf('.') - 1;\n }\n return precision;\n}\n\nfunction getMousePosition(vertical, e) {\n return vertical ? e.clientY : e.pageX;\n}\n\nfunction getTouchPosition(vertical, e) {\n return vertical ? e.touches[0].clientY : e.touches[0].pageX;\n}\n\nfunction getHandleCenterPosition(vertical, handle) {\n var coords = handle.getBoundingClientRect();\n return vertical ? coords.top + coords.height * 0.5 : coords.left + coords.width * 0.5;\n}\n\nfunction ensureValueInRange(val, _ref3) {\n var max = _ref3.max,\n min = _ref3.min;\n\n if (val <= min) {\n return min;\n }\n if (val >= max) {\n return max;\n }\n return val;\n}\n\nfunction ensureValuePrecision(val, props) {\n var step = props.step;\n\n var closestPoint = getClosestPoint(val, props);\n return step === null ? closestPoint : parseFloat(closestPoint.toFixed(getPrecision(step)));\n}\n\nfunction pauseEvent(e) {\n e.stopPropagation();\n e.preventDefault();\n}\n\nfunction getKeyboardValueMutator(e) {\n switch (e.keyCode) {\n case __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__[\"a\" /* default */].UP:\n case __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__[\"a\" /* default */].RIGHT:\n return function (value, props) {\n return value + props.step;\n };\n\n case __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__[\"a\" /* default */].DOWN:\n case __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__[\"a\" /* default */].LEFT:\n return function (value, props) {\n return value - props.step;\n };\n\n case __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__[\"a\" /* default */].END:\n return function (value, props) {\n return props.max;\n };\n case __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__[\"a\" /* default */].HOME:\n return function (value, props) {\n return props.min;\n };\n case __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__[\"a\" /* default */].PAGE_UP:\n return function (value, props) {\n return value + props.step * 2;\n };\n case __WEBPACK_IMPORTED_MODULE_2_rc_util_es_KeyCode__[\"a\" /* default */].PAGE_DOWN:\n return function (value, props) {\n return value - props.step * 2;\n };\n\n default:\n return undefined;\n }\n}\n\n/***/ }),\n/* 150 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************!*\\\n !*** ./~/react-spinners/index.js ***!\n \\***********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./dist/index */ 552);\n\n/***/ }),\n/* 151 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************************!*\\\n !*** ./~/react-style-proptype/src/index.js ***!\n \\*********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar properties = __webpack_require__(/*! ./css-properties.js */ 576);\nvar React = __webpack_require__(/*! react */ 0);\n\nmodule.exports = function(props, propName, componentName) {\n var styles = props[propName];\n if (!styles) {\n return;\n }\n\n var failures = [];\n Object.keys(styles).forEach(function(styleKey){\n if (properties.indexOf(styleKey) === -1) {\n failures.push(styleKey);\n }\n });\n if (failures.length) {\n throw new Error('Prop ' + propName + ' passed to ' + componentName + '. Has invalid keys ' + failures.join(', '));\n }\n};\n\nmodule.exports.isRequired = function(props, propName, componentName) {\n if (!props[propName]) {\n throw new Error('Prop ' + propName + ' passed to ' + componentName + ' is required');\n }\n return module.exports(props, propName, componentName);\n};\n\nmodule.exports.supportingArrays = React.PropTypes.oneOfType([\n React.PropTypes.arrayOf(module.exports),\n module.exports\n]);\n\n\n\n/***/ }),\n/* 152 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************************!*\\\n !*** ./~/react-tabs/lib/helpers/childrenDeepMap.js ***!\n \\*****************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.deepMap = deepMap;\nexports.deepForEach = deepForEach;\n\nvar _react = __webpack_require__(/*! react */ 0);\n\nvar _Tab = __webpack_require__(/*! ../components/Tab */ 84);\n\nvar _Tab2 = _interopRequireDefault(_Tab);\n\nvar _TabList = __webpack_require__(/*! ../components/TabList */ 105);\n\nvar _TabList2 = _interopRequireDefault(_TabList);\n\nvar _TabPanel = __webpack_require__(/*! ../components/TabPanel */ 85);\n\nvar _TabPanel2 = _interopRequireDefault(_TabPanel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isTabChild(child) {\n return child.type === _Tab2.default || child.type === _TabList2.default || child.type === _TabPanel2.default;\n}\n\nfunction deepMap(children, callback) {\n return _react.Children.map(children, function (child) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/reactjs/react-tabs/issues/37\n if (child === null) return null;\n\n if (isTabChild(child)) {\n return callback(child);\n }\n\n if (child.props && child.props.children && _typeof(child.props.children) === 'object') {\n // Clone the child that has children and map them too\n return (0, _react.cloneElement)(child, _extends({}, child.props, {\n children: deepMap(child.props.children, callback)\n }));\n }\n\n return child;\n });\n}\n\nfunction deepForEach(children, callback) {\n return _react.Children.forEach(children, function (child) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/reactjs/react-tabs/issues/37\n if (child === null) return;\n\n if (child.type === _Tab2.default || child.type === _TabPanel2.default) {\n callback(child);\n } else if (child.props && child.props.children && _typeof(child.props.children) === 'object') {\n if (child.type === _TabList2.default) callback(child);\n deepForEach(child.props.children, callback);\n }\n });\n}\n\n/***/ }),\n/* 153 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************!*\\\n !*** ./~/url/url.js ***!\n \\**********************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\nvar punycode = __webpack_require__(/*! punycode */ 480);\nvar util = __webpack_require__(/*! ./util */ 586);\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n },\n querystring = __webpack_require__(/*! querystring */ 483);\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n\n var u = new Url;\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter =\n (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1)\n hostEnd = rest.length;\n\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1)\n continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\n\nUrl.prototype.format = function() {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ?\n this.hostname :\n '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n\n if (this.query &&\n util.isObject(this.query) &&\n Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n\n var search = this.search || (query && ('?' + query)) || '';\n\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes ||\n (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n\n pathname = pathname.replace(/[?#]/g, function(match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n\n return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol')\n result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] &&\n result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n\n result.href = result.format();\n return result;\n }\n\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n\n var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n isRelAbs = (\n relative.host ||\n relative.pathname && relative.pathname.charAt(0) === '/'\n ),\n mustEndAbs = (isRelAbs || isSourceAbs ||\n (result.host && relative.pathname)),\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;\n else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;\n else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n\n if (isRelAbs) {\n // it's absolute.\n result.host = (relative.host || relative.host === '') ?\n relative.host : result.host;\n result.hostname = (relative.hostname || relative.hostname === '') ?\n relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (\n (result.host || relative.host || srcPath.length > 1) &&\n (last === '.' || last === '..') || last === '');\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n\n if (mustEndAbs && srcPath[0] !== '' &&\n (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n\n if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n srcPath.push('');\n }\n\n var isAbsolute = srcPath[0] === '' ||\n (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' :\n srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n\n mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\n\nUrl.prototype.parseHost = function() {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};\n\n\n/***/ }),\n/* 154 */\n/* exports provided: selector */\n/* all exports used */\n/*!****************************************!*\\\n !*** ./~/vega-event-selector/index.js ***!\n \\****************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_event_selector__ = __webpack_require__(/*! ./src/event-selector */ 587);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"selector\", function() { return __WEBPACK_IMPORTED_MODULE_0__src_event_selector__[\"a\"]; });\n\n\n\n/***/ }),\n/* 155 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************!*\\\n !*** ./~/vega-lite/build/src/bin.js ***!\n \\**************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar channel_1 = __webpack_require__(/*! ./channel */ 3);\nvar util_1 = __webpack_require__(/*! ./util */ 2);\nfunction binToString(bin) {\n if (util_1.isBoolean(bin)) {\n return 'bin';\n }\n return 'bin' + util_1.keys(bin).map(function (p) { return \"_\" + p + \"_\" + bin[p]; }).join('');\n}\nexports.binToString = binToString;\nfunction autoMaxBins(channel) {\n switch (channel) {\n case channel_1.ROW:\n case channel_1.COLUMN:\n case channel_1.SIZE:\n case channel_1.COLOR:\n case channel_1.OPACITY:\n // Facets and Size shouldn't have too many bins\n // We choose 6 like shape to simplify the rule\n case channel_1.SHAPE:\n return 6; // Vega's \"shape\" has 6 distinct values\n default:\n return 10;\n }\n}\nexports.autoMaxBins = autoMaxBins;\n\n\n/***/ }),\n/* 156 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/selection/interval.js ***!\n \\*************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = __webpack_require__(/*! tslib */ 4);\nvar channel_1 = __webpack_require__(/*! ../../channel */ 3);\nvar log_1 = __webpack_require__(/*! ../../log */ 7);\nvar scale_1 = __webpack_require__(/*! ../../scale */ 5);\nvar util_1 = __webpack_require__(/*! ../../util */ 2);\nvar selection_1 = __webpack_require__(/*! ./selection */ 22);\nvar scales_1 = __webpack_require__(/*! ./transforms/scales */ 107);\nexports.BRUSH = '_brush';\nexports.SCALE_TRIGGER = '_scale_trigger';\nvar interval = {\n predicate: 'vlInterval',\n scaleDomain: 'vlIntervalDomain',\n signals: function (model, selCmpt) {\n var name = selCmpt.name;\n var hasScales = scales_1.default.has(selCmpt);\n var signals = [];\n var intervals = [];\n var tupleTriggers = [];\n var scaleTriggers = [];\n if (selCmpt.translate && !hasScales) {\n var filterExpr_1 = \"!event.item || event.item.mark.name !== \" + util_1.stringValue(name + exports.BRUSH);\n events(selCmpt, function (_, evt) {\n var filters = evt.between[0].filter || (evt.between[0].filter = []);\n if (filters.indexOf(filterExpr_1) < 0) {\n filters.push(filterExpr_1);\n }\n });\n }\n selCmpt.project.forEach(function (p) {\n var channel = p.channel;\n if (channel !== channel_1.X && channel !== channel_1.Y) {\n log_1.warn('Interval selections only support x and y encoding channels.');\n return;\n }\n var cs = channelSignals(model, selCmpt, channel);\n var dname = selection_1.channelSignalName(selCmpt, channel, 'data');\n var vname = selection_1.channelSignalName(selCmpt, channel, 'visual');\n var scaleStr = util_1.stringValue(model.scaleName(channel));\n var scaleType = model.getScaleComponent(channel).get('type');\n var toNum = scale_1.hasContinuousDomain(scaleType) ? '+' : '';\n signals.push.apply(signals, cs);\n tupleTriggers.push(dname);\n intervals.push(\"{encoding: \" + util_1.stringValue(channel) + \", \" +\n (\"field: \" + util_1.stringValue(p.field) + \", extent: \" + dname + \"}\"));\n scaleTriggers.push({\n scaleName: model.scaleName(channel),\n expr: \"(!isArray(\" + dname + \") || \" +\n (\"(\" + toNum + \"invert(\" + scaleStr + \", \" + vname + \")[0] === \" + toNum + dname + \"[0] && \") +\n (toNum + \"invert(\" + scaleStr + \", \" + vname + \")[1] === \" + toNum + dname + \"[1]))\")\n });\n });\n // Proxy scale reactions to ensure that an infinite loop doesn't occur\n // when an interval selection filter touches the scale.\n if (!hasScales) {\n signals.push({\n name: name + exports.SCALE_TRIGGER,\n update: scaleTriggers.map(function (t) { return t.expr; }).join(' && ') +\n (\" ? \" + (name + exports.SCALE_TRIGGER) + \" : {}\")\n });\n }\n // Only add an interval to the store if it has valid data extents. Data extents\n // are set to null if pixel extents are equal to account for intervals over\n // ordinal/nominal domains which, when inverted, will still produce a valid datum.\n return signals.concat({\n name: name + selection_1.TUPLE,\n on: [{\n events: tupleTriggers.map(function (t) { return ({ signal: t }); }),\n update: tupleTriggers.join(' && ') +\n (\" ? {unit: \" + selection_1.unitName(model) + \", intervals: [\" + intervals.join(', ') + \"]} : null\")\n }]\n });\n },\n modifyExpr: function (model, selCmpt) {\n var tpl = selCmpt.name + selection_1.TUPLE;\n return tpl + ', ' +\n (selCmpt.resolve === 'global' ? 'true' : \"{unit: \" + selection_1.unitName(model) + \"}\");\n },\n marks: function (model, selCmpt, marks) {\n var name = selCmpt.name;\n var _a = selection_1.spatialProjections(selCmpt), xi = _a.xi, yi = _a.yi;\n var store = \"data(\" + util_1.stringValue(selCmpt.name + selection_1.STORE) + \")\";\n // Do not add a brush if we're binding to scales.\n if (scales_1.default.has(selCmpt)) {\n return marks;\n }\n var update = {\n x: xi !== null ? { signal: name + \"_x[0]\" } : { value: 0 },\n y: yi !== null ? { signal: name + \"_y[0]\" } : { value: 0 },\n x2: xi !== null ? { signal: name + \"_x[1]\" } : { field: { group: 'width' } },\n y2: yi !== null ? { signal: name + \"_y[1]\" } : { field: { group: 'height' } }\n };\n // If the selection is resolved to global, only a single interval is in\n // the store. Wrap brush mark's encodings with a production rule to test\n // this based on the `unit` property. Hide the brush mark if it corresponds\n // to a unit different from the one in the store.\n if (selCmpt.resolve === 'global') {\n util_1.keys(update).forEach(function (key) {\n update[key] = [tslib_1.__assign({ test: store + \".length && \" + store + \"[0].unit === \" + selection_1.unitName(model) }, update[key]), { value: 0 }];\n });\n }\n // Two brush marks ensure that fill colors and other aesthetic choices do\n // not interefere with the core marks, but that the brushed region can still\n // be interacted with (e.g., dragging it around).\n var _b = selCmpt.mark, fill = _b.fill, fillOpacity = _b.fillOpacity, stroke = tslib_1.__rest(_b, [\"fill\", \"fillOpacity\"]);\n var vgStroke = util_1.keys(stroke).reduce(function (def, k) {\n def[k] = { value: stroke[k] };\n return def;\n }, {});\n return [{\n name: name + exports.BRUSH + '_bg',\n type: 'rect',\n clip: true,\n encode: {\n enter: {\n fill: { value: fill },\n fillOpacity: { value: fillOpacity }\n },\n update: update\n }\n }].concat(marks, {\n name: name + exports.BRUSH,\n type: 'rect',\n clip: true,\n encode: {\n enter: tslib_1.__assign({ fill: { value: 'transparent' } }, vgStroke),\n update: update\n }\n });\n }\n};\nexports.default = interval;\n/**\n * Returns the visual and data signals for an interval selection.\n */\nfunction channelSignals(model, selCmpt, channel) {\n var vname = selection_1.channelSignalName(selCmpt, channel, 'visual');\n var dname = selection_1.channelSignalName(selCmpt, channel, 'data');\n var hasScales = scales_1.default.has(selCmpt);\n var scaleName = model.scaleName(channel);\n var scaleStr = util_1.stringValue(scaleName);\n var scale = model.getScaleComponent(channel);\n var scaleType = scale ? scale.get('type') : undefined;\n var size = model.getSizeSignalRef(channel === channel_1.X ? 'width' : 'height').signal;\n var coord = channel + \"(unit)\";\n var on = events(selCmpt, function (def, evt) {\n return def.concat({ events: evt.between[0], update: \"[\" + coord + \", \" + coord + \"]\" }, // Brush Start\n { events: evt, update: \"[\" + vname + \"[0], clamp(\" + coord + \", 0, \" + size + \")]\" } // Brush End\n );\n });\n // React to pan/zooms of continuous scales. Non-continuous scales\n // (bin-linear, band, point) cannot be pan/zoomed and any other changes\n // to their domains (e.g., filtering) should clear the brushes.\n on.push({\n events: { signal: selCmpt.name + exports.SCALE_TRIGGER },\n update: scale_1.hasContinuousDomain(scaleType) && !scale_1.isBinScale(scaleType) ?\n \"[scale(\" + scaleStr + \", \" + dname + \"[0]), scale(\" + scaleStr + \", \" + dname + \"[1])]\" : \"[0, 0]\"\n });\n return hasScales ? [{ name: dname, on: [] }] : [{\n name: vname, value: [], on: on\n }, {\n name: dname,\n on: [{ events: { signal: vname }, update: vname + \"[0] === \" + vname + \"[1] ? null : invert(\" + scaleStr + \", \" + vname + \")\" }]\n }];\n}\nfunction events(selCmpt, cb) {\n return selCmpt.events.reduce(function (on, evt) {\n if (!evt.between) {\n log_1.warn(evt + \" is not an ordered event stream for interval selections\");\n return on;\n }\n return cb(on, evt);\n }, []);\n}\n\n\n/***/ }),\n/* 157 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************************************!*\\\n !*** ./~/vega-lite/build/src/compile/selection/transforms/nearest.js ***!\n \\***********************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar selection_1 = __webpack_require__(/*! ../selection */ 22);\nvar VORONOI = 'voronoi';\nvar nearest = {\n has: function (selCmpt) {\n return selCmpt.type !== 'interval' && selCmpt.nearest;\n },\n marks: function (model, selCmpt, marks, selMarks) {\n var _a = selection_1.spatialProjections(selCmpt), x = _a.x, y = _a.y;\n var mark = marks[0];\n var index = selMarks.indexOf(mark);\n var isPathgroup = mark.name === model.getName('pathgroup');\n var exists = (function (m) { return m.name && m.name.indexOf(VORONOI) >= 0; });\n var cellDef = {\n name: model.getName(VORONOI),\n type: 'path',\n from: { data: model.getName('marks') },\n encode: {\n enter: {\n fill: { value: 'transparent' },\n strokeWidth: { value: 0.35 },\n stroke: { value: 'transparent' },\n isVoronoi: { value: true }\n }\n },\n transform: [{\n type: 'voronoi',\n x: (x || (!x && !y)) ? 'datum.x' : { expr: '0' },\n y: (y || (!x && !y)) ? 'datum.y' : { expr: '0' },\n size: [model.getSizeSignalRef('width'), model.getSizeSignalRef('height')]\n }]\n };\n if (isPathgroup && !mark.marks.filter(exists).length) {\n mark.marks.push(cellDef);\n selMarks.splice(index, 1, mark);\n }\n else if (!isPathgroup && !selMarks.filter(exists).length) {\n selMarks.splice(index + 1, 0, cellDef);\n }\n return selMarks;\n }\n};\nexports.default = nearest;\n\n\n/***/ }),\n/* 158 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************!*\\\n !*** ./~/vega-lite/build/src/legend.js ***!\n \\*****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultLegendConfig = {};\nexports.LEGEND_PROPERTIES = ['entryPadding', 'format', 'offset', 'orient', 'tickCount', 'title', 'type', 'values', 'zindex'];\nexports.VG_LEGEND_PROPERTIES = [].concat(['fill', 'stroke', 'shape', 'size', 'opacity', 'encode'], exports.LEGEND_PROPERTIES);\n\n\n/***/ }),\n/* 159 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************************!*\\\n !*** ./~/vega-lite/build/src/logical.js ***!\n \\******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isLogicalOr(op) {\n return !!op.or;\n}\nexports.isLogicalOr = isLogicalOr;\nfunction isLogicalAnd(op) {\n return !!op.and;\n}\nexports.isLogicalAnd = isLogicalAnd;\nfunction isLogicalNot(op) {\n return !!op.not;\n}\nexports.isLogicalNot = isLogicalNot;\nfunction forEachLeave(op, fn) {\n if (isLogicalNot(op)) {\n forEachLeave(op.not, fn);\n }\n else if (isLogicalAnd(op)) {\n for (var _i = 0, _a = op.and; _i < _a.length; _i++) {\n var subop = _a[_i];\n forEachLeave(subop, fn);\n }\n }\n else if (isLogicalOr(op)) {\n for (var _b = 0, _c = op.or; _b < _c.length; _b++) {\n var subop = _c[_b];\n forEachLeave(subop, fn);\n }\n }\n else {\n fn(op);\n }\n}\nexports.forEachLeave = forEachLeave;\nfunction normalizeLogicalOperand(op, normalizer) {\n if (isLogicalNot(op)) {\n return { not: normalizeLogicalOperand(op.not, normalizer) };\n }\n else if (isLogicalAnd(op)) {\n return { and: op.and.map(function (o) { return normalizeLogicalOperand(o, normalizer); }) };\n }\n else if (isLogicalOr(op)) {\n return { or: op.or.map(function (o) { return normalizeLogicalOperand(o, normalizer); }) };\n }\n else {\n return normalizer(op);\n }\n}\nexports.normalizeLogicalOperand = normalizeLogicalOperand;\n\n\n/***/ }),\n/* 160 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************!*\\\n !*** ./~/vega-lite/build/src/transform.js ***!\n \\********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar filter_1 = __webpack_require__(/*! ./filter */ 109);\nvar logical_1 = __webpack_require__(/*! ./logical */ 159);\nfunction isFilter(t) {\n return t['filter'] !== undefined;\n}\nexports.isFilter = isFilter;\nfunction isLookup(t) {\n return t['lookup'] !== undefined;\n}\nexports.isLookup = isLookup;\nfunction isCalculate(t) {\n return t['calculate'] !== undefined;\n}\nexports.isCalculate = isCalculate;\nfunction isBin(t) {\n return !!t['bin'];\n}\nexports.isBin = isBin;\nfunction isTimeUnit(t) {\n return t['timeUnit'] !== undefined;\n}\nexports.isTimeUnit = isTimeUnit;\nfunction isSummarize(t) {\n return t['summarize'] !== undefined;\n}\nexports.isSummarize = isSummarize;\nfunction normalizeTransform(transform) {\n return transform.map(function (t) {\n if (isFilter(t)) {\n return {\n filter: logical_1.normalizeLogicalOperand(t.filter, filter_1.normalizeFilter)\n };\n }\n return t;\n });\n}\nexports.normalizeTransform = normalizeTransform;\n\n\n/***/ }),\n/* 161 */\n/* exports provided: default */\n/* exports used: default */\n/*!**********************************************!*\\\n !*** ./~/vega-lite/~/vega-util/src/array.js ***!\n \\**********************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__isArray__ = __webpack_require__(/*! ./isArray */ 162);\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function(_) {\n return _ != null ? (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__isArray__[\"a\" /* default */])(_) ? _ : [_]) : [];\n});\n\n\n/***/ }),\n/* 162 */\n/* exports provided: default */\n/* exports used: default */\n/*!************************************************!*\\\n !*** ./~/vega-lite/~/vega-util/src/isArray.js ***!\n \\************************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = (Array.isArray);\n\n\n/***/ }),\n/* 163 */\n/* exports provided: default */\n/* exports used: default */\n/*!***************************************************!*\\\n !*** ./~/vega-lite/~/vega-util/src/isFunction.js ***!\n \\***************************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = (function(_) {\n return typeof _ === 'function';\n});\n\n\n/***/ }),\n/* 164 */\n/* exports provided: accessor, accessorName, accessorFields, id, identity, zero, one, truthy, falsy, logger, None, Warn, Info, Debug, array, compare, constant, debounce, error, extend, extentIndex, fastmap, field, inherits, isArray, isBoolean, isDate, isFunction, isNumber, isObject, isRegExp, isString, key, merge, pad, peek, repeat, splitAccessPath, stringValue, toBoolean, toDate, toNumber, toString, toSet, truncate, visitArray */\n/* all exports used */\n/*!******************************!*\\\n !*** ./~/vega-util/index.js ***!\n \\******************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_accessor__ = __webpack_require__(/*! ./src/accessor */ 88);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"accessor\", function() { return __WEBPACK_IMPORTED_MODULE_0__src_accessor__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"accessorName\", function() { return __WEBPACK_IMPORTED_MODULE_0__src_accessor__[\"b\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"accessorFields\", function() { return __WEBPACK_IMPORTED_MODULE_0__src_accessor__[\"c\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_accessors__ = __webpack_require__(/*! ./src/accessors */ 655);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"id\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"identity\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"b\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"zero\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"c\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"one\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"d\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"truthy\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"e\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"falsy\", function() { return __WEBPACK_IMPORTED_MODULE_1__src_accessors__[\"f\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_logger__ = __webpack_require__(/*! ./src/logger */ 666);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"logger\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"None\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"b\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Warn\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"c\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Info\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"d\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Debug\", function() { return __WEBPACK_IMPORTED_MODULE_2__src_logger__[\"e\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_array__ = __webpack_require__(/*! ./src/array */ 165);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"array\", function() { return __WEBPACK_IMPORTED_MODULE_3__src_array__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_compare__ = __webpack_require__(/*! ./src/compare */ 656);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"compare\", function() { return __WEBPACK_IMPORTED_MODULE_4__src_compare__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_constant__ = __webpack_require__(/*! ./src/constant */ 657);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"constant\", function() { return __WEBPACK_IMPORTED_MODULE_5__src_constant__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_debounce__ = __webpack_require__(/*! ./src/debounce */ 658);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"debounce\", function() { return __WEBPACK_IMPORTED_MODULE_6__src_debounce__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_error__ = __webpack_require__(/*! ./src/error */ 247);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"error\", function() { return __WEBPACK_IMPORTED_MODULE_7__src_error__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_extend__ = __webpack_require__(/*! ./src/extend */ 659);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"extend\", function() { return __WEBPACK_IMPORTED_MODULE_8__src_extend__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_extentIndex__ = __webpack_require__(/*! ./src/extentIndex */ 660);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"extentIndex\", function() { return __WEBPACK_IMPORTED_MODULE_9__src_extentIndex__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_fastmap__ = __webpack_require__(/*! ./src/fastmap */ 661);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"fastmap\", function() { return __WEBPACK_IMPORTED_MODULE_10__src_fastmap__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__src_field__ = __webpack_require__(/*! ./src/field */ 248);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"field\", function() { return __WEBPACK_IMPORTED_MODULE_11__src_field__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__src_inherits__ = __webpack_require__(/*! ./src/inherits */ 662);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"inherits\", function() { return __WEBPACK_IMPORTED_MODULE_12__src_inherits__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__src_isArray__ = __webpack_require__(/*! ./src/isArray */ 166);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isArray\", function() { return __WEBPACK_IMPORTED_MODULE_13__src_isArray__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__src_isBoolean__ = __webpack_require__(/*! ./src/isBoolean */ 663);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isBoolean\", function() { return __WEBPACK_IMPORTED_MODULE_14__src_isBoolean__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__src_isDate__ = __webpack_require__(/*! ./src/isDate */ 249);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isDate\", function() { return __WEBPACK_IMPORTED_MODULE_15__src_isDate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__src_isFunction__ = __webpack_require__(/*! ./src/isFunction */ 250);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isFunction\", function() { return __WEBPACK_IMPORTED_MODULE_16__src_isFunction__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__src_isNumber__ = __webpack_require__(/*! ./src/isNumber */ 251);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isNumber\", function() { return __WEBPACK_IMPORTED_MODULE_17__src_isNumber__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__src_isObject__ = __webpack_require__(/*! ./src/isObject */ 252);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isObject\", function() { return __WEBPACK_IMPORTED_MODULE_18__src_isObject__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__src_isRegExp__ = __webpack_require__(/*! ./src/isRegExp */ 664);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isRegExp\", function() { return __WEBPACK_IMPORTED_MODULE_19__src_isRegExp__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__src_isString__ = __webpack_require__(/*! ./src/isString */ 253);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isString\", function() { return __WEBPACK_IMPORTED_MODULE_20__src_isString__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__src_key__ = __webpack_require__(/*! ./src/key */ 665);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"key\", function() { return __WEBPACK_IMPORTED_MODULE_21__src_key__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__src_merge__ = __webpack_require__(/*! ./src/merge */ 667);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"merge\", function() { return __WEBPACK_IMPORTED_MODULE_22__src_merge__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__src_pad__ = __webpack_require__(/*! ./src/pad */ 668);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"pad\", function() { return __WEBPACK_IMPORTED_MODULE_23__src_pad__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__src_peek__ = __webpack_require__(/*! ./src/peek */ 669);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"peek\", function() { return __WEBPACK_IMPORTED_MODULE_24__src_peek__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__src_repeat__ = __webpack_require__(/*! ./src/repeat */ 254);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"repeat\", function() { return __WEBPACK_IMPORTED_MODULE_25__src_repeat__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__src_splitAccessPath__ = __webpack_require__(/*! ./src/splitAccessPath */ 112);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"splitAccessPath\", function() { return __WEBPACK_IMPORTED_MODULE_26__src_splitAccessPath__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__src_stringValue__ = __webpack_require__(/*! ./src/stringValue */ 113);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"stringValue\", function() { return __WEBPACK_IMPORTED_MODULE_27__src_stringValue__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__src_toBoolean__ = __webpack_require__(/*! ./src/toBoolean */ 670);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toBoolean\", function() { return __WEBPACK_IMPORTED_MODULE_28__src_toBoolean__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__src_toDate__ = __webpack_require__(/*! ./src/toDate */ 671);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toDate\", function() { return __WEBPACK_IMPORTED_MODULE_29__src_toDate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__src_toNumber__ = __webpack_require__(/*! ./src/toNumber */ 672);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toNumber\", function() { return __WEBPACK_IMPORTED_MODULE_30__src_toNumber__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__src_toString__ = __webpack_require__(/*! ./src/toString */ 674);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toString\", function() { return __WEBPACK_IMPORTED_MODULE_31__src_toString__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__src_toSet__ = __webpack_require__(/*! ./src/toSet */ 673);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toSet\", function() { return __WEBPACK_IMPORTED_MODULE_32__src_toSet__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__src_truncate__ = __webpack_require__(/*! ./src/truncate */ 675);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"truncate\", function() { return __WEBPACK_IMPORTED_MODULE_33__src_truncate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__src_visitArray__ = __webpack_require__(/*! ./src/visitArray */ 676);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"visitArray\", function() { return __WEBPACK_IMPORTED_MODULE_34__src_visitArray__[\"a\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n/* 165 */\n/* exports provided: default */\n/* exports used: default */\n/*!**********************************!*\\\n !*** ./~/vega-util/src/array.js ***!\n \\**********************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__isArray__ = __webpack_require__(/*! ./isArray */ 166);\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function(_) {\n return _ != null ? (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__isArray__[\"a\" /* default */])(_) ? _ : [_]) : [];\n});\n\n\n/***/ }),\n/* 166 */\n/* exports provided: default */\n/* exports used: default */\n/*!************************************!*\\\n !*** ./~/vega-util/src/isArray.js ***!\n \\************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = (Array.isArray);\n\n\n/***/ }),\n/* 167 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************************!*\\\n !*** ./src/actions/custom-wildcard-field.ts ***!\n \\**********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CUSTOM_WILDCARD_ADD = 'CUSTOM_WILDCARD_ADD';\nexports.CUSTOM_WILDCARD_REMOVE = 'CUSTOM_WILDCARD_REMOVE';\nexports.CUSTOM_WILDCARD_ADD_FIELD = 'CUSTOM_WILDCARD_ADD_FIELD';\nexports.CUSTOM_WILDCARD_REMOVE_FIELD = 'CUSTOM_WILDCARD_REMOVE_FIELD';\nexports.CUSTOM_WILDCARD_MODIFY_DESCRIPTION = 'CUSTOM_WILDCARD_MODIFY_DESCRIPTION';\n\n\n/***/ }),\n/* 168 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************!*\\\n !*** ./src/actions/dataset.ts ***!\n \\********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar fetch = __webpack_require__(/*! isomorphic-fetch */ 208);\nvar redux_undo_1 = __webpack_require__(/*! redux-undo */ 174);\nvar data_1 = __webpack_require__(/*! vega-lite/build/src/data */ 55);\nvar api_1 = __webpack_require__(/*! ../api/api */ 259);\nvar selectors_1 = __webpack_require__(/*! ../selectors */ 12);\nvar reset_1 = __webpack_require__(/*! ./reset */ 117);\nexports.DATASET_SCHEMA_CHANGE_FIELD_TYPE = 'DATASET_SCHEMA_CHANGE_FIELD_TYPE';\nexports.DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN = 'DATASET_SCHEMA_CHANGE_ORDINAL_DOMAIN';\nexports.DATASET_REQUEST = 'DATASET_REQUEST';\nexports.DATASET_RECEIVE = 'DATASET_RECEIVE';\nfunction datasetLoad(name, data) {\n return function (dispatch, getState) {\n var config = selectors_1.selectConfig(getState());\n dispatch({ type: reset_1.RESET });\n dispatch({\n type: exports.DATASET_REQUEST,\n payload: { name: name }\n });\n // Get the new dataset\n if (data_1.isUrlData(data)) {\n return fetch(data.url)\n .then(function (response) { return response.json(); })\n .catch(errorCatch)\n .then(function (values) {\n return buildSchemaAndDispatchDataReceive({ values: values }, config, dispatch, name);\n });\n }\n else if (data_1.isInlineData(data)) {\n return buildSchemaAndDispatchDataReceive(data, config, dispatch, name);\n }\n else {\n throw new Error('dataset load error: dataset type not detected');\n }\n };\n}\nexports.datasetLoad = datasetLoad;\n;\nfunction buildSchemaAndDispatchDataReceive(data, config, dispatch, name) {\n return api_1.fetchCompassQLBuildSchema(data.values, config)\n .catch(errorCatch)\n .then(function (schema) {\n dispatch({\n type: exports.DATASET_RECEIVE,\n payload: { name: name, schema: schema, data: data }\n });\n dispatch(redux_undo_1.ActionCreators.clearHistory());\n });\n}\nfunction errorCatch(err) {\n window.alert(err.message);\n}\n\n\n/***/ }),\n/* 169 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************!*\\\n !*** ./src/components/plot/index.tsx ***!\n \\***************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar React = __webpack_require__(/*! react */ 0);\nvar CopyToClipboard = __webpack_require__(/*! react-copy-to-clipboard */ 507);\nvar CSSModules = __webpack_require__(/*! react-css-modules */ 8);\nvar TetherComponent = __webpack_require__(/*! react-tether */ 94);\nvar fielddef_1 = __webpack_require__(/*! vega-lite/build/src/fielddef */ 9);\nvar bookmark_1 = __webpack_require__(/*! ../../actions/bookmark */ 115);\nvar shelf_1 = __webpack_require__(/*! ../../actions/shelf */ 20);\nvar shelf_preview_1 = __webpack_require__(/*! ../../actions/shelf-preview */ 92);\nvar constants_1 = __webpack_require__(/*! ../../constants */ 39);\nvar filter_1 = __webpack_require__(/*! ../../models/shelf/filter */ 46);\nvar index_1 = __webpack_require__(/*! ../field/index */ 118);\nvar util_logger_1 = __webpack_require__(/*! ../util/util.logger */ 700);\nvar index_2 = __webpack_require__(/*! ../vega-lite/index */ 701);\nvar bookmarkbutton_1 = __webpack_require__(/*! ./bookmarkbutton */ 699);\nvar styles = __webpack_require__(/*! ./plot.scss */ 304);\nvar PlotBase = (function (_super) {\n __extends(PlotBase, _super);\n function PlotBase(props) {\n var _this = _super.call(this, props) || this;\n _this.vegaLiteWrapperRefHandler = function (ref) {\n _this.vegaLiteWrapper = ref;\n };\n _this.state = {\n hovered: false,\n preview: false,\n copiedPopupIsOpened: false\n };\n // Bind - https://facebook.github.io/react/docs/handling-events.html\n _this.handleTextChange = _this.handleTextChange.bind(_this);\n _this.onMouseEnter = _this.onMouseEnter.bind(_this);\n _this.onMouseLeave = _this.onMouseLeave.bind(_this);\n _this.onPreviewMouseEnter = _this.onPreviewMouseEnter.bind(_this);\n _this.onPreviewMouseLeave = _this.onPreviewMouseLeave.bind(_this);\n _this.onSpecify = _this.onSpecify.bind(_this);\n _this.onSort = _this.onSort.bind(_this);\n _this.plotLogger = new util_logger_1.Logger(props.handleAction);\n return _this;\n }\n PlotBase.prototype.componentDidUpdate = function (prevProps, prevState) {\n // We have to check this here since we do not know if it is vertically overflown\n // during render time.\n if (!this.isVerticallyOverFlown(this.vegaLiteWrapper) && this.state.hovered) {\n // add a padding similar to .plot\n this.vegaLiteWrapper.style.paddingRight = '11px';\n }\n else {\n // reset state otherwise, so we clean up what we add in the case above.\n delete this.vegaLiteWrapper.style.paddingRight;\n }\n };\n PlotBase.prototype.render = function () {\n var _a = this.props, isPlotListItem = _a.isPlotListItem, onSort = _a.onSort, showBookmarkButton = _a.showBookmarkButton, showSpecifyButton = _a.showSpecifyButton, spec = _a.spec, data = _a.data;\n var notesDiv;\n var specKey = JSON.stringify(spec);\n if (this.props.bookmark.dict[specKey]) {\n notesDiv = (React.createElement(\"textarea\", { styleName: 'note', type: 'text', placeholder: 'notes', value: this.props.bookmark.dict[specKey].note, onChange: this.handleTextChange }));\n }\n return (React.createElement(\"div\", { styleName: isPlotListItem ? 'plot-list-item-group' : 'plot-group' },\n React.createElement(\"div\", { styleName: \"plot-info\" },\n React.createElement(\"div\", { styleName: \"command-toolbox\" },\n onSort && this.renderSortButton('x'),\n onSort && this.renderSortButton('y'),\n showBookmarkButton && this.renderBookmarkButton(),\n showSpecifyButton && this.renderSpecifyButton(),\n React.createElement(\"span\", { styleName: 'command' },\n React.createElement(TetherComponent, { attachment: 'bottom left', offset: '0px 30px' },\n this.renderCopySpecButton(),\n this.state.copiedPopupIsOpened && React.createElement(\"span\", { styleName: 'copied' }, \"copied\")))),\n React.createElement(\"span\", { onMouseEnter: this.onPreviewMouseEnter, onMouseLeave: this.onPreviewMouseLeave }, this.renderFields())),\n React.createElement(\"div\", { ref: this.vegaLiteWrapperRefHandler, styleName: this.state.hovered ? 'plot-scroll' : 'plot', className: \"persist-scroll\", onMouseEnter: this.onMouseEnter, onMouseLeave: this.onMouseLeave },\n React.createElement(index_2.VegaLite, { spec: spec, logger: this.plotLogger, data: data })),\n notesDiv));\n };\n PlotBase.prototype.componentWillUnmount = function () {\n this.clearHoverTimeout();\n };\n PlotBase.prototype.renderFields = function () {\n var fieldInfos = this.props.fieldInfos;\n if (fieldInfos) {\n return fieldInfos.map(function (fieldInfo) {\n var fieldDef = fieldInfo.fieldDef, isEnumeratedWildcardField = fieldInfo.isEnumeratedWildcardField;\n return (React.createElement(\"div\", { styleName: \"plot-field-info\", key: JSON.stringify(fieldDef) },\n React.createElement(index_1.Field, { fieldDef: fieldDef, caretShow: false, draggable: false, isEnumeratedWildcardField: isEnumeratedWildcardField, isPill: false })));\n });\n }\n return undefined;\n };\n PlotBase.prototype.clearHoverTimeout = function () {\n if (this.hoverTimeoutId) {\n clearTimeout(this.hoverTimeoutId);\n this.hoverTimeoutId = undefined;\n }\n };\n PlotBase.prototype.clearPreviewTimeout = function () {\n if (this.previewTimeoutId) {\n clearTimeout(this.previewTimeoutId);\n this.previewTimeoutId = undefined;\n }\n };\n PlotBase.prototype.onMouseEnter = function () {\n var _this = this;\n this.hoverTimeoutId = window.setTimeout(function () {\n // TODO log action\n _this.setState({ hovered: true });\n _this.hoverTimeoutId = undefined;\n }, constants_1.PLOT_HOVER_MIN_DURATION);\n };\n PlotBase.prototype.onMouseLeave = function () {\n this.clearHoverTimeout();\n if (this.state.hovered) {\n this.setState({ hovered: false });\n }\n };\n PlotBase.prototype.onSort = function (channel) {\n // TODO: really take `sort` as input instead of toggling like this\n var _a = this.props, spec = _a.spec, onSort = _a.onSort;\n var channelDef = spec.encoding[channel];\n if (fielddef_1.isFieldDef(channelDef)) {\n var sort = channelDef.sort === 'descending' ? undefined : 'descending';\n onSort(channel, sort);\n }\n };\n PlotBase.prototype.onSpecify = function () {\n if (this.props.closeModal) {\n this.props.closeModal();\n }\n this.onPreviewMouseLeave();\n var _a = this.props, handleAction = _a.handleAction, spec = _a.spec;\n handleAction({\n type: shelf_1.SPEC_LOAD,\n payload: { spec: spec, keepWildcardMark: true }\n });\n };\n PlotBase.prototype.onPreviewMouseEnter = function () {\n var _this = this;\n this.previewTimeoutId = window.setTimeout(function () {\n var _a = _this.props, handleAction = _a.handleAction, spec = _a.spec;\n _this.setState({ preview: true });\n handleAction({\n type: shelf_preview_1.SHELF_PREVIEW_SPEC,\n payload: { spec: spec }\n });\n _this.previewTimeoutId = undefined;\n }, constants_1.PLOT_HOVER_MIN_DURATION);\n };\n PlotBase.prototype.onPreviewMouseLeave = function () {\n this.clearPreviewTimeout();\n if (this.state.preview) {\n this.setState({ preview: false });\n var handleAction = this.props.handleAction;\n handleAction({ type: shelf_preview_1.SHELF_PREVIEW_DISABLE });\n }\n };\n PlotBase.prototype.renderSortButton = function (channel) {\n var spec = this.props.spec;\n var channelDef = spec.encoding[channel];\n if (fielddef_1.isFieldDef(channelDef) && fielddef_1.isDiscrete(channelDef)) {\n return React.createElement(\"i\", { title: 'Sort', className: \"fa fa-sort-alpha-asc\", styleName: channel === 'x' ? 'sort-x-command' : 'command', onClick: this.onSort.bind(this, channel) });\n }\n return undefined;\n };\n PlotBase.prototype.renderSpecifyButton = function () {\n return React.createElement(\"i\", { title: 'Specify', className: \"fa fa-server\", styleName: \"specify-command\", onClick: this.onSpecify, onMouseEnter: this.onPreviewMouseEnter, onMouseLeave: this.onPreviewMouseLeave });\n };\n PlotBase.prototype.renderBookmarkButton = function () {\n var plot = {\n fieldInfos: this.props.fieldInfos,\n spec: this.specWithFilter\n };\n return (React.createElement(bookmarkbutton_1.BookmarkButton, { bookmark: this.props.bookmark, plot: plot, handleAction: this.props.handleAction }));\n };\n PlotBase.prototype.handleTextChange = function (event) {\n var handleAction = this.props.handleAction;\n handleAction({\n type: bookmark_1.BOOKMARK_MODIFY_NOTE,\n payload: {\n note: event.target.value,\n spec: this.props.spec\n }\n });\n };\n Object.defineProperty(PlotBase.prototype, \"specWithFilter\", {\n get: function () {\n var _a = this.props, spec = _a.spec, filters = _a.filters;\n var transform = (spec.transform || []).concat(filter_1.toTransforms(filters));\n return __assign({}, spec, (transform.length > 0 ? { transform: transform } : {}));\n },\n enumerable: true,\n configurable: true\n });\n PlotBase.prototype.renderCopySpecButton = function () {\n // TODO: spec would only contain NamedData, but not the actual data.\n // Need to augment spec.data\n // TODO instead of pre-generating a text for the copy button, which\n // takes a lot of memory for each plot\n // Can only generate the text only when the button is clicked?\n return (React.createElement(CopyToClipboard, { onCopy: this.copied.bind(this), text: JSON.stringify(this.specWithFilter, null, 2) },\n React.createElement(\"i\", { title: 'Copy', className: 'fa fa-clipboard' })));\n };\n PlotBase.prototype.copied = function () {\n var _this = this;\n this.setState({\n copiedPopupIsOpened: true\n });\n window.setTimeout(function () {\n _this.setState({\n copiedPopupIsOpened: false\n });\n }, 1000);\n };\n PlotBase.prototype.isVerticallyOverFlown = function (element) {\n return element.scrollHeight > element.clientHeight;\n };\n return PlotBase;\n}(React.PureComponent));\nexports.PlotBase = PlotBase;\nexports.Plot = CSSModules(PlotBase, styles);\n\n\n/***/ }),\n/* 170 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./src/models/shelf/spec/encoding.ts ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\n t[p[i]] = s[p[i]];\n return t;\n};\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar encoding_1 = __webpack_require__(/*! compassql/build/src/query/encoding */ 14);\nvar wildcard_1 = __webpack_require__(/*! compassql/build/src/wildcard */ 6);\nvar util_1 = __webpack_require__(/*! vega-lite/build/src/util */ 2);\nvar function_1 = __webpack_require__(/*! ./function */ 171);\n__export(__webpack_require__(/*! ./function */ 171));\n;\n;\nfunction isWildcardChannelId(shelfId) {\n return wildcard_1.isWildcard(shelfId.channel);\n}\nexports.isWildcardChannelId = isWildcardChannelId;\nfunction fromEncodingQueries(encodings) {\n return encodings.reduce(function (encodingMixins, encQ) {\n if (wildcard_1.isWildcard(encQ.channel)) {\n encodingMixins.anyEncodings.push(__assign({ channel: encQ.channel }, fromEncodingQuery(encQ)));\n }\n else {\n encodingMixins.encoding[encQ.channel] = fromEncodingQuery(encQ);\n }\n return encodingMixins;\n }, { encoding: {}, anyEncodings: [] });\n}\nexports.fromEncodingQueries = fromEncodingQueries;\nfunction fromEncodingQuery(encQ) {\n if (encoding_1.isFieldQuery(encQ)) {\n return fromFieldQuery(encQ);\n }\n else if (encoding_1.isAutoCountQuery(encQ)) {\n throw Error('AutoCount Query not yet supported');\n }\n else {\n throw Error('Value Query not yet supported');\n }\n}\nexports.fromEncodingQuery = fromEncodingQuery;\nfunction toEncodingQuery(fieldDef, channel) {\n return toFieldQuery(fieldDef, channel);\n}\nexports.toEncodingQuery = toEncodingQuery;\nfunction toFieldQuery(fieldDef, channel) {\n var fn = fieldDef.fn, fieldDefWithoutFn = __rest(fieldDef, [\"fn\"]);\n return __assign({ channel: channel }, function_1.toFieldQueryFunctionMixins(fn), fieldDefWithoutFn);\n}\nexports.toFieldQuery = toFieldQuery;\nfunction fromFieldQuery(fieldQ) {\n var aggregate = fieldQ.aggregate, bin = fieldQ.bin, hasFn = fieldQ.hasFn, timeUnit = fieldQ.timeUnit, field = fieldQ.field, scale = fieldQ.scale, axis = fieldQ.axis, legend = fieldQ.legend, sort = fieldQ.sort, description = fieldQ.description;\n var type = fieldQ.type;\n if (wildcard_1.isWildcard(type)) {\n throw Error('Voyager does not support wildcard type');\n }\n else if (type === 'ordinal') {\n console.warn('Voyager does not support ordinal type yet, converting to nominal');\n type = 'nominal';\n }\n var fn = function_1.fromFieldQueryFunctionMixins({ aggregate: aggregate, bin: bin, timeUnit: timeUnit, hasFn: hasFn });\n return __assign({}, (fn ? { fn: fn } : {}), { field: field, \n // Need to cast as TS2.3 isn't smart about this.\n // Upgrading to TS2.4 would solve this issue but creates other issues instead.\n type: type }, (sort ? { sort: sort } : {}), (scale ? { scale: fromFieldQueryNestedProp(fieldQ, 'scale') } : {}), (axis ? { axis: fromFieldQueryNestedProp(fieldQ, 'axis') } : {}), (legend ? { legend: fromFieldQueryNestedProp(fieldQ, 'legend') } : {}), (description ? { description: description } : {}));\n}\nexports.fromFieldQuery = fromFieldQuery;\nfunction fromFieldQueryNestedProp(fieldQ, prop) {\n var propQ = fieldQ[prop];\n if (!propQ) {\n return undefined;\n }\n else if (wildcard_1.isWildcard(propQ)) {\n throw Error(\"Voyager does not support wildcard \" + prop);\n }\n else if (util_1.isBoolean(propQ)) {\n throw Error(\"Voyager does not support boolean \" + prop);\n }\n else {\n Object.keys(propQ).forEach(function (nestedProp) {\n if (wildcard_1.isWildcard(propQ[nestedProp])) {\n throw Error(\"Voyager does not support wildcard \" + prop + \" \" + nestedProp);\n }\n });\n }\n // We already catch all the unsupported types above so here we can just cast\n return propQ;\n}\nexports.fromFieldQueryNestedProp = fromFieldQueryNestedProp;\n\n\n/***/ }),\n/* 171 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./src/models/shelf/spec/function.ts ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar config_1 = __webpack_require__(/*! compassql/build/src/config */ 69);\nvar wildcard_1 = __webpack_require__(/*! compassql/build/src/wildcard */ 6);\nvar aggregate_1 = __webpack_require__(/*! vega-lite/build/src/aggregate */ 62);\nvar timeunit_1 = __webpack_require__(/*! vega-lite/build/src/timeunit */ 23);\nvar util_1 = __webpack_require__(/*! vega-lite/build/src/util */ 2);\nvar QUANTITATIVE_FUNCTIONS = [\n undefined, 'bin',\n 'min', 'max',\n 'mean', 'median',\n 'sum'\n];\nvar TEMPORAL_FUNCTIONS = [\n undefined,\n 'yearmonthdate',\n 'year', 'month',\n 'date', 'day',\n 'hours', 'minutes',\n 'seconds', 'milliseconds'\n];\nvar FUNCTIONS_INDEX = __assign({}, QUANTITATIVE_FUNCTIONS.reduce(function (index, fn, i) {\n index[fn] = i;\n return index;\n}, {}), TEMPORAL_FUNCTIONS.reduce(function (index, fn, i) {\n index[fn] = i;\n return index;\n}, {}));\nfunction getSupportedFunction(type) {\n switch (type) {\n case 'quantitative':\n return QUANTITATIVE_FUNCTIONS;\n case 'temporal':\n return TEMPORAL_FUNCTIONS;\n }\n return [];\n}\nexports.getSupportedFunction = getSupportedFunction;\nfunction isShelfFunction(fn) {\n return fn === 'bin' ||\n fn === undefined || fn === null ||\n aggregate_1.isAggregateOp(fn) || timeunit_1.isTimeUnit(fn);\n}\nexports.isShelfFunction = isShelfFunction;\nfunction toFieldQueryFunctionMixins(fn) {\n if (wildcard_1.isWildcard(fn)) {\n var fns = sortFunctions(fn.enum); // sort a new copy of the array\n var aggregates = [];\n var timeUnits = [];\n var hasBin = false;\n var hasNoFn = false;\n for (var _i = 0, fns_1 = fns; _i < fns_1.length; _i++) {\n var f = fns_1[_i];\n if (aggregate_1.isAggregateOp(f)) {\n aggregates.push(f);\n }\n else if (timeunit_1.isTimeUnit(f)) {\n timeUnits.push(f);\n }\n else if (f === 'bin') {\n hasBin = true;\n }\n else if (f === undefined || f === null) {\n // Check for null just in case things get copied\n hasNoFn = true;\n }\n else {\n throw new Error('Invalid function ' + f);\n }\n }\n var functionTypeCount = (aggregates.length > 0 ? 1 : 0) +\n (timeUnits.length > 0 ? 1 : 0) +\n (hasBin ? 1 : 0);\n var enumerateUndefined = functionTypeCount > 1 || hasNoFn;\n var baseEnum = enumerateUndefined ? [undefined] : [];\n var hasFn = !hasNoFn;\n var mixins = __assign({}, (aggregates.length > 0 ? {\n aggregate: { enum: [].concat(baseEnum, aggregates) }\n } : {}), (timeUnits.length > 0 ? {\n timeUnit: { enum: [].concat(baseEnum, timeUnits) }\n } : {}), (hasBin ? {\n bin: {\n enum: (enumerateUndefined ? [false] : []).concat([true])\n // TODO: deal with bin params\n }\n } : {}), (hasFn ? { hasFn: hasFn } : {}));\n if (!mixins.aggregate && !mixins.timeUnit && !mixins.bin) {\n // For enum: [undefined], return this special mixins\n return {\n bin: {\n enum: [false]\n },\n timeUnit: {\n enum: [undefined]\n },\n aggregate: {\n enum: [undefined]\n }\n };\n }\n return mixins;\n }\n else if (aggregate_1.isAggregateOp(fn)) {\n return { aggregate: fn };\n }\n else if (fn === 'bin') {\n return { bin: true };\n }\n else if (timeunit_1.isTimeUnit(fn)) {\n return { timeUnit: fn };\n }\n return {};\n}\nexports.toFieldQueryFunctionMixins = toFieldQueryFunctionMixins;\nfunction excludeUndefined(fn) {\n if (!isShelfFunction) {\n console.warn(\"Invalid function \" + fn + \" dropped\");\n return false;\n }\n return fn !== undefined && fn !== null;\n}\nfunction fromFieldQueryFunctionMixins(fieldQParts) {\n // FIXME make this a parameter\n var config = config_1.DEFAULT_QUERY_CONFIG;\n var aggregate = fieldQParts.aggregate, bin = fieldQParts.bin, hasFn = fieldQParts.hasFn, timeUnit = fieldQParts.timeUnit;\n var fns = [];\n var fn;\n var hasUndefinedInEnum = false;\n if (bin) {\n if (wildcard_1.isWildcard(bin)) {\n var bins = wildcard_1.isShortWildcard(bin) ? [true, false] : bin.enum;\n fns = fns.concat(util_1.contains(bins, true) ? ['bin'] : []);\n hasUndefinedInEnum = hasUndefinedInEnum || util_1.contains(bins, false);\n }\n else if (bin) {\n fn = 'bin';\n }\n }\n if (aggregate) {\n if (wildcard_1.isWildcard(aggregate)) {\n var aggregates = wildcard_1.isShortWildcard(aggregate) ? config.enum.aggregate : aggregate.enum;\n fns = fns.concat(\n // We already filter composite aggregate function so it is fine to cast here\n // as the only thing left would be AggregateOp (but TS would not know that)\n aggregates.filter(excludeUndefined));\n hasUndefinedInEnum = hasUndefinedInEnum || util_1.contains(aggregates, undefined);\n }\n else if (!fn) {\n fn = aggregate;\n }\n else {\n throw Error(\"Invalid field with function \" + fn + \" and \" + aggregate);\n }\n }\n if (timeUnit) {\n if (wildcard_1.isWildcard(timeUnit)) {\n var timeUnits = wildcard_1.isShortWildcard(timeUnit) ? config.enum.timeUnit : timeUnit.enum;\n fns = fns.concat(timeUnits.filter(excludeUndefined));\n hasUndefinedInEnum = hasUndefinedInEnum || util_1.contains(timeUnits, undefined);\n }\n else if (!fn) {\n fn = timeUnit;\n }\n else {\n throw Error(\"Invalid field with function \" + fn + \" and \" + timeUnit);\n }\n }\n if (fn) {\n return fn;\n }\n if (hasUndefinedInEnum && !hasFn) {\n // prepend undefined\n fns.unshift(undefined);\n }\n if (fns.length > 0) {\n return { enum: sortFunctions(fns) };\n }\n return undefined;\n}\nexports.fromFieldQueryFunctionMixins = fromFieldQueryFunctionMixins;\nfunction sortFunctions(fns) {\n // Javascript array.sort() always put undefined value at the end.\n // So we have to convert them to null first and convert them back after sorting.\n // Convert undefined so they don't get pushed to the end\n return fns.map(function (f) { return f || null; })\n .sort(function (a, b) {\n if (a == null) {\n a = undefined;\n }\n if (b == null) {\n b = undefined;\n }\n return FUNCTIONS_INDEX[a] - FUNCTIONS_INDEX[b];\n })\n .map(function (f) { return f || undefined; });\n}\nexports.sortFunctions = sortFunctions;\n\n\n/***/ }),\n/* 172 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************!*\\\n !*** ./src/reducers/shelf/spec.ts ***!\n \\************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\n t[p[i]] = s[p[i]];\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar model_1 = __webpack_require__(/*! compassql/build/src/model */ 98);\nvar recommend_1 = __webpack_require__(/*! compassql/build/src/recommend */ 188);\nvar wildcard_1 = __webpack_require__(/*! compassql/build/src/wildcard */ 6);\nvar shelf_1 = __webpack_require__(/*! ../../actions/shelf */ 20);\nvar shelf_2 = __webpack_require__(/*! ../../actions/shelf */ 20);\nvar spec_1 = __webpack_require__(/*! ../../actions/shelf/spec */ 56);\nvar models_1 = __webpack_require__(/*! ../../models */ 36);\nvar shelf_3 = __webpack_require__(/*! ../../models/shelf */ 40);\nvar shelf_4 = __webpack_require__(/*! ../../models/shelf */ 40);\nvar spec_2 = __webpack_require__(/*! ../../models/shelf/spec */ 57);\nvar util_1 = __webpack_require__(/*! ../util */ 65);\nfunction shelfSpecFieldAutoAddReducer(shelfSpec, action, schema) {\n var fieldDef = action.payload.fieldDef;\n if (shelfSpec.anyEncodings.length > 0 || wildcard_1.isWildcard(fieldDef.field)) {\n // If there was an encoding shelf or if the field is a wildcard, just add to wildcard shelf\n return __assign({}, shelfSpec, { anyEncodings: shelfSpec.anyEncodings.concat([\n __assign({ channel: wildcard_1.SHORT_WILDCARD }, fieldDef)\n ]) });\n }\n else {\n // Otherwise, query for the best encoding if there is no wildcard channel\n var query = shelf_4.autoAddFieldQuery(shelfSpec, fieldDef);\n var rec = recommend_1.recommend(query, schema);\n var topSpecQuery = model_1.getTopSpecQueryItem(rec.result).specQuery;\n return __assign({}, spec_2.fromSpecQuery(topSpecQuery, shelfSpec.config), (wildcard_1.isWildcard(shelfSpec.mark) ? { mark: shelfSpec.mark } : {}));\n }\n}\nexports.shelfSpecFieldAutoAddReducer = shelfSpecFieldAutoAddReducer;\nfunction shelfSpecReducer(shelfSpec, action) {\n if (shelfSpec === void 0) { shelfSpec = spec_2.DEFAULT_SHELF_UNIT_SPEC; }\n switch (action.type) {\n case shelf_1.SPEC_CLEAR:\n return spec_2.DEFAULT_SHELF_UNIT_SPEC;\n case shelf_1.SPEC_MARK_CHANGE_TYPE: {\n var mark = action.payload;\n return __assign({}, shelfSpec, { mark: mark });\n }\n case shelf_1.SPEC_FIELD_ADD: {\n var _a = action.payload, shelfId = _a.shelfId, fieldDef = _a.fieldDef, replace = _a.replace;\n return addEncoding(shelfSpec, shelfId, fieldDef, replace);\n }\n case shelf_1.SPEC_FIELD_REMOVE:\n return removeEncoding(shelfSpec, action.payload).shelf;\n case shelf_1.SPEC_FIELD_MOVE: {\n var _b = action.payload, to = _b.to, from = _b.from;\n var _c = removeEncoding(shelfSpec, from), fieldDefFrom = _c.fieldDef, removedShelf1 = _c.shelf;\n var _d = removeEncoding(removedShelf1, to), fieldDefTo = _d.fieldDef, removedShelf2 = _d.shelf;\n var addedShelf1 = addEncoding(removedShelf2, to, fieldDefFrom, false);\n var addedShelf2 = addEncoding(addedShelf1, from, fieldDefTo, false);\n return addedShelf2;\n }\n case spec_1.SPEC_FIELD_PROP_CHANGE: {\n var _e = action.payload, shelfId = _e.shelfId, prop_1 = _e.prop, value_1 = _e.value;\n return modifyEncoding(shelfSpec, shelfId, function (fieldDef) {\n return modifyFieldProp(fieldDef, prop_1, value_1);\n });\n }\n case spec_1.SPEC_FIELD_NESTED_PROP_CHANGE: {\n var _f = action.payload, shelfId = _f.shelfId, prop_2 = _f.prop, nestedProp_1 = _f.nestedProp, value_2 = _f.value;\n return modifyEncoding(shelfSpec, shelfId, function (fieldDef) {\n return modifyNestedFieldProp(fieldDef, prop_2, nestedProp_1, value_2);\n });\n }\n case shelf_1.SPEC_FUNCTION_CHANGE: {\n var _g = action.payload, shelfId = _g.shelfId, fn_1 = _g.fn;\n return modifyEncoding(shelfSpec, shelfId, function (fieldDef) {\n return __assign({}, fieldDef, { fn: fn_1 });\n });\n }\n case shelf_2.SPEC_FUNCTION_ADD_WILDCARD: {\n var _h = action.payload, shelfId = _h.shelfId, fn_2 = _h.fn;\n return modifyEncoding(shelfSpec, shelfId, function (fieldDef) {\n var oldFn = fieldDef.fn, fieldDefWithoutFn = __rest(fieldDef, [\"fn\"]);\n return __assign({}, fieldDefWithoutFn, { fn: {\n enum: shelf_3.sortFunctions(oldFn['enum'].concat(fn_2))\n } });\n });\n }\n case shelf_2.SPEC_FUNCTION_DISABLE_WILDCARD: {\n var shelfId = action.payload.shelfId;\n return modifyEncoding(shelfSpec, shelfId, function (fieldDef) {\n var fn = fieldDef.fn, fieldDefWithoutFn = __rest(fieldDef, [\"fn\"]);\n if (wildcard_1.isWildcard(fn)) {\n return __assign({}, fieldDefWithoutFn, fn.enum.length > 0 ? { fn: fn.enum[0] } : {});\n }\n else {\n throw Error('fn must be a wildcard to disable wildcard');\n }\n });\n }\n case shelf_1.SPEC_FUNCTION_ENABLE_WILDCARD: {\n var shelfId = action.payload.shelfId;\n return modifyEncoding(shelfSpec, shelfId, function (fieldDef) {\n var fn = fieldDef.fn, fieldDefWithoutFn = __rest(fieldDef, [\"fn\"]);\n return __assign({}, fieldDefWithoutFn, { fn: {\n enum: [fn]\n } });\n });\n }\n case shelf_2.SPEC_FUNCTION_REMOVE_WILDCARD: {\n var _j = action.payload, shelfId = _j.shelfId, fn_3 = _j.fn;\n return modifyEncoding(shelfSpec, shelfId, function (fieldDef) {\n var oldFn = fieldDef.fn, fieldDefWithoutFn = __rest(fieldDef, [\"fn\"]);\n if (wildcard_1.isWildcard(oldFn)) {\n return __assign({}, fieldDefWithoutFn, { fn: {\n enum: oldFn.enum.filter(function (shelfFunc) { return shelfFunc !== fn_3; })\n } });\n }\n else {\n throw Error('fn must be a wildcard to remove a wildcard');\n }\n });\n }\n }\n return shelfSpec;\n}\nexports.shelfSpecReducer = shelfSpecReducer;\nfunction addEncoding(shelf, shelfId, fieldDef, replace) {\n if (!fieldDef) {\n return shelf;\n }\n else if (models_1.isWildcardChannelId(shelfId)) {\n var index = shelfId.index;\n if (replace && shelf.anyEncodings[index]) {\n return __assign({}, shelf, { anyEncodings: util_1.modifyItemInArray(shelf.anyEncodings, index, function () {\n return __assign({ channel: wildcard_1.SHORT_WILDCARD }, fieldDef);\n }) });\n }\n // insert between two pills (not replace!)\n return __assign({}, shelf, { anyEncodings: util_1.insertItemToArray(shelf.anyEncodings, index, __assign({ channel: wildcard_1.SHORT_WILDCARD }, fieldDef)) });\n }\n else {\n return __assign({}, shelf, { encoding: __assign({}, shelf.encoding, (_a = {}, _a[shelfId.channel] = fieldDef, _a)) });\n }\n var _a;\n}\nfunction modifyEncoding(shelf, shelfId, modifier) {\n if (models_1.isWildcardChannelId(shelfId)) {\n return __assign({}, shelf, { anyEncodings: util_1.modifyItemInArray(shelf.anyEncodings, shelfId.index, modifier) });\n }\n else {\n return __assign({}, shelf, { encoding: __assign({}, shelf.encoding, (_a = {}, _a[shelfId.channel] = modifier(shelf.encoding[shelfId.channel]), _a)) });\n }\n var _a;\n}\nfunction removeEncoding(shelf, shelfId) {\n if (models_1.isWildcardChannelId(shelfId)) {\n var index = shelfId.index;\n var _a = util_1.removeItemFromArray(shelf.anyEncodings, index), anyEncodings = _a.array, item = _a.item;\n if (item) {\n // Remove channel from the removed EncodingQuery if the removed shelf is not empty.\n var _ = item.channel, fieldDef = __rest(item, [\"channel\"]);\n return {\n fieldDef: fieldDef,\n shelf: __assign({}, shelf, { anyEncodings: anyEncodings })\n };\n }\n else {\n return {\n fieldDef: undefined,\n shelf: __assign({}, shelf, { anyEncodings: anyEncodings })\n };\n }\n }\n else {\n var _b = shelf.encoding, _c = shelfId.channel, fieldDef = _b[_c], encoding = __rest(_b, [typeof _c === \"symbol\" ? _c : _c + \"\"]);\n return {\n fieldDef: fieldDef,\n shelf: __assign({}, shelf, { encoding: encoding })\n };\n }\n}\nfunction modifyFieldProp(fieldDef, prop, value) {\n var _a = prop, _oldProp = fieldDef[_a], fieldDefWithoutProp = __rest(fieldDef, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n return __assign({}, fieldDefWithoutProp, (value !== undefined ? (_b = {}, _b[prop] = value, _b) : {}));\n var _b;\n}\nexports.modifyFieldProp = modifyFieldProp;\nfunction modifyNestedFieldProp(fieldDef, prop, nestedProp, value) {\n var _a = prop, oldParent = fieldDef[_a], fieldDefWithoutProp = __rest(fieldDef, [typeof _a === \"symbol\" ? _a : _a + \"\"]);\n var _b = oldParent || {}, _c = nestedProp, _oldValue = _b[_c], parentWithoutNestedProp = __rest(_b, [typeof _c === \"symbol\" ? _c : _c + \"\"]);\n var parent = __assign({}, parentWithoutNestedProp, (value !== undefined ? (_d = {}, _d[nestedProp] = value, _d) : {}));\n return __assign({}, fieldDefWithoutProp, (Object.keys(parent).length > 0 ? (_e = {}, _e[prop] = parent, _e) : {}));\n var _d, _e;\n}\nexports.modifyNestedFieldProp = modifyNestedFieldProp;\n\n\n/***/ }),\n/* 173 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************!*\\\n !*** ./src/selectors/tab.ts ***!\n \\******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar reselect_1 = __webpack_require__(/*! reselect */ 86);\n// tslint:enable:no-unused-variable\nexports.selectTab = function (state) { return state.undoable.present.tab; };\nexports.selectActiveTabID = reselect_1.createSelector(exports.selectTab, function (tab) { return tab.activeTabID; });\nexports.selectActiveTab = reselect_1.createSelector(exports.selectTab, exports.selectActiveTabID, function (tab, activeTabID) { return tab.list[activeTabID]; });\n\n\n/***/ }),\n/* 174 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************!*\\\n !*** external \"redux-undo\" ***!\n \\*****************************/\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_174__;\n\n/***/ }),\n/* 175 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************!*\\\n !*** ./src/store/index.ts ***!\n \\****************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:enable:no-unused-variable\nvar redux_1 = __webpack_require__(/*! redux */ 120);\nvar redux_action_log_1 = __webpack_require__(/*! redux-action-log */ 579);\nvar redux_logger_1 = __webpack_require__(/*! redux-logger */ 580);\nvar redux_thunk_1 = __webpack_require__(/*! redux-thunk */ 732);\nvar models_1 = __webpack_require__(/*! ../models */ 36);\nvar reducers_1 = __webpack_require__(/*! ../reducers */ 717);\nvar listener_1 = __webpack_require__(/*! ./listener */ 727);\nvar loggerMiddleware = redux_logger_1.createLogger({\n collapsed: true,\n level: 'debug'\n});\n// define which middleware to use depending on environment\nvar composeEnhancers = redux_1.compose;\nvar middleware = [redux_thunk_1.default];\n// when not in production enable redux tools and add logger middleware\nif (undefined !== 'production' && undefined !== 'test') {\n composeEnhancers =\n window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || redux_1.compose;\n middleware.push(loggerMiddleware);\n}\nfunction configureStore(initialState) {\n if (initialState === void 0) { initialState = models_1.DEFAULT_STATE; }\n exports.actionLogs = redux_action_log_1.createActionLog({ limit: null });\n var store = redux_1.createStore(reducers_1.rootReducer, initialState, composeEnhancers(redux_1.applyMiddleware.apply(void 0, middleware), exports.actionLogs.enhancer)\n // HACK: cast to any to supress typescript complaint\n );\n if (false) {\n // Enable webpack hot module replacement for reducers\n module.hot.accept('../reducers', function () {\n var nextRootReducer = require('../reducers').rootReducer;\n store.replaceReducer(nextRootReducer);\n });\n }\n store.subscribe(listener_1.createQueryListener(store));\n return store;\n}\nexports.configureStore = configureStore;\n\n\n/***/ }),\n/* 176 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/vega-lite/build/vega-lite-schema.json ***!\n \\*************************************************/\n/***/ (function(module, exports) {\n\nmodule.exports = {\n\t\"$ref\": \"#/definitions/TopLevelExtendedSpec\",\n\t\"$schema\": \"http://json-schema.org/draft-04/schema#\",\n\t\"definitions\": {\n\t\t\"Aggregate\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/AggregateOp\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"AggregateOp\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"argmax\",\n\t\t\t\t\"argmin\",\n\t\t\t\t\"average\",\n\t\t\t\t\"count\",\n\t\t\t\t\"distinct\",\n\t\t\t\t\"max\",\n\t\t\t\t\"mean\",\n\t\t\t\t\"median\",\n\t\t\t\t\"min\",\n\t\t\t\t\"missing\",\n\t\t\t\t\"q1\",\n\t\t\t\t\"q3\",\n\t\t\t\t\"ci0\",\n\t\t\t\t\"ci1\",\n\t\t\t\t\"stdev\",\n\t\t\t\t\"stdevp\",\n\t\t\t\t\"sum\",\n\t\t\t\t\"valid\",\n\t\t\t\t\"values\",\n\t\t\t\t\"variance\",\n\t\t\t\t\"variancep\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"Anchor\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"start\",\n\t\t\t\t\"middle\",\n\t\t\t\t\"end\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"AnyMark\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/Mark\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkDef\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"Axis\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"domain\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\\n\\n__Default value:__ `true`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"description\": \"The formatting pattern for labels. This is D3's [number format pattern](https://github.com/d3/d3-format#locale_format) for quantitative fields and D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format) for time field.\\n\\nSee the [format documentation](format.html) for more information.\\n\\n__Default value:__ derived from [numberFormat](config.html#format) config for quantitative fields and from [timeFormat](config.html#format) config for temporal fields.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"grid\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if grid lines should be included as part of the axis\\n\\n__Default value:__ `true` for [continuous scales](scale.html#continuous) that are not binned; otherwise, `false`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"labelAngle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the axis labels.\\n\\n__Default value:__ `-90` for nominal, ordinal, temporal, and binned fields; `0` otherwise.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": -360,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelOverlap\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"parity\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"greedy\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `\\\"parity\\\"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `\\\"greedy\\\"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes).\\n\\n__Default value:__ `true` for non-nominal fields with non-log scales; `\\\"greedy\\\"` for log scales; otherwise `false`.\"\n\t\t\t\t},\n\t\t\t\t\"labelPadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between axis and text labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labels\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if labels should be included as part of the axis.\\n\\n__Default value:__ `true`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"maxExtent\": {\n\t\t\t\t\t\"description\": \"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\\n\\n__Default value:__ `undefined`.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minExtent\": {\n\t\t\t\t\t\"description\": \"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\\n\\n__Default value:__ `30` for y-axis; `undefined` for x-axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"offset\": {\n\t\t\t\t\t\"description\": \"The offset, in pixels, by which to displace the axis from the edge of the enclosing group or data rectangle.\\n\\n__Default value:__ derived from the [axis config](config.html#facet-scale-config)'s `offset` (`0` by default)\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AxisOrient\",\n\t\t\t\t\t\"description\": \"The orientation of the axis. One of `\\\"top\\\"`, `\\\"bottom\\\"`, `\\\"left\\\"` or `\\\"right\\\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\\n\\n__Default value:__ `\\\"bottom\\\"` for x-axes and `\\\"left\\\"` for y-axes.\"\n\t\t\t\t},\n\t\t\t\t\"position\": {\n\t\t\t\t\t\"description\": \"The anchor position of the axis in pixels. For x-axis with top or bottom orientation, this sets the axis group x coordinate. For y-axis with left or right orientation, this sets the axis group y coordinate.\\n\\n__Default value__: `0`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tickCount\": {\n\t\t\t\t\t\"description\": \"A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \\\"nice\\\" (multiples of 2, 5, 10) and lie within the underlying scale's range.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tickSize\": {\n\t\t\t\t\t\"description\": \"The size in pixels of axis ticks.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"ticks\": {\n\t\t\t\t\t\"description\": \"Boolean value that determines whether the axis should include ticks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"description\": \"A title for the field.\\n\\n__Default value:__ derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has a function, the function is displayed as an all capped text with parentheses wrapping the field name (e.g., `\\\"SUM(field_name)\\\"`, `\\\"BIN(field_name)\\\"`, `\\\"YEAR(field_name)\\\"`). Otherwise, the title is simply the field name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleAlign\": {\n\t\t\t\t\t\"description\": \"Horizontal text alignment of axis titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleAngle\": {\n\t\t\t\t\t\"description\": \"Angle in degrees of axis titles.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleMaxLength\": {\n\t\t\t\t\t\"description\": \"Max length for axis title if the title is automatically generated from the field's description.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titlePadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between title and axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"values\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/DateTime\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Explicitly set the visible axis tick values.\"\n\t\t\t\t},\n\t\t\t\t\"zindex\": {\n\t\t\t\t\t\"description\": \"A non-positive integer indicating z-index of the axis.\\nIf zindex is 0, axes should be drawn behind all chart elements.\\nTo put them in front, use `\\\"zindex = 1\\\"`.\\n\\n__Default value:__ `1` (in front of the marks) for actual axis and `0` (behind the marks) for grids.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"AxisConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"bandPosition\": {\n\t\t\t\t\t\"description\": \"An interpolation fraction indicating where, for `band` scales, axis ticks should be positioned. A value of `0` places ticks at the left edge of their bands. A value of `0.5` places ticks in the middle of their bands.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"domain\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\\n\\n__Default value:__ `true`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"domainColor\": {\n\t\t\t\t\t\"description\": \"Color of axis domain line.\\n\\n__Default value:__ (none, using Vega default).\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"domainWidth\": {\n\t\t\t\t\t\"description\": \"Stroke width of axis domain line\\n\\n__Default value:__ (none, using Vega default).\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"grid\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if grid lines should be included as part of the axis\\n\\n__Default value:__ `true` for [continuous scales](scale.html#continuous) that are not binned; otherwise, `false`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"gridColor\": {\n\t\t\t\t\t\"description\": \"Color of gridlines.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"gridDash\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the grid dash array.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"gridOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity of grid (value between [0,1])\\n\\n__Default value:__ (`1` by default)\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gridWidth\": {\n\t\t\t\t\t\"description\": \"The grid width, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelAngle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the axis labels.\\n\\n__Default value:__ `-90` for nominal, ordinal, temporal, and binned fields; `0` otherwise.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": -360,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelColor\": {\n\t\t\t\t\t\"description\": \"The color of the tick label, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelFont\": {\n\t\t\t\t\t\"description\": \"The font of the tick label.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelFontSize\": {\n\t\t\t\t\t\"description\": \"The font size of the label, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelLimit\": {\n\t\t\t\t\t\"description\": \"Maximum allowed pixel width of axis tick labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelOverlap\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"parity\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"greedy\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `\\\"parity\\\"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `\\\"greedy\\\"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes).\\n\\n__Default value:__ `true` for non-nominal fields with non-log scales; `\\\"greedy\\\"` for log scales; otherwise `false`.\"\n\t\t\t\t},\n\t\t\t\t\"labelPadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between axis and text labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labels\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if labels should be included as part of the axis.\\n\\n__Default value:__ `true`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"maxExtent\": {\n\t\t\t\t\t\"description\": \"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\\n\\n__Default value:__ `undefined`.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minExtent\": {\n\t\t\t\t\t\"description\": \"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\\n\\n__Default value:__ `30` for y-axis; `undefined` for x-axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"shortTimeLabels\": {\n\t\t\t\t\t\"description\": \"Whether month names and weekday names should be abbreviated.\\n\\n__Default value:__ `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"tickColor\": {\n\t\t\t\t\t\"description\": \"The color of the axis's tick.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"tickRound\": {\n\t\t\t\t\t\"description\": \"Boolean flag indicating if pixel position values should be rounded to the nearest integer.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"tickSize\": {\n\t\t\t\t\t\"description\": \"The size in pixels of axis ticks.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tickWidth\": {\n\t\t\t\t\t\"description\": \"The width, in pixels, of ticks.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"ticks\": {\n\t\t\t\t\t\"description\": \"Boolean value that determines whether the axis should include ticks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"titleAlign\": {\n\t\t\t\t\t\"description\": \"Horizontal text alignment of axis titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleAngle\": {\n\t\t\t\t\t\"description\": \"Angle in degrees of axis titles.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleBaseline\": {\n\t\t\t\t\t\"description\": \"Vertical text baseline for axis titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleColor\": {\n\t\t\t\t\t\"description\": \"Color of the title, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleFont\": {\n\t\t\t\t\t\"description\": \"Font of the title. (e.g., `\\\"Helvetica Neue\\\"`).\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleFontSize\": {\n\t\t\t\t\t\"description\": \"Font size of the title.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleFontWeight\": {\n\t\t\t\t\t\"description\": \"Font weight of the title. (e.g., `\\\"bold\\\"`).\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"number\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"titleLimit\": {\n\t\t\t\t\t\"description\": \"Maximum allowed pixel width of axis titles.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleMaxLength\": {\n\t\t\t\t\t\"description\": \"Max length for axis title if the title is automatically generated from the field's description.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titlePadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between title and axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleX\": {\n\t\t\t\t\t\"description\": \"X-coordinate of the axis title relative to the axis group.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleY\": {\n\t\t\t\t\t\"description\": \"Y-coordinate of the axis title relative to the axis group.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"AxisConfigMixins\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"axis\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AxisConfig\",\n\t\t\t\t\t\"description\": \"Axis configuration, which determines default properties for all `x` and `y` [axes](axis.html). For a full list of axis configuration options, please see the [corresponding section of the axis documentation](axis.html#axis-config).\"\n\t\t\t\t},\n\t\t\t\t\"axisBand\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for axes with \\\"band\\\" scales.\"\n\t\t\t\t},\n\t\t\t\t\"axisBottom\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for x-axis along the bottom edge of the chart.\"\n\t\t\t\t},\n\t\t\t\t\"axisLeft\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for y-axis along the left edge of the chart.\"\n\t\t\t\t},\n\t\t\t\t\"axisRight\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for y-axis along the right edge of the chart.\"\n\t\t\t\t},\n\t\t\t\t\"axisTop\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for x-axis along the top edge of the chart.\"\n\t\t\t\t},\n\t\t\t\t\"axisX\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"X-axis specific config.\"\n\t\t\t\t},\n\t\t\t\t\"axisY\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Y-axis specific config.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"AxisOrient\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"top\",\n\t\t\t\t\"right\",\n\t\t\t\t\"left\",\n\t\t\t\t\"bottom\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"AxisResolveMap\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"x\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"y\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BarConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"align\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/HorizontalAlign\",\n\t\t\t\t\t\"description\": \"The horizontal alignment of the text. One of `\\\"left\\\"`, `\\\"right\\\"`, `\\\"center\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"angle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the text, in degrees.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"baseline\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VerticalAlign\",\n\t\t\t\t\t\"description\": \"The vertical alignment of the text. One of `\\\"top\\\"`, `\\\"middle\\\"`, `\\\"bottom\\\"`.\\n\\n__Default value:__ `\\\"middle\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"binSpacing\": {\n\t\t\t\t\t\"description\": \"Offset between bar for binned field. Ideal value for this is either 0 (Preferred by statisticians) or 1 (Vega-Lite Default, D3 example style).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"description\": \"Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\\n\\n__Default value:__ `\\\"#4682b4\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"continuousBandSize\": {\n\t\t\t\t\t\"description\": \"The default size of the bars on continuous scales.\\n\\n__Default value:__ `2`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"discreteBandSize\": {\n\t\t\t\t\t\"description\": \"The size of the bars. If unspecified, the default size is `bandSize-1`,\\nwhich provides 1 pixel offset between bars.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"dx\": {\n\t\t\t\t\t\"description\": \"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"dy\": {\n\t\t\t\t\t\"description\": \"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fill\": {\n\t\t\t\t\t\"description\": \"Default Fill Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fillOpacity\": {\n\t\t\t\t\t\"description\": \"The fill opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"filled\": {\n\t\t\t\t\t\"description\": \"Whether the mark's color should be used as fill color instead of stroke color.\\n\\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\\n\\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"font\": {\n\t\t\t\t\t\"description\": \"The typeface to set the text in (e.g., `\\\"Helvetica Neue\\\"`).\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fontSize\": {\n\t\t\t\t\t\"description\": \"The font size, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fontStyle\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FontStyle\",\n\t\t\t\t\t\"description\": \"The font style (e.g., `\\\"italic\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"fontWeight\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeight\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeightNumber\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The font weight (e.g., `\\\"bold\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"interpolate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Interpolate\",\n\t\t\t\t\t\"description\": \"The line interpolation method to use for line and area marks. One of the following:\\n- `\\\"linear\\\"`: piecewise linear segments, as in a polyline.\\n- `\\\"linear-closed\\\"`: close the linear segments to form a polygon.\\n- `\\\"step\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"step-before\\\"`: alternate between vertical and horizontal segments, as in a step function.\\n- `\\\"step-after\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"basis\\\"`: a B-spline, with control point duplication on the ends.\\n- `\\\"basis-open\\\"`: an open B-spline; may not intersect the start or end.\\n- `\\\"basis-closed\\\"`: a closed B-spline, as in a loop.\\n- `\\\"cardinal\\\"`: a Cardinal spline, with control point duplication on the ends.\\n- `\\\"cardinal-open\\\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\\n- `\\\"cardinal-closed\\\"`: a closed Cardinal spline, as in a loop.\\n- `\\\"bundle\\\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\\n- `\\\"monotone\\\"`: cubic interpolation that preserves monotonicity in y.\"\n\t\t\t\t},\n\t\t\t\t\"limit\": {\n\t\t\t\t\t\"description\": \"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"description\": \"The overall opacity (value between [0,1]).\\n\\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Orient\",\n\t\t\t\t\t\"description\": \"The orientation of a non-stacked bar, tick, area, and line charts.\\nThe value is either horizontal (default) or vertical.\\n- For bar, rule and tick, this determines whether the size of the bar and tick\\nshould be applied to x or y dimension.\\n- For area, this property determines the orient property of the Vega output.\\n- For line, this property determines the sort order of the points in the line\\nif `config.sortLineBy` is not specified.\\nFor stacked charts, this is always determined by the orientation of the stack;\\ntherefore explicitly specified value will be ignored.\"\n\t\t\t\t},\n\t\t\t\t\"radius\": {\n\t\t\t\t\t\"description\": \"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"description\": \"The default symbol shape to use. One of: `\\\"circle\\\"` (default), `\\\"square\\\"`, `\\\"cross\\\"`, `\\\"diamond\\\"`, `\\\"triangle-up\\\"`, or `\\\"triangle-down\\\"`, or a custom SVG path.\\n\\n__Default value:__ `\\\"circle\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"description\": \"The pixel area each the point/circle/square.\\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\\n\\n__Default value:__ `30`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"description\": \"Default Stroke Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"An array of alternating stroke, space lengths for creating dashed or dotted lines.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeDashOffset\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the stroke dash array.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"The stroke width, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tension\": {\n\t\t\t\t\t\"description\": \"Depending on the interpolation type, sets the tension parameter (for line and area marks).\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"description\": \"Placeholder text if the `text` channel is not specified\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"theta\": {\n\t\t\t\t\t\"description\": \"Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating \\\"north\\\".\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BaseBin\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"base\": {\n\t\t\t\t\t\"description\": \"The number base to use for automatic bin determination (default is base 10).\\n\\n__Default value:__ `10`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"divide\": {\n\t\t\t\t\t\"description\": \"Scale factors indicating allowable subdivisions. The default value is [5, 2], which indicates that for base 10 numbers (the default base), the method may consider dividing bin sizes by 5 and/or 2. For example, for an initial step size of 10, the method can check if bin sizes of 2 (= 10/5), 5 (= 10/2), or 1 (= 10/(5*2)) might also satisfy the given constraints.\\n\\n__Default value:__ `[5, 2]`\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"minItems\": 1,\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"maxbins\": {\n\t\t\t\t\t\"description\": \"Maximum number of bins.\\n\\n__Default value:__ `6` for `row`, `column` and `shape` channels; `10` for other channels\",\n\t\t\t\t\t\"minimum\": 2,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minstep\": {\n\t\t\t\t\t\"description\": \"A minimum allowable step size (particularly useful for integer values).\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"nice\": {\n\t\t\t\t\t\"description\": \"If true (the default), attempts to make the bin boundaries use human-friendly boundaries, such as multiples of ten.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"step\": {\n\t\t\t\t\t\"description\": \"An exact step size to use between bins.\\n\\n__Note:__ If provided, options such as maxbins will be ignored.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"steps\": {\n\t\t\t\t\t\"description\": \"An array of allowable step sizes to choose from.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"minItems\": 1,\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BaseSelectionDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"encodings\": {\n\t\t\t\t\t\"description\": \"An array of encoding channels. The corresponding data field values\\nmust match for a data tuple to fall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SingleDefChannel\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"fields\": {\n\t\t\t\t\t\"description\": \"An array of field names whose values must match for a data tuple to\\nfall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"on\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgEventStream\",\n\t\t\t\t\t\"description\": \"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionResolution\",\n\t\t\t\t\t\"description\": \"With layered and multi-view displays, a strategy that determines how\\nselections' data queries are resolved when applied in a filter transform,\\nconditional encoding rule, or scale domain.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BaseSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BinParams\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"Binning properties or boolean flag for determining whether to bin data or not.\",\n\t\t\t\"properties\": {\n\t\t\t\t\"base\": {\n\t\t\t\t\t\"description\": \"The number base to use for automatic bin determination (default is base 10).\\n\\n__Default value:__ `10`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"divide\": {\n\t\t\t\t\t\"description\": \"Scale factors indicating allowable subdivisions. The default value is [5, 2], which indicates that for base 10 numbers (the default base), the method may consider dividing bin sizes by 5 and/or 2. For example, for an initial step size of 10, the method can check if bin sizes of 2 (= 10/5), 5 (= 10/2), or 1 (= 10/(5*2)) might also satisfy the given constraints.\\n\\n__Default value:__ `[5, 2]`\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"minItems\": 1,\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"extent\": {\n\t\t\t\t\t\"description\": \"A two-element (`[min, max]`) array indicating the range of desired bin values.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"maxItems\": 2,\n\t\t\t\t\t\"minItems\": 2,\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"maxbins\": {\n\t\t\t\t\t\"description\": \"Maximum number of bins.\\n\\n__Default value:__ `6` for `row`, `column` and `shape` channels; `10` for other channels\",\n\t\t\t\t\t\"minimum\": 2,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minstep\": {\n\t\t\t\t\t\"description\": \"A minimum allowable step size (particularly useful for integer values).\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"nice\": {\n\t\t\t\t\t\"description\": \"If true (the default), attempts to make the bin boundaries use human-friendly boundaries, such as multiples of ten.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"step\": {\n\t\t\t\t\t\"description\": \"An exact step size to use between bins.\\n\\n__Note:__ If provided, options such as maxbins will be ignored.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"steps\": {\n\t\t\t\t\t\"description\": \"An array of allowable step sizes to choose from.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"minItems\": 1,\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BinTransform\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"as\": {\n\t\t\t\t\t\"description\": \"The output fields at which to write the start and end bin values.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"An object indicating bin properties, or simply `true` for using default bin parameters.\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"description\": \"The data field to bin.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"bin\",\n\t\t\t\t\"field\",\n\t\t\t\t\"as\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BoxPlotConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"align\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/HorizontalAlign\",\n\t\t\t\t\t\"description\": \"The horizontal alignment of the text. One of `\\\"left\\\"`, `\\\"right\\\"`, `\\\"center\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"angle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the text, in degrees.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"baseline\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VerticalAlign\",\n\t\t\t\t\t\"description\": \"The vertical alignment of the text. One of `\\\"top\\\"`, `\\\"middle\\\"`, `\\\"bottom\\\"`.\\n\\n__Default value:__ `\\\"middle\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"description\": \"Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\\n\\n__Default value:__ `\\\"#4682b4\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"dx\": {\n\t\t\t\t\t\"description\": \"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"dy\": {\n\t\t\t\t\t\"description\": \"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fill\": {\n\t\t\t\t\t\"description\": \"Default Fill Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fillOpacity\": {\n\t\t\t\t\t\"description\": \"The fill opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"filled\": {\n\t\t\t\t\t\"description\": \"Whether the mark's color should be used as fill color instead of stroke color.\\n\\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\\n\\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"font\": {\n\t\t\t\t\t\"description\": \"The typeface to set the text in (e.g., `\\\"Helvetica Neue\\\"`).\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fontSize\": {\n\t\t\t\t\t\"description\": \"The font size, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fontStyle\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FontStyle\",\n\t\t\t\t\t\"description\": \"The font style (e.g., `\\\"italic\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"fontWeight\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeight\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeightNumber\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The font weight (e.g., `\\\"bold\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"interpolate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Interpolate\",\n\t\t\t\t\t\"description\": \"The line interpolation method to use for line and area marks. One of the following:\\n- `\\\"linear\\\"`: piecewise linear segments, as in a polyline.\\n- `\\\"linear-closed\\\"`: close the linear segments to form a polygon.\\n- `\\\"step\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"step-before\\\"`: alternate between vertical and horizontal segments, as in a step function.\\n- `\\\"step-after\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"basis\\\"`: a B-spline, with control point duplication on the ends.\\n- `\\\"basis-open\\\"`: an open B-spline; may not intersect the start or end.\\n- `\\\"basis-closed\\\"`: a closed B-spline, as in a loop.\\n- `\\\"cardinal\\\"`: a Cardinal spline, with control point duplication on the ends.\\n- `\\\"cardinal-open\\\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\\n- `\\\"cardinal-closed\\\"`: a closed Cardinal spline, as in a loop.\\n- `\\\"bundle\\\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\\n- `\\\"monotone\\\"`: cubic interpolation that preserves monotonicity in y.\"\n\t\t\t\t},\n\t\t\t\t\"limit\": {\n\t\t\t\t\t\"description\": \"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"description\": \"The overall opacity (value between [0,1]).\\n\\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Orient\",\n\t\t\t\t\t\"description\": \"The orientation of a non-stacked bar, tick, area, and line charts.\\nThe value is either horizontal (default) or vertical.\\n- For bar, rule and tick, this determines whether the size of the bar and tick\\nshould be applied to x or y dimension.\\n- For area, this property determines the orient property of the Vega output.\\n- For line, this property determines the sort order of the points in the line\\nif `config.sortLineBy` is not specified.\\nFor stacked charts, this is always determined by the orientation of the stack;\\ntherefore explicitly specified value will be ignored.\"\n\t\t\t\t},\n\t\t\t\t\"radius\": {\n\t\t\t\t\t\"description\": \"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"description\": \"The default symbol shape to use. One of: `\\\"circle\\\"` (default), `\\\"square\\\"`, `\\\"cross\\\"`, `\\\"diamond\\\"`, `\\\"triangle-up\\\"`, or `\\\"triangle-down\\\"`, or a custom SVG path.\\n\\n__Default value:__ `\\\"circle\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"description\": \"Size of the box and mid tick of a box plot \",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"description\": \"Default Stroke Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"An array of alternating stroke, space lengths for creating dashed or dotted lines.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeDashOffset\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the stroke dash array.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"The stroke width, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tension\": {\n\t\t\t\t\t\"description\": \"Depending on the interpolation type, sets the tension parameter (for line and area marks).\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"description\": \"Placeholder text if the `text` channel is not specified\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"theta\": {\n\t\t\t\t\t\"description\": \"Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating \\\"north\\\".\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BoxPlotConfigMixins\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"box\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/BoxPlotConfig\",\n\t\t\t\t\t\"description\": \"Box Config \"\n\t\t\t\t},\n\t\t\t\t\"boxMid\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\"\n\t\t\t\t},\n\t\t\t\t\"boxWhisker\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"BrushConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"fill\": {\n\t\t\t\t\t\"description\": \"The fill color of the interval mark.\\n\\n__Default value:__ `#333333`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fillOpacity\": {\n\t\t\t\t\t\"description\": \"The fill opacity of the interval mark (a value between 0 and 1).\\n\\n__Default value:__ `0.125`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"description\": \"The stroke color of the interval mark.\\n\\n__Default value:__ `#ffffff`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"An array of alternating stroke and space lengths,\\nfor creating dashed or dotted lines.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeDashOffset\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) with which to begin drawing the stroke dash array.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity of the interval mark (a value between 0 and 1).\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"The stroke width of the interval mark.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"CalculateTransform\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"as\": {\n\t\t\t\t\t\"description\": \"The field for storing the computed formula value.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"calculate\": {\n\t\t\t\t\t\"description\": \"A string containing a Vega Expression. Use the variable `datum` to refer to the current data object.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"calculate\",\n\t\t\t\t\"as\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"CompositeMarkConfigMixins\": {\n\t\t\t\"$ref\": \"#/definitions/BoxPlotConfigMixins\"\n\t\t},\n\t\t\"CompositeUnitSpec\": {\n\t\t\t\"$ref\": \"#/definitions/CompositeUnitSpecAlias\",\n\t\t\t\"description\": \"Unit spec that can have a composite mark.\"\n\t\t},\n\t\t\"ConditionLegendFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"legend\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/Legend\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"An object defining properties of the legend.\\nIf `null`, the legend for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [legend properties](legend.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"scale\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Scale\",\n\t\t\t\t\t\"description\": \"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\n__Default value:__ If undefined, default [scale properties](scale.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionOperand\",\n\t\t\t\t\t\"description\": \"A [selection name](selection.html), or a series of [composed selections](selection.html#compose).\"\n\t\t\t\t},\n\t\t\t\t\"sort\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortOrder\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortField\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Sort order for the encoded field.\\nSupported `sort` values include `\\\"ascending\\\"`, `\\\"descending\\\"` and `null` (no sorting).\\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\\n\\n__Default value:__ `\\\"ascending\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"selection\",\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ConditionTextFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"description\": \"The [formatting pattern](format.html) for a text field. If not defined, this will be determined automatically.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionOperand\",\n\t\t\t\t\t\"description\": \"A [selection name](selection.html), or a series of [composed selections](selection.html#compose).\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"selection\",\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ConditionValueDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionOperand\",\n\t\t\t\t\t\"description\": \"A [selection name](selection.html), or a series of [composed selections](selection.html#compose).\"\n\t\t\t\t},\n\t\t\t\t\"value\": {\n\t\t\t\t\t\"description\": \"A constant value in visual domain.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"selection\",\n\t\t\t\t\"value\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ConditionalLegendFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"A FieldDef with ConditionValueDef\\n{\\n condition: {value: ...},\\n field: ...,\\n ...\\n}\",\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"condition\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ConditionValueDef\",\n\t\t\t\t\t\"description\": \"A value definition with a selection predicate.\\n\\n__Note:__ A field definition's `condition` property can only be a [value definition](encoding.html#value)\\nsince Vega-Lite only allows at mosty one encoded field per encoding channel.\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"legend\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/Legend\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"An object defining properties of the legend.\\nIf `null`, the legend for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [legend properties](legend.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"scale\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Scale\",\n\t\t\t\t\t\"description\": \"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\n__Default value:__ If undefined, default [scale properties](scale.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"sort\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortOrder\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortField\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Sort order for the encoded field.\\nSupported `sort` values include `\\\"ascending\\\"`, `\\\"descending\\\"` and `null` (no sorting).\\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\\n\\n__Default value:__ `\\\"ascending\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ConditionalTextFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"A FieldDef with ConditionValueDef\\n{\\n condition: {value: ...},\\n field: ...,\\n ...\\n}\",\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"condition\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ConditionValueDef\",\n\t\t\t\t\t\"description\": \"A value definition with a selection predicate.\\n\\n__Note:__ A field definition's `condition` property can only be a [value definition](encoding.html#value)\\nsince Vega-Lite only allows at mosty one encoded field per encoding channel.\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"description\": \"The [formatting pattern](format.html) for a text field. If not defined, this will be determined automatically.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ConditionalLegendValueDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"A ValueDef with ConditionValueDef | FieldDef\\n{\\n condition: {field: ...} | {value: ...},\\n value: ...,\\n}\",\n\t\t\t\"properties\": {\n\t\t\t\t\"condition\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A field definition or a value definition with a selection predicate.\"\n\t\t\t\t},\n\t\t\t\t\"value\": {\n\t\t\t\t\t\"description\": \"A constant value in visual domain.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ConditionalTextValueDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"A ValueDef with ConditionValueDef | FieldDef\\n{\\n condition: {field: ...} | {value: ...},\\n value: ...,\\n}\",\n\t\t\t\"properties\": {\n\t\t\t\t\"condition\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionTextFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A field definition or a value definition with a selection predicate.\"\n\t\t\t\t},\n\t\t\t\t\"value\": {\n\t\t\t\t\t\"description\": \"A constant value in visual domain.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Config\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"area\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Area-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"autoResize\": {\n\t\t\t\t\t\"description\": \"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\\n\\n__Default value__: `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"axis\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AxisConfig\",\n\t\t\t\t\t\"description\": \"Axis configuration, which determines default properties for all `x` and `y` [axes](axis.html). For a full list of axis configuration options, please see the [corresponding section of the axis documentation](axis.html#axis-config).\"\n\t\t\t\t},\n\t\t\t\t\"axisBand\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for axes with \\\"band\\\" scales.\"\n\t\t\t\t},\n\t\t\t\t\"axisBottom\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for x-axis along the bottom edge of the chart.\"\n\t\t\t\t},\n\t\t\t\t\"axisLeft\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for y-axis along the left edge of the chart.\"\n\t\t\t\t},\n\t\t\t\t\"axisRight\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for y-axis along the right edge of the chart.\"\n\t\t\t\t},\n\t\t\t\t\"axisTop\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Specific axis config for x-axis along the top edge of the chart.\"\n\t\t\t\t},\n\t\t\t\t\"axisX\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"X-axis specific config.\"\n\t\t\t\t},\n\t\t\t\t\"axisY\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgAxisConfig\",\n\t\t\t\t\t\"description\": \"Y-axis specific config.\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"description\": \"CSS color property to use as the background of visualization.\\n\\n__Default value:__ none (transparent)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"bar\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/BarConfig\",\n\t\t\t\t\t\"description\": \"Bar-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"circle\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Circle-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"countTitle\": {\n\t\t\t\t\t\"description\": \"Default axis and legend title for count fields.\\n\\n__Default value:__ `'Number of Records'`.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"invalidValues\": {\n\t\t\t\t\t\"description\": \"Defines how Vega-Lite should handle invalid values (`null` and `NaN`).\\n- If set to `\\\"filter\\\"` (default), all data items with null values are filtered.\\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"filter\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"legend\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/LegendConfig\",\n\t\t\t\t\t\"description\": \"Legend configuration, which determines default properties for all [legends](legend.html). For a full list of legend configuration options, please see the [corresponding section of in the legend documentation](legend.html#config).\"\n\t\t\t\t},\n\t\t\t\t\"line\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Line-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"mark\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Mark Config \"\n\t\t\t\t},\n\t\t\t\t\"numberFormat\": {\n\t\t\t\t\t\"description\": \"D3 Number format for axis labels and text tables. For example \\\"s\\\" for SI units. Use [D3's number format pattern](https://github.com/d3/d3-format#locale_format).\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Padding\",\n\t\t\t\t\t\"description\": \"The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\\nIf an object, the value should have the format `{\\\"left\\\": 5, \\\"top\\\": 5, \\\"right\\\": 5, \\\"bottom\\\": 5}` to specify padding for each side of the visualization.\\n\\n__Default value__: `5`\"\n\t\t\t\t},\n\t\t\t\t\"point\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Point-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"range\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/RangeConfig\",\n\t\t\t\t\t\"description\": \"An object hash that defines default range arrays or schemes for using with scales.\\nFor a full list of scale range configuration options, please see the [corresponding section of the scale documentation](scale.html#config).\"\n\t\t\t\t},\n\t\t\t\t\"rect\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Rect-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"rule\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Rule-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"scale\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ScaleConfig\",\n\t\t\t\t\t\"description\": \"Scale configuration determines default properties for all [scales](scale.html). For a full list of scale configuration options, please see the [corresponding section of the scale documentation](scale.html#config).\"\n\t\t\t\t},\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionConfig\",\n\t\t\t\t\t\"description\": \"An object hash for defining default properties for each type of selections. \"\n\t\t\t\t},\n\t\t\t\t\"square\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Square-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"stack\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/StackOffset\",\n\t\t\t\t\t\"description\": \"Default stack offset for stackable mark. \"\n\t\t\t\t},\n\t\t\t\t\"style\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/StyleConfigIndex\",\n\t\t\t\t\t\"description\": \"An object hash that defines key-value mappings to determine default properties for marks with a given [style](mark.html#mark-def). The keys represent styles names; the value are valid [mark configuration objects](mark.html#config). \"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TextConfig\",\n\t\t\t\t\t\"description\": \"Text-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"tick\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TickConfig\",\n\t\t\t\t\t\"description\": \"Tick-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"timeFormat\": {\n\t\t\t\t\t\"description\": \"Default datetime format for axis and legend labels. The format can be set directly on each axis and legend. Use [D3's time format pattern](https://github.com/d3/d3-time-format#locale_format).\\n\\n__Default value:__ `'%b %d, %Y'`.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgTitleConfig\",\n\t\t\t\t\t\"description\": \"Title configuration, which determines default properties for all [titles](title.html). For a full list of title configuration options, please see the [corresponding section of the title documentation](title.html#config).\"\n\t\t\t\t},\n\t\t\t\t\"view\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ViewConfig\",\n\t\t\t\t\t\"description\": \"Default properties for [single view plots](spec.html#single). \"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Data\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/UrlData\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/InlineData\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/NamedData\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"DataFormat\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"feature\": {\n\t\t\t\t\t\"description\": \"The name of the TopoJSON object set to convert to a GeoJSON feature collection.\\nFor example, in a map of the world, there may be an object set named `\\\"countries\\\"`.\\nUsing the feature property, we can extract this set and generate a GeoJSON feature object for each country.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"mesh\": {\n\t\t\t\t\t\"description\": \"The name of the TopoJSON object set to convert to mesh.\\nSimilar to the `feature` option, `mesh` extracts a named TopoJSON object set.\\n Unlike the `feature` option, the corresponding geo data is returned as a single, unified mesh instance, not as individual GeoJSON features.\\nExtracting a mesh is useful for more efficiently drawing borders or other geographic elements that you do not need to associate with specific regions such as individual countries, states or counties.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"parse\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"auto\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"If set to auto (the default), perform automatic type inference to determine the desired data types.\\nAlternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\\\"number\\\"`, `\\\"boolean\\\"` or `\\\"date\\\"`).\\nFor example, `\\\"parse\\\": {\\\"modified_on\\\": \\\"date\\\"}` parses the `modified_on` field in each input record a Date value.\\n\\nFor `\\\"date\\\"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse).\\nFor Specific date formats can be provided (e.g., `{foo: 'date:\\\"%m%d%Y\\\"'}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: 'utc:\\\"%m%d%Y\\\"'}`). See more about [UTC time](timeunit.html#utc)\"\n\t\t\t\t},\n\t\t\t\t\"property\": {\n\t\t\t\t\t\"description\": \"The JSON property containing the desired data.\\nThis parameter can be used when the loaded JSON file may have surrounding structure or meta-data.\\nFor example `\\\"property\\\": \\\"values.features\\\"` is equivalent to retrieving `json.values.features`\\nfrom the loaded JSON object.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"DataFormatType\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"json\",\n\t\t\t\t\"csv\",\n\t\t\t\t\"tsv\",\n\t\t\t\t\"topojson\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"DataUrlFormat\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"feature\": {\n\t\t\t\t\t\"description\": \"The name of the TopoJSON object set to convert to a GeoJSON feature collection.\\nFor example, in a map of the world, there may be an object set named `\\\"countries\\\"`.\\nUsing the feature property, we can extract this set and generate a GeoJSON feature object for each country.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"mesh\": {\n\t\t\t\t\t\"description\": \"The name of the TopoJSON object set to convert to mesh.\\nSimilar to the `feature` option, `mesh` extracts a named TopoJSON object set.\\n Unlike the `feature` option, the corresponding geo data is returned as a single, unified mesh instance, not as individual GeoJSON features.\\nExtracting a mesh is useful for more efficiently drawing borders or other geographic elements that you do not need to associate with specific regions such as individual countries, states or counties.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"parse\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"auto\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"If set to auto (the default), perform automatic type inference to determine the desired data types.\\nAlternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\\\"number\\\"`, `\\\"boolean\\\"` or `\\\"date\\\"`).\\nFor example, `\\\"parse\\\": {\\\"modified_on\\\": \\\"date\\\"}` parses the `modified_on` field in each input record a Date value.\\n\\nFor `\\\"date\\\"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse).\\nFor Specific date formats can be provided (e.g., `{foo: 'date:\\\"%m%d%Y\\\"'}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: 'utc:\\\"%m%d%Y\\\"'}`). See more about [UTC time](timeunit.html#utc)\"\n\t\t\t\t},\n\t\t\t\t\"property\": {\n\t\t\t\t\t\"description\": \"The JSON property containing the desired data.\\nThis parameter can be used when the loaded JSON file may have surrounding structure or meta-data.\\nFor example `\\\"property\\\": \\\"values.features\\\"` is equivalent to retrieving `json.values.features`\\nfrom the loaded JSON object.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/DataFormatType\",\n\t\t\t\t\t\"description\": \"Type of input data: `\\\"json\\\"`, `\\\"csv\\\"`, `\\\"tsv\\\"`.\\nThe default format type is determined by the extension of the file URL.\\nIf no extension is detected, `\\\"json\\\"` will be used by default.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"DateTime\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"Object for defining datetime in Vega-Lite Filter.\\nIf both month and quarter are provided, month has higher precedence.\\n`day` cannot be combined with other date.\\nWe accept string for month and day names.\",\n\t\t\t\"properties\": {\n\t\t\t\t\"date\": {\n\t\t\t\t\t\"description\": \"Integer value representing the date from 1-31.\",\n\t\t\t\t\t\"maximum\": 31,\n\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"day\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/Day\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Value representing the day of a week. This can be one of: (1) integer value -- `1` represents Monday; (2) case-insensitive day name (e.g., `\\\"Monday\\\"`); (3) case-insensitive, 3-character short day name (e.g., `\\\"Mon\\\"`).
**Warning:** A DateTime definition object with `day`** should not be combined with `year`, `quarter`, `month`, or `date`.\"\n\t\t\t\t},\n\t\t\t\t\"hours\": {\n\t\t\t\t\t\"description\": \"Integer value representing the hour of a day from 0-23.\",\n\t\t\t\t\t\"maximum\": 23,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"milliseconds\": {\n\t\t\t\t\t\"description\": \"Integer value representing the millisecond segment of time.\",\n\t\t\t\t\t\"maximum\": 999,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minutes\": {\n\t\t\t\t\t\"description\": \"Integer value representing the minute segment of time from 0-59.\",\n\t\t\t\t\t\"maximum\": 59,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"month\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/Month\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"One of: (1) integer value representing the month from `1`-`12`. `1` represents January; (2) case-insensitive month name (e.g., `\\\"January\\\"`); (3) case-insensitive, 3-character short month name (e.g., `\\\"Jan\\\"`). \"\n\t\t\t\t},\n\t\t\t\t\"quarter\": {\n\t\t\t\t\t\"description\": \"Integer value representing the quarter of the year (from 1-4).\",\n\t\t\t\t\t\"maximum\": 4,\n\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"seconds\": {\n\t\t\t\t\t\"description\": \"Integer value representing the second segment (0-59) of a time value\",\n\t\t\t\t\t\"maximum\": 59,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"utc\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if date time is in utc time. If false, the date time is in local time\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"year\": {\n\t\t\t\t\t\"description\": \"Integer value representing the year.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Day\": {\n\t\t\t\"maximum\": 7,\n\t\t\t\"minimum\": 1,\n\t\t\t\"type\": \"number\"\n\t\t},\n\t\t\"Encoding\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Color of the marks – either fill or stroke color based on mark type.\\nBy default, `color` represents fill color for `\\\"area\\\"`, `\\\"bar\\\"`, `\\\"tick\\\"`,\\n`\\\"text\\\"`, `\\\"circle\\\"`, and `\\\"square\\\"` / stroke color for `\\\"line\\\"` and `\\\"point\\\"`.\\n\\n__Default value:__ If undefined, the default color depends on [mark config](config.html#mark)'s `color` property.\\n\\n_Note:_ See the scale documentation for more information about customizing [color scheme](scale.html#scheme).\"\n\t\t\t\t},\n\t\t\t\t\"detail\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FieldDef\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Additional levels of detail for grouping data in aggregate views and\\nin line and area marks without mapping data to a specific visual channel.\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Opacity of the marks – either can be a value or a range.\\n\\n__Default value:__ If undefined, the default opacity depends on [mark config](config.html#mark)'s `opacity` property.\"\n\t\t\t\t},\n\t\t\t\t\"order\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/OrderFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/OrderFieldDef\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Stack order for stacked marks or order of data points in line marks for connected scatter plots.\\n\\n__Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating additional aggregation grouping.\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The symbol's shape (only for `point` marks). The supported values are\\n`\\\"circle\\\"` (default), `\\\"square\\\"`, `\\\"cross\\\"`, `\\\"diamond\\\"`, `\\\"triangle-up\\\"`,\\nor `\\\"triangle-down\\\"`, or else a custom SVG path string.\\n__Default value:__ If undefined, the default shape depends on [mark config](config.html#point-config)'s `shape` property.\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Size of the mark.\\n- For `\\\"point\\\"`, `\\\"square\\\"` and `\\\"circle\\\"`, – the symbol size, or pixel area of the mark.\\n- For `\\\"bar\\\"` and `\\\"tick\\\"` – the bar and tick's size.\\n- For `\\\"text\\\"` – the text's font size.\\n- Size is currently unsupported for `\\\"line\\\"`, `\\\"area\\\"`, and `\\\"rect\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalTextFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalTextValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Text of the `text` mark.\"\n\t\t\t\t},\n\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalTextFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalTextValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The tooltip text to show upon mouse hover.\"\n\t\t\t\t},\n\t\t\t\t\"x\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/PositionFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"X coordinates of the marks, or width of horizontal `\\\"bar\\\"` and `\\\"area\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"x2\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"X2 coordinates for ranged `\\\"area\\\"`, `\\\"bar\\\"`, `\\\"rect\\\"`, and `\\\"rule\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"y\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/PositionFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Y coordinates of the marks, or height of vertical `\\\"bar\\\"` and `\\\"area\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"y2\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Y2 coordinates for ranged `\\\"area\\\"`, `\\\"bar\\\"`, `\\\"rect\\\"`, and `\\\"rule\\\"`.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"EncodingWithFacet\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Color of the marks – either fill or stroke color based on mark type.\\nBy default, `color` represents fill color for `\\\"area\\\"`, `\\\"bar\\\"`, `\\\"tick\\\"`,\\n`\\\"text\\\"`, `\\\"circle\\\"`, and `\\\"square\\\"` / stroke color for `\\\"line\\\"` and `\\\"point\\\"`.\\n\\n__Default value:__ If undefined, the default color depends on [mark config](config.html#mark)'s `color` property.\\n\\n_Note:_ See the scale documentation for more information about customizing [color scheme](scale.html#scheme).\"\n\t\t\t\t},\n\t\t\t\t\"column\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FacetFieldDef\",\n\t\t\t\t\t\"description\": \"Horizontal facets for trellis plots.\"\n\t\t\t\t},\n\t\t\t\t\"detail\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FieldDef\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Additional levels of detail for grouping data in aggregate views and\\nin line and area marks without mapping data to a specific visual channel.\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Opacity of the marks – either can be a value or a range.\\n\\n__Default value:__ If undefined, the default opacity depends on [mark config](config.html#mark)'s `opacity` property.\"\n\t\t\t\t},\n\t\t\t\t\"order\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/OrderFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/OrderFieldDef\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Stack order for stacked marks or order of data points in line marks for connected scatter plots.\\n\\n__Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating additional aggregation grouping.\"\n\t\t\t\t},\n\t\t\t\t\"row\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FacetFieldDef\",\n\t\t\t\t\t\"description\": \"Vertical facets for trellis plots.\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The symbol's shape (only for `point` marks). The supported values are\\n`\\\"circle\\\"` (default), `\\\"square\\\"`, `\\\"cross\\\"`, `\\\"diamond\\\"`, `\\\"triangle-up\\\"`,\\nor `\\\"triangle-down\\\"`, or else a custom SVG path string.\\n__Default value:__ If undefined, the default shape depends on [mark config](config.html#point-config)'s `shape` property.\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalLegendValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Size of the mark.\\n- For `\\\"point\\\"`, `\\\"square\\\"` and `\\\"circle\\\"`, – the symbol size, or pixel area of the mark.\\n- For `\\\"bar\\\"` and `\\\"tick\\\"` – the bar and tick's size.\\n- For `\\\"text\\\"` – the text's font size.\\n- Size is currently unsupported for `\\\"line\\\"`, `\\\"area\\\"`, and `\\\"rect\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalTextFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalTextValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Text of the `text` mark.\"\n\t\t\t\t},\n\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalTextFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ConditionalTextValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The tooltip text to show upon mouse hover.\"\n\t\t\t\t},\n\t\t\t\t\"x\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/PositionFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"X coordinates of the marks, or width of horizontal `\\\"bar\\\"` and `\\\"area\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"x2\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"X2 coordinates for ranged `\\\"area\\\"`, `\\\"bar\\\"`, `\\\"rect\\\"`, and `\\\"rule\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"y\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/PositionFieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Y coordinates of the marks, or height of vertical `\\\"bar\\\"` and `\\\"area\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"y2\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FieldDef\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/ValueDef\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Y2 coordinates for ranged `\\\"area\\\"`, `\\\"bar\\\"`, `\\\"rect\\\"`, and `\\\"rule\\\"`.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"EqualFilter\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"equal\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/DateTime\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The value that the field should be equal to.\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"description\": \"Field to be filtered.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for the field to be filtered.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"field\",\n\t\t\t\t\"equal\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Facet\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"column\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FacetFieldDef\",\n\t\t\t\t\t\"description\": \"Horizontal facets for trellis plots.\"\n\t\t\t\t},\n\t\t\t\t\"row\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FacetFieldDef\",\n\t\t\t\t\t\"description\": \"Vertical facets for trellis plots.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"FacetFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"header\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Header\"\n\t\t\t\t},\n\t\t\t\t\"sort\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SortOrder\",\n\t\t\t\t\t\"description\": \"Sort order for a facet field.\\nThis can be `\\\"ascending\\\"`, `\\\"descending\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"FacetedUnitSpec\": {\n\t\t\t\"$ref\": \"#/definitions/FacetedCompositeUnitSpecAlias\",\n\t\t\t\"description\": \"Unit spec that can have a composite mark and row or column channels.\"\n\t\t},\n\t\t\"Field\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/RepeatRef\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"FieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"Definition object for a data field, its type and transformation of an encoding channel.\",\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"FieldDefBase\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Filter\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/EqualFilter\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/RangeFilter\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/OneOfFilter\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionFilter\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"FilterTransform\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"filter\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FilterOperand\",\n\t\t\t\t\t\"description\": \"The `filter` property must be either (1) a filter object for [equal-filters](filter.html#equalfilter),\\n[range-filters](filter.html#rangefilter), [one-of filters](filter.html#oneoffilter), or [selection filters](filter.html#selectionfilter);\\n(2) a [Vega Expression](filter.html#expression) string,\\nwhere `datum` can be used to refer to the current data object; or (3) an array of filters (either objects or expression strings) that must all be true for a datum to pass the filter and be included.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"filter\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"FontStyle\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"normal\",\n\t\t\t\t\"italic\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"FontWeight\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"normal\",\n\t\t\t\t\"bold\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"FontWeightNumber\": {\n\t\t\t\"maximum\": 900,\n\t\t\t\"minimum\": 100,\n\t\t\t\"type\": \"number\"\n\t\t},\n\t\t\"FacetedSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"facet\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Facet\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"spec\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/LayerSpec\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/CompositeUnitSpec\"\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"facet\",\n\t\t\t\t\"spec\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"HConcatSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"hconcat\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Spec\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"hconcat\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"LayerSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"height\": {\n\t\t\t\t\t\"description\": \"The height of a visualization.\\n\\n__Default value:__\\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\\n\\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"layer\": {\n\t\t\t\t\t\"description\": \"Layer or single view specifications to be layered.\\n\\n__Note__: Specifications inside `layer` cannot use `row` and `column` channels as layering facet specifications is not allowed.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/LayerSpec\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/CompositeUnitSpec\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"width\": {\n\t\t\t\t\t\"description\": \"The width of a visualization.\\n\\n__Default value:__ This will be determined by the following rules:\\n\\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\\n\\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"layer\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"RepeatSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"repeat\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Repeat\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"spec\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Spec\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"repeat\",\n\t\t\t\t\"spec\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Spec\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/CompositeUnitSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/LayerSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/FacetedSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/RepeatSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/VConcatSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/HConcatSpec\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"CompositeUnitSpecAlias\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"encoding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Encoding\",\n\t\t\t\t\t\"description\": \"A key-value mapping between encoding channels and definition of fields.\"\n\t\t\t\t},\n\t\t\t\t\"height\": {\n\t\t\t\t\t\"description\": \"The height of a visualization.\\n\\n__Default value:__\\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\\n\\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"mark\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AnyMark\",\n\t\t\t\t\t\"description\": \"A string describing the mark type (one of `\\\"bar\\\"`, `\\\"circle\\\"`, `\\\"square\\\"`, `\\\"tick\\\"`, `\\\"line\\\"`,\\n`\\\"area\\\"`, `\\\"point\\\"`, `\\\"rule\\\"`, and `\\\"text\\\"`) or a [mark definition object](mark.html#mark-def).\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"additionalProperties\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SelectionDef\"\n\t\t\t\t\t},\n\t\t\t\t\t\"description\": \"A key-value mapping between selection names and definitions.\",\n\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"width\": {\n\t\t\t\t\t\"description\": \"The width of a visualization.\\n\\n__Default value:__ This will be determined by the following rules:\\n\\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\\n\\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"mark\",\n\t\t\t\t\"encoding\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"FacetedCompositeUnitSpecAlias\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"encoding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/EncodingWithFacet\",\n\t\t\t\t\t\"description\": \"A key-value mapping between encoding channels and definition of fields.\"\n\t\t\t\t},\n\t\t\t\t\"height\": {\n\t\t\t\t\t\"description\": \"The height of a visualization.\\n\\n__Default value:__\\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\\n\\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"mark\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AnyMark\",\n\t\t\t\t\t\"description\": \"A string describing the mark type (one of `\\\"bar\\\"`, `\\\"circle\\\"`, `\\\"square\\\"`, `\\\"tick\\\"`, `\\\"line\\\"`,\\n`\\\"area\\\"`, `\\\"point\\\"`, `\\\"rule\\\"`, and `\\\"text\\\"`) or a [mark definition object](mark.html#mark-def).\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"additionalProperties\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SelectionDef\"\n\t\t\t\t\t},\n\t\t\t\t\t\"description\": \"A key-value mapping between selection names and definitions.\",\n\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"width\": {\n\t\t\t\t\t\"description\": \"The width of a visualization.\\n\\n__Default value:__ This will be determined by the following rules:\\n\\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\\n\\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"mark\",\n\t\t\t\t\"encoding\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VConcatSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"vconcat\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Spec\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"vconcat\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Guide\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"description\": \"The formatting pattern for labels. This is D3's [number format pattern](https://github.com/d3/d3-format#locale_format) for quantitative fields and D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format) for time field.\\n\\nSee the [format documentation](format.html) for more information.\\n\\n__Default value:__ derived from [numberFormat](config.html#format) config for quantitative fields and from [timeFormat](config.html#format) config for temporal fields.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"description\": \"A title for the field.\\n\\n__Default value:__ derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has a function, the function is displayed as an all capped text with parentheses wrapping the field name (e.g., `\\\"SUM(field_name)\\\"`, `\\\"BIN(field_name)\\\"`, `\\\"YEAR(field_name)\\\"`). Otherwise, the title is simply the field name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Header\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"Headers of row / column channels for faceted plots.\",\n\t\t\t\"properties\": {\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"description\": \"The formatting pattern for labels. This is D3's [number format pattern](https://github.com/d3/d3-format#locale_format) for quantitative fields and D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format) for time field.\\n\\n__Default value:__ derived from [numberFormat](config.html#format) config for quantitative fields and from [timeFormat](config.html#format) config for temporal fields.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"description\": \"A title for the axis. Shows field name and its function by default.\\n\\n__Default value:__ derived from the field's name and transformation function applied e.g, \\\"field_name\\\", \\\"SUM(field_name)\\\", \\\"BIN(field_name)\\\", \\\"YEAR(field_name)\\\".\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"HorizontalAlign\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"left\",\n\t\t\t\t\"right\",\n\t\t\t\t\"center\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"InlineData\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/DataFormat\",\n\t\t\t\t\t\"description\": \"An object that specifies the format for parsing the data values.\"\n\t\t\t\t},\n\t\t\t\t\"values\": {\n\t\t\t\t\t\"description\": \"The full data set, included inline. This can be an array of objects or primitive values.\\nArrays of primitive values are ingested as objects with a `data` property.\",\n\t\t\t\t\t\"items\": {},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"values\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Interpolate\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"linear\",\n\t\t\t\t\"linear-closed\",\n\t\t\t\t\"step\",\n\t\t\t\t\"step-before\",\n\t\t\t\t\"step-after\",\n\t\t\t\t\"basis\",\n\t\t\t\t\"basis-open\",\n\t\t\t\t\"basis-closed\",\n\t\t\t\t\"cardinal\",\n\t\t\t\t\"cardinal-open\",\n\t\t\t\t\"cardinal-closed\",\n\t\t\t\t\"bundle\",\n\t\t\t\t\"monotone\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"InterpolateParams\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"gamma\": {\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"rgb\",\n\t\t\t\t\t\t\"cubehelix\",\n\t\t\t\t\t\t\"cubehelix-long\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"IntervalSelection\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"bind\": {\n\t\t\t\t\t\"description\": \"Establishes a two-way binding between the interval selection and the scales\\nused within the same view. This allows a user to interactively pan and\\nzoom the view.\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"scales\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"encodings\": {\n\t\t\t\t\t\"description\": \"An array of encoding channels. The corresponding data field values\\nmust match for a data tuple to fall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SingleDefChannel\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"fields\": {\n\t\t\t\t\t\"description\": \"An array of field names whose values must match for a data tuple to\\nfall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"mark\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/BrushConfig\",\n\t\t\t\t\t\"description\": \"An interval selection also adds a rectangle mark to depict the\\nextents of the interval. The `mark` property can be used to customize the\\nappearance of the mark.\"\n\t\t\t\t},\n\t\t\t\t\"on\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgEventStream\",\n\t\t\t\t\t\"description\": \"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionResolution\",\n\t\t\t\t\t\"description\": \"With layered and multi-view displays, a strategy that determines how\\nselections' data queries are resolved when applied in a filter transform,\\nconditional encoding rule, or scale domain.\"\n\t\t\t\t},\n\t\t\t\t\"translate\": {\n\t\t\t\t\t\"description\": \"When truthy, allows a user to interactively move an interval selection\\nback-and-forth. Can be `true`, `false` (to disable panning), or a\\n[Vega event stream definition](https://vega.github.io/vega/docs/event-streams/)\\nwhich must include a start and end event to trigger continuous panning.\\n\\n__Default value:__ `true`, which corresponds to\\n`[mousedown, window:mouseup] > window:mousemove!` which corresponds to\\nclicks and dragging within an interval selection to reposition it.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"interval\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"zoom\": {\n\t\t\t\t\t\"description\": \"When truthy, allows a user to interactively resize an interval selection.\\nCan be `true`, `false` (to disable zooming), or a [Vega event stream\\ndefinition](https://vega.github.io/vega/docs/event-streams/). Currently,\\nonly `wheel` events are supported.\\n\\n\\n__Default value:__ `true`, which corresponds to `wheel!`.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"IntervalSelectionConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"bind\": {\n\t\t\t\t\t\"description\": \"Establishes a two-way binding between the interval selection and the scales\\nused within the same view. This allows a user to interactively pan and\\nzoom the view.\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"scales\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"encodings\": {\n\t\t\t\t\t\"description\": \"An array of encoding channels. The corresponding data field values\\nmust match for a data tuple to fall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SingleDefChannel\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"fields\": {\n\t\t\t\t\t\"description\": \"An array of field names whose values must match for a data tuple to\\nfall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"mark\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/BrushConfig\",\n\t\t\t\t\t\"description\": \"An interval selection also adds a rectangle mark to depict the\\nextents of the interval. The `mark` property can be used to customize the\\nappearance of the mark.\"\n\t\t\t\t},\n\t\t\t\t\"on\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgEventStream\",\n\t\t\t\t\t\"description\": \"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionResolution\",\n\t\t\t\t\t\"description\": \"With layered and multi-view displays, a strategy that determines how\\nselections' data queries are resolved when applied in a filter transform,\\nconditional encoding rule, or scale domain.\"\n\t\t\t\t},\n\t\t\t\t\"translate\": {\n\t\t\t\t\t\"description\": \"When truthy, allows a user to interactively move an interval selection\\nback-and-forth. Can be `true`, `false` (to disable panning), or a\\n[Vega event stream definition](https://vega.github.io/vega/docs/event-streams/)\\nwhich must include a start and end event to trigger continuous panning.\\n\\n__Default value:__ `true`, which corresponds to\\n`[mousedown, window:mouseup] > window:mousemove!` which corresponds to\\nclicks and dragging within an interval selection to reposition it.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"zoom\": {\n\t\t\t\t\t\"description\": \"When truthy, allows a user to interactively resize an interval selection.\\nCan be `true`, `false` (to disable zooming), or a [Vega event stream\\ndefinition](https://vega.github.io/vega/docs/event-streams/). Currently,\\nonly `wheel` events are supported.\\n\\n\\n__Default value:__ `true`, which corresponds to `wheel!`.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"LayoutSizeMixins\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"height\": {\n\t\t\t\t\t\"description\": \"The height of a visualization.\\n\\n__Default value:__\\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\\n\\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"width\": {\n\t\t\t\t\t\"description\": \"The width of a visualization.\\n\\n__Default value:__ This will be determined by the following rules:\\n\\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\\n\\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Legend\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"Properties of a legend or boolean flag for determining whether to show it.\",\n\t\t\t\"properties\": {\n\t\t\t\t\"entryPadding\": {\n\t\t\t\t\t\"description\": \"Padding (in pixels) between legend entries in a symbol legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fillColor\": {\n\t\t\t\t\t\"description\": \"Background fill color for the full legend.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"description\": \"The formatting pattern for labels. This is D3's [number format pattern](https://github.com/d3/d3-format#locale_format) for quantitative fields and D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format) for time field.\\n\\nSee the [format documentation](format.html) for more information.\\n\\n__Default value:__ derived from [numberFormat](config.html#format) config for quantitative fields and from [timeFormat](config.html#format) config for temporal fields.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"offset\": {\n\t\t\t\t\t\"description\": \"The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle.\\n\\n__Default value:__ `0`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/LegendOrient\",\n\t\t\t\t\t\"description\": \"The orientation of the legend, which determines how the legend is positioned within the scene. One of \\\"left\\\", \\\"right\\\", \\\"top-left\\\", \\\"top-right\\\", \\\"bottom-left\\\", \\\"bottom-right\\\", \\\"none\\\".\\n\\n__Default value:__ `\\\"right\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between the legend and axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tickCount\": {\n\t\t\t\t\t\"description\": \"The desired number of tick values for quantitative legends.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"description\": \"A title for the field.\\n\\n__Default value:__ derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has a function, the function is displayed as an all capped text with parentheses wrapping the field name (e.g., `\\\"SUM(field_name)\\\"`, `\\\"BIN(field_name)\\\"`, `\\\"YEAR(field_name)\\\"`). Otherwise, the title is simply the field name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleAlign\": {\n\t\t\t\t\t\"description\": \"Horizontal text alignment for legend titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"description\": \"The type of the legend. Use `\\\"symbol\\\"` to create a discrete legend and `\\\"gradient\\\"` for a continuous color gradient.\\n\\n__Default value:__ `\\\"gradient\\\"` for non-binned quantitative fields and temporal fields; `\\\"symbol\\\"` otherwise.\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"symbol\",\n\t\t\t\t\t\t\"gradient\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"values\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/DateTime\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Explicitly set the visible legend values.\"\n\t\t\t\t},\n\t\t\t\t\"zindex\": {\n\t\t\t\t\t\"description\": \"A non-positive integer indicating z-index of the legend.\\nIf zindex is 0, legend should be drawn behind all chart elements.\\nTo put them in front, use zindex = 1.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"LegendConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"cornerRadius\": {\n\t\t\t\t\t\"description\": \"Corner radius for the full legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"entryPadding\": {\n\t\t\t\t\t\"description\": \"Padding (in pixels) between legend entries in a symbol legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fillColor\": {\n\t\t\t\t\t\"description\": \"Background fill color for the full legend.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"gradientHeight\": {\n\t\t\t\t\t\"description\": \"The height of the gradient, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gradientLabelBaseline\": {\n\t\t\t\t\t\"description\": \"Text baseline for color ramp gradient labels.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"gradientLabelLimit\": {\n\t\t\t\t\t\"description\": \"The maximum allowed length in pixels of color ramp gradient labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gradientLabelOffset\": {\n\t\t\t\t\t\"description\": \"Vertical offset in pixels for color ramp gradient labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gradientStrokeColor\": {\n\t\t\t\t\t\"description\": \"The color of the gradient stroke, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"gradientStrokeWidth\": {\n\t\t\t\t\t\"description\": \"The width of the gradient stroke, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gradientWidth\": {\n\t\t\t\t\t\"description\": \"The width of the gradient, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelAlign\": {\n\t\t\t\t\t\"description\": \"The alignment of the legend label, can be left, middle or right.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelBaseline\": {\n\t\t\t\t\t\"description\": \"The position of the baseline of legend label, can be top, middle or bottom.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelColor\": {\n\t\t\t\t\t\"description\": \"The color of the legend label, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelFont\": {\n\t\t\t\t\t\"description\": \"The font of the legend label.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelFontSize\": {\n\t\t\t\t\t\"description\": \"The font size of legend label.\\n\\n__Default value:__ `10`.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelLimit\": {\n\t\t\t\t\t\"description\": \"Maximum allowed pixel width of axis tick labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelOffset\": {\n\t\t\t\t\t\"description\": \"The offset of the legend label.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"offset\": {\n\t\t\t\t\t\"description\": \"The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle.\\n\\n__Default value:__ `0`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/LegendOrient\",\n\t\t\t\t\t\"description\": \"The orientation of the legend, which determines how the legend is positioned within the scene. One of \\\"left\\\", \\\"right\\\", \\\"top-left\\\", \\\"top-right\\\", \\\"bottom-left\\\", \\\"bottom-right\\\", \\\"none\\\".\\n\\n__Default value:__ `\\\"right\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between the legend and axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"shortTimeLabels\": {\n\t\t\t\t\t\"description\": \"Whether month names and weekday names should be abbreviated.\\n\\n__Default value:__ `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"strokeColor\": {\n\t\t\t\t\t\"description\": \"Border stroke color for the full legend.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"Border stroke dash pattern for the full legend.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"Border stroke width for the full legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"symbolColor\": {\n\t\t\t\t\t\"description\": \"The color of the legend symbol,\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"symbolSize\": {\n\t\t\t\t\t\"description\": \"The size of the legend symbol, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"symbolStrokeWidth\": {\n\t\t\t\t\t\"description\": \"The width of the symbol's stroke.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"symbolType\": {\n\t\t\t\t\t\"description\": \"Default shape type (such as \\\"circle\\\") for legend symbols.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleAlign\": {\n\t\t\t\t\t\"description\": \"Horizontal text alignment for legend titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleBaseline\": {\n\t\t\t\t\t\"description\": \"Optional mark property definitions for custom legend styling. \\n Vertical text baseline for legend titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleColor\": {\n\t\t\t\t\t\"description\": \"The color of the legend title, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleFont\": {\n\t\t\t\t\t\"description\": \"The font of the legend title.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleFontSize\": {\n\t\t\t\t\t\"description\": \"The font size of the legend title.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleFontWeight\": {\n\t\t\t\t\t\"description\": \"The font weight of the legend title.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"number\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"titleLimit\": {\n\t\t\t\t\t\"description\": \"Maximum allowed pixel width of axis titles.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titlePadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between title and legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"LegendFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"legend\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/Legend\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"An object defining properties of the legend.\\nIf `null`, the legend for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [legend properties](legend.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"scale\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Scale\",\n\t\t\t\t\t\"description\": \"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\n__Default value:__ If undefined, default [scale properties](scale.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"sort\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortOrder\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortField\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Sort order for the encoded field.\\nSupported `sort` values include `\\\"ascending\\\"`, `\\\"descending\\\"` and `null` (no sorting).\\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\\n\\n__Default value:__ `\\\"ascending\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"LegendOrient\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"left\",\n\t\t\t\t\"right\",\n\t\t\t\t\"top-left\",\n\t\t\t\t\"top-right\",\n\t\t\t\t\"bottom-left\",\n\t\t\t\t\"bottom-right\",\n\t\t\t\t\"none\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"LegendResolveMap\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"LocalMultiTimeUnit\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"yearquarter\",\n\t\t\t\t\"yearquartermonth\",\n\t\t\t\t\"yearmonth\",\n\t\t\t\t\"yearmonthdate\",\n\t\t\t\t\"yearmonthdatehours\",\n\t\t\t\t\"yearmonthdatehoursminutes\",\n\t\t\t\t\"yearmonthdatehoursminutesseconds\",\n\t\t\t\t\"quartermonth\",\n\t\t\t\t\"monthdate\",\n\t\t\t\t\"hoursminutes\",\n\t\t\t\t\"hoursminutesseconds\",\n\t\t\t\t\"minutesseconds\",\n\t\t\t\t\"secondsmilliseconds\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"LocalSingleTimeUnit\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"year\",\n\t\t\t\t\"quarter\",\n\t\t\t\t\"month\",\n\t\t\t\t\"day\",\n\t\t\t\t\"date\",\n\t\t\t\t\"hours\",\n\t\t\t\t\"minutes\",\n\t\t\t\t\"seconds\",\n\t\t\t\t\"milliseconds\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"AndFilter\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"and\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/FilterOperand\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"and\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SelectionAnd\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"and\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SelectionOperand\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"and\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"NotFilter\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"not\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FilterOperand\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"not\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SelectionNot\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"not\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionOperand\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"not\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"FilterOperand\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/NotFilter\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/AndFilter\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/OrFilter\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/Filter\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"SelectionOperand\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionNot\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionAnd\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionOr\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"OrFilter\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"or\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/FilterOperand\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"or\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SelectionOr\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"or\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SelectionOperand\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"or\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"LookupData\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"secondary data source to lookup in\"\n\t\t\t\t},\n\t\t\t\t\"fields\": {\n\t\t\t\t\t\"description\": \"(Optional) fields in foreign data to lookup\\nif not specificied, the entire object is queried\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"key\": {\n\t\t\t\t\t\"description\": \"key in data to lookup\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"data\",\n\t\t\t\t\"key\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"LookupTransform\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"as\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"(Optional) The field or fields for storing the computed formula value.\\nIf `from.fields` is not specified, `as` has to be a string and we put the whole object into the data\"\n\t\t\t\t},\n\t\t\t\t\"default\": {\n\t\t\t\t\t\"description\": \"(Optional) The default value to use if lookup fails\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"from\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/LookupData\",\n\t\t\t\t\t\"description\": \"secondary data reference\"\n\t\t\t\t},\n\t\t\t\t\"lookup\": {\n\t\t\t\t\t\"description\": \"key in primary data source\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"lookup\",\n\t\t\t\t\"from\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Mark\": {\n\t\t\t\"description\": \"All types of primitive marks.\",\n\t\t\t\"enum\": [\n\t\t\t\t\"area\",\n\t\t\t\t\"bar\",\n\t\t\t\t\"line\",\n\t\t\t\t\"point\",\n\t\t\t\t\"text\",\n\t\t\t\t\"tick\",\n\t\t\t\t\"rect\",\n\t\t\t\t\"rule\",\n\t\t\t\t\"circle\",\n\t\t\t\t\"square\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"MarkConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"align\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/HorizontalAlign\",\n\t\t\t\t\t\"description\": \"The horizontal alignment of the text. One of `\\\"left\\\"`, `\\\"right\\\"`, `\\\"center\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"angle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the text, in degrees.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"baseline\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VerticalAlign\",\n\t\t\t\t\t\"description\": \"The vertical alignment of the text. One of `\\\"top\\\"`, `\\\"middle\\\"`, `\\\"bottom\\\"`.\\n\\n__Default value:__ `\\\"middle\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"description\": \"Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\\n\\n__Default value:__ `\\\"#4682b4\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"dx\": {\n\t\t\t\t\t\"description\": \"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"dy\": {\n\t\t\t\t\t\"description\": \"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fill\": {\n\t\t\t\t\t\"description\": \"Default Fill Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fillOpacity\": {\n\t\t\t\t\t\"description\": \"The fill opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"filled\": {\n\t\t\t\t\t\"description\": \"Whether the mark's color should be used as fill color instead of stroke color.\\n\\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\\n\\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"font\": {\n\t\t\t\t\t\"description\": \"The typeface to set the text in (e.g., `\\\"Helvetica Neue\\\"`).\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fontSize\": {\n\t\t\t\t\t\"description\": \"The font size, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fontStyle\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FontStyle\",\n\t\t\t\t\t\"description\": \"The font style (e.g., `\\\"italic\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"fontWeight\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeight\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeightNumber\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The font weight (e.g., `\\\"bold\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"interpolate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Interpolate\",\n\t\t\t\t\t\"description\": \"The line interpolation method to use for line and area marks. One of the following:\\n- `\\\"linear\\\"`: piecewise linear segments, as in a polyline.\\n- `\\\"linear-closed\\\"`: close the linear segments to form a polygon.\\n- `\\\"step\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"step-before\\\"`: alternate between vertical and horizontal segments, as in a step function.\\n- `\\\"step-after\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"basis\\\"`: a B-spline, with control point duplication on the ends.\\n- `\\\"basis-open\\\"`: an open B-spline; may not intersect the start or end.\\n- `\\\"basis-closed\\\"`: a closed B-spline, as in a loop.\\n- `\\\"cardinal\\\"`: a Cardinal spline, with control point duplication on the ends.\\n- `\\\"cardinal-open\\\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\\n- `\\\"cardinal-closed\\\"`: a closed Cardinal spline, as in a loop.\\n- `\\\"bundle\\\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\\n- `\\\"monotone\\\"`: cubic interpolation that preserves monotonicity in y.\"\n\t\t\t\t},\n\t\t\t\t\"limit\": {\n\t\t\t\t\t\"description\": \"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"description\": \"The overall opacity (value between [0,1]).\\n\\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Orient\",\n\t\t\t\t\t\"description\": \"The orientation of a non-stacked bar, tick, area, and line charts.\\nThe value is either horizontal (default) or vertical.\\n- For bar, rule and tick, this determines whether the size of the bar and tick\\nshould be applied to x or y dimension.\\n- For area, this property determines the orient property of the Vega output.\\n- For line, this property determines the sort order of the points in the line\\nif `config.sortLineBy` is not specified.\\nFor stacked charts, this is always determined by the orientation of the stack;\\ntherefore explicitly specified value will be ignored.\"\n\t\t\t\t},\n\t\t\t\t\"radius\": {\n\t\t\t\t\t\"description\": \"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"description\": \"The default symbol shape to use. One of: `\\\"circle\\\"` (default), `\\\"square\\\"`, `\\\"cross\\\"`, `\\\"diamond\\\"`, `\\\"triangle-up\\\"`, or `\\\"triangle-down\\\"`, or a custom SVG path.\\n\\n__Default value:__ `\\\"circle\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"description\": \"The pixel area each the point/circle/square.\\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\\n\\n__Default value:__ `30`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"description\": \"Default Stroke Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"An array of alternating stroke, space lengths for creating dashed or dotted lines.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeDashOffset\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the stroke dash array.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"The stroke width, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tension\": {\n\t\t\t\t\t\"description\": \"Depending on the interpolation type, sets the tension parameter (for line and area marks).\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"description\": \"Placeholder text if the `text` channel is not specified\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"theta\": {\n\t\t\t\t\t\"description\": \"Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating \\\"north\\\".\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"MarkConfigMixins\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"area\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Area-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"bar\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/BarConfig\",\n\t\t\t\t\t\"description\": \"Bar-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"circle\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Circle-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"line\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Line-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"mark\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Mark Config \"\n\t\t\t\t},\n\t\t\t\t\"point\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Point-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"rect\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Rect-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"rule\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Rule-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"square\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MarkConfig\",\n\t\t\t\t\t\"description\": \"Square-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TextConfig\",\n\t\t\t\t\t\"description\": \"Text-Specific Config \"\n\t\t\t\t},\n\t\t\t\t\"tick\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TickConfig\",\n\t\t\t\t\t\"description\": \"Tick-Specific Config \"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"MarkDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"clip\": {\n\t\t\t\t\t\"description\": \"Whether a mark be clipped to the enclosing group’s width and height.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"filled\": {\n\t\t\t\t\t\"description\": \"Whether the mark's color should be used as fill color instead of stroke color.\\n\\n__Default value:__ All marks except `\\\"point\\\"`, `\\\"line\\\"`, and `\\\"rule\\\"` are filled by default.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"interpolate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Interpolate\",\n\t\t\t\t\t\"description\": \"The line interpolation method to use for line and area marks. One of the following:\\n- `\\\"linear\\\"`: piecewise linear segments, as in a polyline.\\n- `\\\"linear-closed\\\"`: close the linear segments to form a polygon.\\n- `\\\"step\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"step-before\\\"`: alternate between vertical and horizontal segments, as in a step function.\\n- `\\\"step-after\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"basis\\\"`: a B-spline, with control point duplication on the ends.\\n- `\\\"basis-open\\\"`: an open B-spline; may not intersect the start or end.\\n- `\\\"basis-closed\\\"`: a closed B-spline, as in a loop.\\n- `\\\"cardinal\\\"`: a Cardinal spline, with control point duplication on the ends.\\n- `\\\"cardinal-open\\\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\\n- `\\\"cardinal-closed\\\"`: a closed Cardinal spline, as in a loop.\\n- `\\\"bundle\\\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\\n- `\\\"monotone\\\"`: cubic interpolation that preserves monotonicity in y.\\n\\nFor more information about each interpolation method, please see [Vega's line interpolation docs](https://vega.github.io/vega/docs/marks/line/).\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Orient\",\n\t\t\t\t\t\"description\": \"Orientation of the marks.\"\n\t\t\t\t},\n\t\t\t\t\"style\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A string or array of strings indicating the name of custom styles to apply to the mark. A style is a named collection of mark property defaults defined within the [configuration](config.html). If style is an array, later styles will override earlier styles. Any [mark properties](encoding.html#mark-prop) explicitly defined within the `encoding` will override a style default.\\n\\n__Default value:__ The mark's name. For example, a bar mark will have style `\\\"bar\\\"` by default.\"\n\t\t\t\t},\n\t\t\t\t\"tension\": {\n\t\t\t\t\t\"description\": \"Depending on the interpolation type, sets the tension parameter (for line and area marks).\\n\\nTODO: provide the link to D3 docs.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Mark\",\n\t\t\t\t\t\"description\": \"The mark type.\\nOne of `\\\"bar\\\"`, `\\\"circle\\\"`, `\\\"square\\\"`, `\\\"tick\\\"`, `\\\"line\\\"`,\\n`\\\"area\\\"`, `\\\"point\\\"`, `\\\"rule\\\"`, and `\\\"text\\\"`.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Month\": {\n\t\t\t\"maximum\": 12,\n\t\t\t\"minimum\": 1,\n\t\t\t\"type\": \"number\"\n\t\t},\n\t\t\"MultiSelection\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"encodings\": {\n\t\t\t\t\t\"description\": \"An array of encoding channels. The corresponding data field values\\nmust match for a data tuple to fall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SingleDefChannel\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"fields\": {\n\t\t\t\t\t\"description\": \"An array of field names whose values must match for a data tuple to\\nfall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"nearest\": {\n\t\t\t\t\t\"description\": \"When true, an invisible voronoi diagram is computed to accelerate discrete\\nselection. The data value _nearest_ the mouse cursor is added to the selection.\\n\\nSee the [nearest transform](nearest.html) documentation for more information.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"on\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgEventStream\",\n\t\t\t\t\t\"description\": \"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionResolution\",\n\t\t\t\t\t\"description\": \"With layered and multi-view displays, a strategy that determines how\\nselections' data queries are resolved when applied in a filter transform,\\nconditional encoding rule, or scale domain.\"\n\t\t\t\t},\n\t\t\t\t\"toggle\": {\n\t\t\t\t\t\"description\": \"Controls whether data values should be toggled or only ever inserted into\\nmulti selections. Can be `true`, `false` (for insertion only), or a\\n[Vega expression](https://vega.github.io/vega/docs/expressions/).\\n\\n__Default value:__ `true`, which corresponds to `event.shiftKey` (i.e.,\\ndata values are toggled when a user interacts with the shift-key pressed).\\n\\nSee the [toggle transform](toggle.html) documentation for more information.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"multi\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"MultiSelectionConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"encodings\": {\n\t\t\t\t\t\"description\": \"An array of encoding channels. The corresponding data field values\\nmust match for a data tuple to fall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SingleDefChannel\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"fields\": {\n\t\t\t\t\t\"description\": \"An array of field names whose values must match for a data tuple to\\nfall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"nearest\": {\n\t\t\t\t\t\"description\": \"When true, an invisible voronoi diagram is computed to accelerate discrete\\nselection. The data value _nearest_ the mouse cursor is added to the selection.\\n\\nSee the [nearest transform](nearest.html) documentation for more information.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"on\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgEventStream\",\n\t\t\t\t\t\"description\": \"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionResolution\",\n\t\t\t\t\t\"description\": \"With layered and multi-view displays, a strategy that determines how\\nselections' data queries are resolved when applied in a filter transform,\\nconditional encoding rule, or scale domain.\"\n\t\t\t\t},\n\t\t\t\t\"toggle\": {\n\t\t\t\t\t\"description\": \"Controls whether data values should be toggled or only ever inserted into\\nmulti selections. Can be `true`, `false` (for insertion only), or a\\n[Vega expression](https://vega.github.io/vega/docs/expressions/).\\n\\n__Default value:__ `true`, which corresponds to `event.shiftKey` (i.e.,\\ndata values are toggled when a user interacts with the shift-key pressed).\\n\\nSee the [toggle transform](toggle.html) documentation for more information.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"MultiTimeUnit\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/LocalMultiTimeUnit\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/UtcMultiTimeUnit\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"NamedData\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/DataFormat\",\n\t\t\t\t\t\"description\": \"An object that specifies the format for parsing the data.\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Provide a placeholder name and bind data at runtime.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"name\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"NiceTime\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"second\",\n\t\t\t\t\"minute\",\n\t\t\t\t\"hour\",\n\t\t\t\t\"day\",\n\t\t\t\t\"week\",\n\t\t\t\t\"month\",\n\t\t\t\t\"year\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"OneOfFilter\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"description\": \"Field to be filtered\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"oneOf\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/DateTime\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A set of values that the `field`'s value should be a member of,\\nfor a data item included in the filtered data.\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"time unit for the field to be filtered.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"field\",\n\t\t\t\t\"oneOf\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"OrderFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"sort\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SortOrder\",\n\t\t\t\t\t\"description\": \"The sort order. One of `\\\"ascending\\\"` (default) or `\\\"descending\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Orient\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"horizontal\",\n\t\t\t\t\"vertical\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"Padding\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"additionalProperties\": false,\n\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\"bottom\": {\n\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"left\": {\n\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"right\": {\n\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"top\": {\n\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"minimum\": 0\n\t\t},\n\t\t\"PositionFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"axis\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/Axis\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"An object defining properties of axis's gridlines, ticks and labels.\\nIf `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](axis.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"scale\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Scale\",\n\t\t\t\t\t\"description\": \"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\n__Default value:__ If undefined, default [scale properties](scale.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"sort\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortOrder\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortField\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Sort order for the encoded field.\\nSupported `sort` values include `\\\"ascending\\\"`, `\\\"descending\\\"` and `null` (no sorting).\\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\\n\\n__Default value:__ `\\\"ascending\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"stack\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/StackOffset\",\n\t\t\t\t\t\"description\": \"Type of stacking offset if the field should be stacked.\\n`stack` is only applicable for `x` and `y` channels with continuous domains.\\nFor example, `stack` of `y` can be used to customize stacking for a vertical bar chart.\\n\\n`stack` can be one of the following values:\\n- `\\\"zero\\\"`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](stack.html#bar) and [area](stack.html#area) chart).\\n- `\\\"normalize\\\"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](stack.html#normalized).
\\n-`\\\"center\\\"` - stacking with center baseline (for [streamgraph](stack.html#streamgraph)).\\n- `\\\"none\\\"` - No-stacking. This will produce layered [bar](stack.html#layered-bar-chart) and area chart.\\n\\n__Default value:__ `zero` for plots with all of the following conditions are true: (1) `bar` or `area` marks (2) At least one of `color`, `opacity`, `size`, or `detail` channel mapped to a group-by field (3) one position channel has a linear scale and summative aggregation function (e.g., `sum`, `count`) and (4) the other position channel either has discrete domain or unmapped. Otherwise `\\\"none\\\"` by default.\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"RangeConfig\": {\n\t\t\t\"additionalProperties\": {\n\t\t\t\t\"$ref\": \"#/definitions/RangeConfigValue\"\n\t\t\t},\n\t\t\t\"properties\": {\n\t\t\t\t\"category\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgScheme\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Default range for _nominal_ (categorical) fields.\"\n\t\t\t\t},\n\t\t\t\t\"diverging\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgScheme\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Default range for diverging _quantitative_ fields.\"\n\t\t\t\t},\n\t\t\t\t\"heatmap\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgScheme\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Default range for _quantitative_ heatmaps.\"\n\t\t\t\t},\n\t\t\t\t\"ordinal\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgScheme\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Default range for _ordinal_ fields.\"\n\t\t\t\t},\n\t\t\t\t\"ramp\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgScheme\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Default range for _quantitative_ and _temporal_ fields.\"\n\t\t\t\t},\n\t\t\t\t\"symbol\": {\n\t\t\t\t\t\"description\": \"Default range palette for the `shape` channel.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"RangeConfigValue\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\t\t\"string\"\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/VgScheme\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"additionalProperties\": false,\n\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\"step\": {\n\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"required\": [\n\t\t\t\t\t\t\"step\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"RangeFilter\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"description\": \"Field to be filtered\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"range\": {\n\t\t\t\t\t\"description\": \"An array of inclusive minimum and maximum values\\nfor a field value of a data item to be included in the filtered data.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/DateTime\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"maxItems\": 2,\n\t\t\t\t\t\"minItems\": 2,\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"time unit for the field to be filtered.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"field\",\n\t\t\t\t\"range\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Repeat\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"column\": {\n\t\t\t\t\t\"description\": \"Horizontal repeated views.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"row\": {\n\t\t\t\t\t\"description\": \"Vertical repeated views.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"RepeatRef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"Reference to a repeated value.\",\n\t\t\t\"properties\": {\n\t\t\t\t\"repeat\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"row\",\n\t\t\t\t\t\t\"column\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"repeat\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Resolve\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"axis\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AxisResolveMap\"\n\t\t\t\t},\n\t\t\t\t\"legend\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/LegendResolveMap\"\n\t\t\t\t},\n\t\t\t\t\"scale\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ScaleResolveMap\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ResolveMode\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"independent\",\n\t\t\t\t\"shared\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"Scale\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"base\": {\n\t\t\t\t\t\"description\": \"The logarithm base of the `log` scale (default `10`).\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"clamp\": {\n\t\t\t\t\t\"description\": \"If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\\n\\n__Default value:__ derived from the [scale config](config.html#scale-config)'s `clamp` (`true` by default).\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"domain\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/DateTime\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"unaggregated\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SelectionDomain\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Customized domain values.\\n\\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values. [Piecewise scales](scale.html#piecewise) can be created by providing a `domain` with more than two entries.\\nIf the input field is aggregated, `domain` can also be a string value `\\\"unaggregated\\\"`, indicating that the domain should include the raw data values prior to the aggregation.\\n\\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](types.html#datetime).\\n\\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values.\\n\\nThe `selection` property can be used to [interactively determine](selection.html#scale-domains) the scale domain.\"\n\t\t\t\t},\n\t\t\t\t\"exponent\": {\n\t\t\t\t\t\"description\": \"The exponent of the `pow` scale.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"interpolate\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/Interpolate\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/InterpolateParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in RGB space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\"\n\t\t\t\t},\n\t\t\t\t\"nice\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/NiceTime\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"additionalProperties\": false,\n\t\t\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\t\t\"interval\": {\n\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"step\": {\n\t\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"required\": [\n\t\t\t\t\t\t\t\t\"interval\",\n\t\t\t\t\t\t\t\t\"step\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\\n\\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\\n\\nFor temporal fields with time and utc scales, the `nice` value can be a string indicating the desired time interval. Legal values are `\\\"millisecond\\\"`, `\\\"second\\\"`, `\\\"minute\\\"`, `\\\"hour\\\"`, `\\\"day\\\"`, `\\\"week\\\"`, `\\\"month\\\"`, and `\\\"year\\\"`. Alternatively, `time` and `utc` scales can accept an object-valued interval specifier of the form `{\\\"interval\\\": \\\"month\\\", \\\"step\\\": 3}`, which includes a desired number of interval steps. Here, the domain would snap to quarter (Jan, Apr, Jul, Oct) boundaries.\\n\\n__Default value:__ `true` for unbinned _quantitative_ fields; automatically determined based on the time unit for _temporal_ fields.\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"description\": \"Shortcut for setting `paddingInner` and `paddingOuter` to the same value. For point scales, this property only affects `paddingOuter`.\\n\\n__Default value:__ see `paddingInner` and `paddingOuter`.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"paddingInner\": {\n\t\t\t\t\t\"description\": \"The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\\n\\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\\n\\n__Default value:__ derived from the [scale config](scale.html#config)'s `bandPaddingInner`.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"paddingOuter\": {\n\t\t\t\t\t\"description\": \"The outer padding (spacing) at the ends of the range of band and point scales,\\nas a fraction of the step size. This value must lie in the range [0,1].\\n\\n__Default value:__ derived from the [scale config](scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"range\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The range of the scale. One of:\\n\\n- A string indicating a [pre-defined named scale range](scale.html#range-config) (e.g., example, `\\\"symbol\\\"`, or `\\\"diverging\\\"`).\\n\\n- For [continuous scales](scale.html#continuous), two-element array indicating minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](scale.html#piecewise).\\n\\n- For [discrete](scale.html#discrete) and [discretizing](scale.html#discretizing) scales, an array of desired output values.\\n\\n__Notes:__\\n\\n1) For [sequential](scale.html#sequential), [ordinal](scale.html#ordinal), and discretizing color scales, you can also specify a color [`scheme`](scale.html#scheme) instead of `range`.\\n\\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](size.html) (`width` and `height`) or via [range steps and paddings properties](#range-step) for [band](#band) and [point](#point) scales.\"\n\t\t\t\t},\n\t\t\t\t\"rangeStep\": {\n\t\t\t\t\t\"description\": \"The distance between the starts of adjacent bands or points in [band](scale.html#band) and [point](scale.html#point) scales.\\n\\nIf `rangeStep` is `null` or if the view contains the scale's corresponding [size](size.html) (`width` for `x` scales and `height` for `y` scales), `rangeStep` will be automatically determined to fit the size of the view.\\n\\n__Default value:__ derived the [scale config](config.html#scale-config)'s `textXRangeStep` (`90` by default) for x-scales of `text` marks and `rangeStep` (`21` by default) for x-scales of other marks and y-scales.\\n\\n__Warning__: If `rangeStep` is `null` and the cardinality of the scale's domain is higher than `width` or `height`, the rangeStep might become less than one pixel and the mark might not appear correctly.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\t\"null\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"round\": {\n\t\t\t\t\t\"description\": \"If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\\n\\n__Default value:__ `false`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"scheme\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SchemeParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A string indicating a color [scheme](scale.html#scheme) name (e.g., `\\\"category10\\\"` or `\\\"viridis\\\"`) or a [scheme parameter object](scale.html#scheme-params).\\n\\nDiscrete color schemes may be used with [discrete](scale.html#discrete) or [discretizing](scale.html#discretizing) scales. Continuous color schemes are intended for use with [sequential](scales.html#sequential) scales.\\n\\nFor the full list of supported scheme, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ScaleType\",\n\t\t\t\t\t\"description\": \"The type of scale. Vega-Lite supports the following categories of scale types:\\n\\n1) [**Continuous Scales**](scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\\\"linear\\\"`](scale.html#linear), [`\\\"pow\\\"`](scale.html#pow), [`\\\"sqrt\\\"`](scale.html#sqrt), [`\\\"log\\\"`](scale.html#log), [`\\\"time\\\"`](scale.html#time), [`\\\"utc\\\"`](scale.html#utc), [`\\\"sequential\\\"`](scale.html#sequential)).\\n\\n2) [**Discrete Scales**](scale.html#discrete) -- mapping discrete domains to discrete ([`\\\"ordinal\\\"`](scale.html#ordinal)) or continuous ([`\\\"band\\\"`](scale.html#band) and [`\\\"point\\\"`](scale.html#point)) output ranges.\\n\\n3) [**Discretizing Scales**](scale.html#discretizing) -- mapping continuous domains to discrete output ranges ([`\\\"bin-linear\\\"`](scale.html#bin-linear) and [`\\\"bin-ordinal\\\"`](scale.html#bin-ordinal)).\\n\\n__Default value:__ please see the [scale type table](scale.html#type).\"\n\t\t\t\t},\n\t\t\t\t\"zero\": {\n\t\t\t\t\t\"description\": \"If `true`, ensures that a zero baseline value is included in the scale domain.\\n\\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\\n\\n__Note:__ Log, time, and utc scales do not support `zero`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ScaleConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"bandPaddingInner\": {\n\t\t\t\t\t\"description\": \"Default inner padding for `x` and `y` band-ordinal scales.\\n\\n__Default value:__ `0.1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"bandPaddingOuter\": {\n\t\t\t\t\t\"description\": \"Default outer padding for `x` and `y` band-ordinal scales.\\nIf not specified, by default, band scale's paddingOuter is paddingInner/2.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"clamp\": {\n\t\t\t\t\t\"description\": \"If true, values that exceed the data domain are clamped to either the minimum or maximum range value\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"maxBandSize\": {\n\t\t\t\t\t\"description\": \"The default max value for mapping quantitative fields to bar's size/bandSize.\\n\\nIf undefined (default), we will use the scale's `rangeStep` - 1.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"maxFontSize\": {\n\t\t\t\t\t\"description\": \"The default max value for mapping quantitative fields to text's size/fontSize.\\n\\n__Default value:__ `40`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"maxOpacity\": {\n\t\t\t\t\t\"description\": \"Default max opacity for mapping a field to opacity.\\n\\n__Default value:__ `0.8`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"maxSize\": {\n\t\t\t\t\t\"description\": \"Default max value for point size scale.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"maxStrokeWidth\": {\n\t\t\t\t\t\"description\": \"Default max strokeWidth for strokeWidth (or rule/line's size) scale.\\n\\n__Default value:__ `4`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minBandSize\": {\n\t\t\t\t\t\"description\": \"The default min value for mapping quantitative fields to bar and tick's size/bandSize scale with zero=false.\\n\\n__Default value:__ `2`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minFontSize\": {\n\t\t\t\t\t\"description\": \"The default min value for mapping quantitative fields to tick's size/fontSize scale with zero=false\\n\\n__Default value:__ `8`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minOpacity\": {\n\t\t\t\t\t\"description\": \"Default minimum opacity for mapping a field to opacity.\\n\\n__Default value:__ `0.3`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minSize\": {\n\t\t\t\t\t\"description\": \"Default minimum value for point size scale with zero=false.\\n\\n__Default value:__ `9`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minStrokeWidth\": {\n\t\t\t\t\t\"description\": \"Default minimum strokeWidth for strokeWidth (or rule/line's size) scale with zero=false.\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"pointPadding\": {\n\t\t\t\t\t\"description\": \"Default outer padding for `x` and `y` point-ordinal scales.\\n\\n__Default value:__ `0.5`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"rangeStep\": {\n\t\t\t\t\t\"description\": \"Default range step for band and point scales of (1) the `y` channel\\nand (2) the `x` channel when the mark is not `text`.\\n\\n__Default value:__ `21`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\t\"null\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"round\": {\n\t\t\t\t\t\"description\": \"If true, rounds numeric output values to integers.\\nThis can be helpful for snapping to the pixel grid.\\n(Only available for `x`, `y`, and `size` scales.)\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"textXRangeStep\": {\n\t\t\t\t\t\"description\": \"Default range step for `x` band and point scales of text marks.\\n\\n__Default value:__ `90`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"useUnaggregatedDomain\": {\n\t\t\t\t\t\"description\": \"Use the source data range before aggregation as scale domain instead of aggregated data for aggregate axis.\\n\\nThis is equivalent to setting `domain` to `\\\"unaggregate\\\"` for aggregated _quantitative_ fields by default.\\n\\nThis property only works with aggregate functions that produce values within the raw data domain (`\\\"mean\\\"`, `\\\"average\\\"`, `\\\"median\\\"`, `\\\"q1\\\"`, `\\\"q3\\\"`, `\\\"min\\\"`, `\\\"max\\\"`). For other aggregations that produce values outside of the raw data domain (e.g. `\\\"count\\\"`, `\\\"sum\\\"`), this property is ignored.\\n\\n__Default value:__ `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ScaleFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"scale\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Scale\",\n\t\t\t\t\t\"description\": \"An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\n__Default value:__ If undefined, default [scale properties](scale.html) are applied.\"\n\t\t\t\t},\n\t\t\t\t\"sort\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortOrder\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/SortField\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Sort order for the encoded field.\\nSupported `sort` values include `\\\"ascending\\\"`, `\\\"descending\\\"` and `null` (no sorting).\\nFor fields with discrete domains, `sort` can also be a [sort field definition object](sort.html#sort-field).\\n\\n__Default value:__ `\\\"ascending\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ScaleResolveMap\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"x\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t},\n\t\t\t\t\"y\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ResolveMode\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ScaleType\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"linear\",\n\t\t\t\t\"bin-linear\",\n\t\t\t\t\"log\",\n\t\t\t\t\"pow\",\n\t\t\t\t\"sqrt\",\n\t\t\t\t\"time\",\n\t\t\t\t\"utc\",\n\t\t\t\t\"sequential\",\n\t\t\t\t\"ordinal\",\n\t\t\t\t\"bin-ordinal\",\n\t\t\t\t\"point\",\n\t\t\t\t\"band\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"SchemeParams\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"extent\": {\n\t\t\t\t\t\"description\": \"For sequential and diverging schemes only, determines the extent of the color range to use. For example `[0.2, 1]` will rescale the color scheme such that color values in the range _[0, 0.2)_ are excluded from the scheme.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"A color scheme name for sequential/ordinal scales (e.g., `\\\"category10\\\"` or `\\\"viridis\\\"`).\\n\\nFor the full list of supported scheme, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"name\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SelectionConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"interval\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/IntervalSelectionConfig\",\n\t\t\t\t\t\"description\": \"The default definition for an [`interval`](selection.html#type) selection. All properties and transformations\\nfor an interval selection definition (except `type`) may be specified here.\\n\\nFor instance, setting `interval` to `{\\\"translate\\\": false}` disables the ability to move\\ninterval selections by default.\"\n\t\t\t\t},\n\t\t\t\t\"multi\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/MultiSelectionConfig\",\n\t\t\t\t\t\"description\": \"The default definition for a [`multi`](selection.html#type) selection. All properties and transformations\\nfor a multi selection definition (except `type`) may be specified here.\\n\\nFor instance, setting `multi` to `{\\\"toggle\\\": \\\"event.altKey\\\"}` adds additional values to\\nmulti selections when clicking with the alt-key pressed by default.\"\n\t\t\t\t},\n\t\t\t\t\"single\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SingleSelectionConfig\",\n\t\t\t\t\t\"description\": \"The default definition for a [`single`](selection.html#type) selection. All properties and transformations\\n for a single selection definition (except `type`) may be specified here.\\n\\nFor instance, setting `single` to `{\\\"on\\\": \\\"dblclick\\\"}` populates single selections on double-click by default.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SelectionDef\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/SingleSelection\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/MultiSelection\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/IntervalSelection\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"SelectionDomain\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"additionalProperties\": false,\n\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\"field\": {\n\t\t\t\t\t\t\t\"description\": \"The field name to extract selected values for, when a selection is [projected](project.html)\\nover multiple fields or encodings.\",\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"selection\": {\n\t\t\t\t\t\t\t\"description\": \"The name of a selection.\",\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"required\": [\n\t\t\t\t\t\t\"selection\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"additionalProperties\": false,\n\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\"encoding\": {\n\t\t\t\t\t\t\t\"description\": \"The encoding channel to extract selected values for, when a selection is [projected](project.html)\\nover multiple fields or encodings.\",\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"selection\": {\n\t\t\t\t\t\t\t\"description\": \"The name of a selection.\",\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"required\": [\n\t\t\t\t\t\t\"selection\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"SelectionFilter\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionOperand\",\n\t\t\t\t\t\"description\": \"Filter using a selection name.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"selection\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SelectionResolution\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"global\",\n\t\t\t\t\"union\",\n\t\t\t\t\"intersect\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"SingleDefChannel\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"x\",\n\t\t\t\t\"y\",\n\t\t\t\t\"x2\",\n\t\t\t\t\"y2\",\n\t\t\t\t\"row\",\n\t\t\t\t\"column\",\n\t\t\t\t\"size\",\n\t\t\t\t\"shape\",\n\t\t\t\t\"color\",\n\t\t\t\t\"opacity\",\n\t\t\t\t\"text\",\n\t\t\t\t\"tooltip\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"SingleSelection\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"bind\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgBinding\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"additionalProperties\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgBinding\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Establish a two-way binding between a single selection and input elements\\n(also known as dynamic query widgets). A binding takes the form of\\nVega's [input element binding definition](https://vega.github.io/vega/docs/signals/#bind)\\nor can be a mapping between projected field/encodings and binding definitions.\\n\\nSee the [bind transform](bind.html) documentation for more information.\"\n\t\t\t\t},\n\t\t\t\t\"encodings\": {\n\t\t\t\t\t\"description\": \"An array of encoding channels. The corresponding data field values\\nmust match for a data tuple to fall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SingleDefChannel\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"fields\": {\n\t\t\t\t\t\"description\": \"An array of field names whose values must match for a data tuple to\\nfall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"nearest\": {\n\t\t\t\t\t\"description\": \"When true, an invisible voronoi diagram is computed to accelerate discrete\\nselection. The data value _nearest_ the mouse cursor is added to the selection.\\n\\nSee the [nearest transform](nearest.html) documentation for more information.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"on\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgEventStream\",\n\t\t\t\t\t\"description\": \"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionResolution\",\n\t\t\t\t\t\"description\": \"With layered and multi-view displays, a strategy that determines how\\nselections' data queries are resolved when applied in a filter transform,\\nconditional encoding rule, or scale domain.\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"single\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SingleSelectionConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"bind\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgBinding\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"additionalProperties\": {\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/VgBinding\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Establish a two-way binding between a single selection and input elements\\n(also known as dynamic query widgets). A binding takes the form of\\nVega's [input element binding definition](https://vega.github.io/vega/docs/signals/#bind)\\nor can be a mapping between projected field/encodings and binding definitions.\\n\\nSee the [bind transform](bind.html) documentation for more information.\"\n\t\t\t\t},\n\t\t\t\t\"encodings\": {\n\t\t\t\t\t\"description\": \"An array of encoding channels. The corresponding data field values\\nmust match for a data tuple to fall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SingleDefChannel\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"fields\": {\n\t\t\t\t\t\"description\": \"An array of field names whose values must match for a data tuple to\\nfall within the selection.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"nearest\": {\n\t\t\t\t\t\"description\": \"When true, an invisible voronoi diagram is computed to accelerate discrete\\nselection. The data value _nearest_ the mouse cursor is added to the selection.\\n\\nSee the [nearest transform](nearest.html) documentation for more information.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"on\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VgEventStream\",\n\t\t\t\t\t\"description\": \"A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection.\\nFor interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters).\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionResolution\",\n\t\t\t\t\t\"description\": \"With layered and multi-view displays, a strategy that determines how\\nselections' data queries are resolved when applied in a filter transform,\\nconditional encoding rule, or scale domain.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SingleTimeUnit\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/LocalSingleTimeUnit\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/UtcSingleTimeUnit\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"SortField\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"description\": \"The data field to sort by.\\n\\n__Default value:__ If unspecified, defaults to the field specified in the outer data reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"op\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AggregateOp\",\n\t\t\t\t\t\"description\": \"An [aggregate operation](aggregate.html#ops) to perform on the field prior to sorting (e.g., `\\\"count\\\"`, `\\\"mean\\\"` and `\\\"median\\\"`).\\nThis property is required in cases where the sort field and the data reference field do not match.\\nThe input data objects will be aggregated, grouped by the encoded data field.\\n\\nFor a full list of operations, please see the documentation for [aggregate](aggregate.html#ops).\"\n\t\t\t\t},\n\t\t\t\t\"order\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SortOrder\",\n\t\t\t\t\t\"description\": \"The sort order. One of `\\\"ascending\\\"` (default) or `\\\"descending\\\"`.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"op\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SortOrder\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"ascending\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"descending\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"null\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"StackOffset\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"zero\",\n\t\t\t\t\"center\",\n\t\t\t\t\"normalize\",\n\t\t\t\t\"none\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"StyleConfigIndex\": {\n\t\t\t\"additionalProperties\": {\n\t\t\t\t\"$ref\": \"#/definitions/VgMarkConfig\"\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Summarize\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AggregateOp\",\n\t\t\t\t\t\"description\": \"The aggregation operations to apply to the fields, such as sum, average or count.\\nSee the [full list of supported aggregation operations](https://vega.github.io/vega-lite/docs/aggregate.html#supported-aggregation-operations)\\nfor more information.\"\n\t\t\t\t},\n\t\t\t\t\"as\": {\n\t\t\t\t\t\"description\": \"The output field names to use for each aggregated field.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"description\": \"The data field for which to compute aggregate function.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"aggregate\",\n\t\t\t\t\"field\",\n\t\t\t\t\"as\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"SummarizeTransform\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"groupby\": {\n\t\t\t\t\t\"description\": \"The data fields to group by. If not specified, a single group containing all data objects will be used.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"summarize\": {\n\t\t\t\t\t\"description\": \"Array of objects that define aggregate fields.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Summarize\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"summarize\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TextConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"align\": {\n\t\t\t\t\t\"description\": \"The horizontal text alignment.\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"left\",\n\t\t\t\t\t\t\"center\",\n\t\t\t\t\t\t\"right\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"angle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the text, in degrees.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"baseline\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VerticalAlign\",\n\t\t\t\t\t\"description\": \"The vertical alignment of the text. One of `\\\"top\\\"`, `\\\"middle\\\"`, `\\\"bottom\\\"`.\\n\\n__Default value:__ `\\\"middle\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"description\": \"Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\\n\\n__Default value:__ `\\\"#4682b4\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"dx\": {\n\t\t\t\t\t\"description\": \"The horizontal offset in pixels (before rotation), between the text and anchor point.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"dy\": {\n\t\t\t\t\t\"description\": \"The vertical offset in pixels (before rotation), between the text and anchor point.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fill\": {\n\t\t\t\t\t\"description\": \"Default Fill Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fillOpacity\": {\n\t\t\t\t\t\"description\": \"The fill opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"filled\": {\n\t\t\t\t\t\"description\": \"Whether the mark's color should be used as fill color instead of stroke color.\\n\\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\\n\\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"font\": {\n\t\t\t\t\t\"description\": \"The typeface to set the text in (e.g., `\\\"Helvetica Neue\\\"`).\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fontSize\": {\n\t\t\t\t\t\"description\": \"The font size, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fontStyle\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FontStyle\",\n\t\t\t\t\t\"description\": \"The font style (e.g., `\\\"italic\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"fontWeight\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeight\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeightNumber\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The font weight (e.g., `\\\"bold\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"interpolate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Interpolate\",\n\t\t\t\t\t\"description\": \"The line interpolation method to use for line and area marks. One of the following:\\n- `\\\"linear\\\"`: piecewise linear segments, as in a polyline.\\n- `\\\"linear-closed\\\"`: close the linear segments to form a polygon.\\n- `\\\"step\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"step-before\\\"`: alternate between vertical and horizontal segments, as in a step function.\\n- `\\\"step-after\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"basis\\\"`: a B-spline, with control point duplication on the ends.\\n- `\\\"basis-open\\\"`: an open B-spline; may not intersect the start or end.\\n- `\\\"basis-closed\\\"`: a closed B-spline, as in a loop.\\n- `\\\"cardinal\\\"`: a Cardinal spline, with control point duplication on the ends.\\n- `\\\"cardinal-open\\\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\\n- `\\\"cardinal-closed\\\"`: a closed Cardinal spline, as in a loop.\\n- `\\\"bundle\\\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\\n- `\\\"monotone\\\"`: cubic interpolation that preserves monotonicity in y.\"\n\t\t\t\t},\n\t\t\t\t\"limit\": {\n\t\t\t\t\t\"description\": \"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"description\": \"The overall opacity (value between [0,1]).\\n\\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Orient\",\n\t\t\t\t\t\"description\": \"The orientation of a non-stacked bar, tick, area, and line charts.\\nThe value is either horizontal (default) or vertical.\\n- For bar, rule and tick, this determines whether the size of the bar and tick\\nshould be applied to x or y dimension.\\n- For area, this property determines the orient property of the Vega output.\\n- For line, this property determines the sort order of the points in the line\\nif `config.sortLineBy` is not specified.\\nFor stacked charts, this is always determined by the orientation of the stack;\\ntherefore explicitly specified value will be ignored.\"\n\t\t\t\t},\n\t\t\t\t\"radius\": {\n\t\t\t\t\t\"description\": \"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"description\": \"The default symbol shape to use. One of: `\\\"circle\\\"` (default), `\\\"square\\\"`, `\\\"cross\\\"`, `\\\"diamond\\\"`, `\\\"triangle-up\\\"`, or `\\\"triangle-down\\\"`, or a custom SVG path.\\n\\n__Default value:__ `\\\"circle\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"shortTimeLabels\": {\n\t\t\t\t\t\"description\": \"Whether month names and weekday names should be abbreviated.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"description\": \"The pixel area each the point/circle/square.\\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\\n\\n__Default value:__ `30`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"description\": \"Default Stroke Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"An array of alternating stroke, space lengths for creating dashed or dotted lines.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeDashOffset\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the stroke dash array.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"The stroke width, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tension\": {\n\t\t\t\t\t\"description\": \"Depending on the interpolation type, sets the tension parameter (for line and area marks).\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"description\": \"Placeholder text if the `text` channel is not specified\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"theta\": {\n\t\t\t\t\t\"description\": \"Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating \\\"north\\\".\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TextFieldDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"aggregate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Aggregate\",\n\t\t\t\t\t\"description\": \"Aggregation function for the field\\n(e.g., `mean`, `sum`, `median`, `min`, `max`, `count`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"bin\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/BinParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A flag for binning a `quantitative` field, or [an object defining binning parameters](bin.html#params).\\nIf `true`, default [binning parameters](bin.html) will be applied.\\n\\n__Default value:__ `false`\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Field\",\n\t\t\t\t\t\"description\": \"__Required.__ A string defining the name of the field from which to pull a data value\\nor an object defining iterated values from the [`repeat`](repeat.html) operator.\\n\\n__Note:__ `field` is not required if `aggregate` is `count`.\"\n\t\t\t\t},\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"description\": \"The [formatting pattern](format.html) for a text field. If not defined, this will be determined automatically.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"Time unit for a `temporal` field (e.g., `year`, `yearmonth`, `month`, `hour`).\\n\\n__Default value:__ `undefined` (None)\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Type\",\n\t\t\t\t\t\"description\": \"The encoded field's type of measurement. This can be either a full type\\nname (`\\\"quantitative\\\"`, `\\\"temporal\\\"`, `\\\"ordinal\\\"`, and `\\\"nominal\\\"`).\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"type\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TickConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"align\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/HorizontalAlign\",\n\t\t\t\t\t\"description\": \"The horizontal alignment of the text. One of `\\\"left\\\"`, `\\\"right\\\"`, `\\\"center\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"angle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the text, in degrees.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"bandSize\": {\n\t\t\t\t\t\"description\": \"The width of the ticks.\\n\\n__Default value:__ 2/3 of rangeStep.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"baseline\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VerticalAlign\",\n\t\t\t\t\t\"description\": \"The vertical alignment of the text. One of `\\\"top\\\"`, `\\\"middle\\\"`, `\\\"bottom\\\"`.\\n\\n__Default value:__ `\\\"middle\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"description\": \"Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`.\\n\\n__Default value:__ `\\\"#4682b4\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"dx\": {\n\t\t\t\t\t\"description\": \"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"dy\": {\n\t\t\t\t\t\"description\": \"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fill\": {\n\t\t\t\t\t\"description\": \"Default Fill Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fillOpacity\": {\n\t\t\t\t\t\"description\": \"The fill opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"filled\": {\n\t\t\t\t\t\"description\": \"Whether the mark's color should be used as fill color instead of stroke color.\\n\\n__Default value:__ `true` for all marks except `point` and `false` for `point`.\\n\\n__Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"font\": {\n\t\t\t\t\t\"description\": \"The typeface to set the text in (e.g., `\\\"Helvetica Neue\\\"`).\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fontSize\": {\n\t\t\t\t\t\"description\": \"The font size, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fontStyle\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FontStyle\",\n\t\t\t\t\t\"description\": \"The font style (e.g., `\\\"italic\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"fontWeight\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeight\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeightNumber\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The font weight (e.g., `\\\"bold\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"interpolate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Interpolate\",\n\t\t\t\t\t\"description\": \"The line interpolation method to use for line and area marks. One of the following:\\n- `\\\"linear\\\"`: piecewise linear segments, as in a polyline.\\n- `\\\"linear-closed\\\"`: close the linear segments to form a polygon.\\n- `\\\"step\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"step-before\\\"`: alternate between vertical and horizontal segments, as in a step function.\\n- `\\\"step-after\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"basis\\\"`: a B-spline, with control point duplication on the ends.\\n- `\\\"basis-open\\\"`: an open B-spline; may not intersect the start or end.\\n- `\\\"basis-closed\\\"`: a closed B-spline, as in a loop.\\n- `\\\"cardinal\\\"`: a Cardinal spline, with control point duplication on the ends.\\n- `\\\"cardinal-open\\\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\\n- `\\\"cardinal-closed\\\"`: a closed Cardinal spline, as in a loop.\\n- `\\\"bundle\\\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\\n- `\\\"monotone\\\"`: cubic interpolation that preserves monotonicity in y.\"\n\t\t\t\t},\n\t\t\t\t\"limit\": {\n\t\t\t\t\t\"description\": \"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"description\": \"The overall opacity (value between [0,1]).\\n\\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Orient\",\n\t\t\t\t\t\"description\": \"The orientation of a non-stacked bar, tick, area, and line charts.\\nThe value is either horizontal (default) or vertical.\\n- For bar, rule and tick, this determines whether the size of the bar and tick\\nshould be applied to x or y dimension.\\n- For area, this property determines the orient property of the Vega output.\\n- For line, this property determines the sort order of the points in the line\\nif `config.sortLineBy` is not specified.\\nFor stacked charts, this is always determined by the orientation of the stack;\\ntherefore explicitly specified value will be ignored.\"\n\t\t\t\t},\n\t\t\t\t\"radius\": {\n\t\t\t\t\t\"description\": \"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"description\": \"The default symbol shape to use. One of: `\\\"circle\\\"` (default), `\\\"square\\\"`, `\\\"cross\\\"`, `\\\"diamond\\\"`, `\\\"triangle-up\\\"`, or `\\\"triangle-down\\\"`, or a custom SVG path.\\n\\n__Default value:__ `\\\"circle\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"description\": \"The pixel area each the point/circle/square.\\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\\n\\n__Default value:__ `30`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"description\": \"Default Stroke Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"An array of alternating stroke, space lengths for creating dashed or dotted lines.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeDashOffset\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the stroke dash array.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"The stroke width, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tension\": {\n\t\t\t\t\t\"description\": \"Depending on the interpolation type, sets the tension parameter (for line and area marks).\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"description\": \"Placeholder text if the `text` channel is not specified\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"theta\": {\n\t\t\t\t\t\"description\": \"Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating \\\"north\\\".\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"thickness\": {\n\t\t\t\t\t\"description\": \"Thickness of the tick mark.\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TimeUnit\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/SingleTimeUnit\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/MultiTimeUnit\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"TimeUnitTransform\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"as\": {\n\t\t\t\t\t\"description\": \"The output field to write the timeUnit value.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"field\": {\n\t\t\t\t\t\"description\": \"The data field to apply time unit.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"timeUnit\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnit\",\n\t\t\t\t\t\"description\": \"The timeUnit.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"timeUnit\",\n\t\t\t\t\"field\",\n\t\t\t\t\"as\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TitleBase\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"anchor\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Anchor\",\n\t\t\t\t\t\"description\": \"The anchor position for placing the title. One of `\\\"start\\\"`, `\\\"middle\\\"`, or `\\\"end\\\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title.\\n\\n__Default value:__ `\\\"middle\\\"` for [single](spec.html) and [layered](layer.html) views.\\n`\\\"start\\\"` for other composite views.\\n\\n__Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](spec.html) and [layered](layer.html) views. For other composite views, `anchor` is always `\\\"start\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"offset\": {\n\t\t\t\t\t\"description\": \"The orthogonal offset in pixels by which to displace the title from its position along the edge of the chart.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TitleOrient\",\n\t\t\t\t\t\"description\": \"The orientation of the title relative to the chart. One of `\\\"top\\\"` (the default), `\\\"bottom\\\"`, `\\\"left\\\"`, or `\\\"right\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"style\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A [mark style property](config.html#style) to apply to the title text mark.\\n\\n__Default value:__ `\\\"group-title\\\"`.\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TitleOrient\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"top\",\n\t\t\t\t\"bottom\",\n\t\t\t\t\"left\",\n\t\t\t\t\"right\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"TitleParams\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"anchor\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Anchor\",\n\t\t\t\t\t\"description\": \"The anchor position for placing the title. One of `\\\"start\\\"`, `\\\"middle\\\"`, or `\\\"end\\\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title.\\n\\n__Default value:__ `\\\"middle\\\"` for [single](spec.html) and [layered](layer.html) views.\\n`\\\"start\\\"` for other composite views.\\n\\n__Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](spec.html) and [layered](layer.html) views. For other composite views, `anchor` is always `\\\"start\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"offset\": {\n\t\t\t\t\t\"description\": \"The orthogonal offset in pixels by which to displace the title from its position along the edge of the chart.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TitleOrient\",\n\t\t\t\t\t\"description\": \"The orientation of the title relative to the chart. One of `\\\"top\\\"` (the default), `\\\"bottom\\\"`, `\\\"left\\\"`, or `\\\"right\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"style\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"A [mark style property](config.html#style) to apply to the title text mark.\\n\\n__Default value:__ `\\\"group-title\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"description\": \"The title text.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"text\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TopLevelFacetedUnitSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"$schema\": {\n\t\t\t\t\t\"description\": \"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.\",\n\t\t\t\t\t\"format\": \"uri\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"autoResize\": {\n\t\t\t\t\t\"description\": \"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\\n\\n__Default value__: `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"description\": \"CSS color property to use as the background of visualization.\\n\\n__Default value:__ none (transparent)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"config\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Config\",\n\t\t\t\t\t\"description\": \"Vega-Lite configuration object. This property can only be defined at the top-level of a specification.\"\n\t\t\t\t},\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"encoding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/EncodingWithFacet\",\n\t\t\t\t\t\"description\": \"A key-value mapping between encoding channels and definition of fields.\"\n\t\t\t\t},\n\t\t\t\t\"height\": {\n\t\t\t\t\t\"description\": \"The height of a visualization.\\n\\n__Default value:__\\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\\n\\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"mark\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/AnyMark\",\n\t\t\t\t\t\"description\": \"A string describing the mark type (one of `\\\"bar\\\"`, `\\\"circle\\\"`, `\\\"square\\\"`, `\\\"tick\\\"`, `\\\"line\\\"`,\\n`\\\"area\\\"`, `\\\"point\\\"`, `\\\"rule\\\"`, and `\\\"text\\\"`) or a [mark definition object](mark.html#mark-def).\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Padding\",\n\t\t\t\t\t\"description\": \"The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\\nIf an object, the value should have the format `{\\\"left\\\": 5, \\\"top\\\": 5, \\\"right\\\": 5, \\\"bottom\\\": 5}` to specify padding for each side of the visualization.\\n\\n__Default value__: `5`\"\n\t\t\t\t},\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"additionalProperties\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/SelectionDef\"\n\t\t\t\t\t},\n\t\t\t\t\t\"description\": \"A key-value mapping between selection names and definitions.\",\n\t\t\t\t\t\"type\": \"object\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"width\": {\n\t\t\t\t\t\"description\": \"The width of a visualization.\\n\\n__Default value:__ This will be determined by the following rules:\\n\\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\\n\\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"encoding\",\n\t\t\t\t\"mark\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TopLevelFacetedSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"$schema\": {\n\t\t\t\t\t\"description\": \"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.\",\n\t\t\t\t\t\"format\": \"uri\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"autoResize\": {\n\t\t\t\t\t\"description\": \"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\\n\\n__Default value__: `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"description\": \"CSS color property to use as the background of visualization.\\n\\n__Default value:__ none (transparent)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"config\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Config\",\n\t\t\t\t\t\"description\": \"Vega-Lite configuration object. This property can only be defined at the top-level of a specification.\"\n\t\t\t\t},\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"facet\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Facet\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Padding\",\n\t\t\t\t\t\"description\": \"The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\\nIf an object, the value should have the format `{\\\"left\\\": 5, \\\"top\\\": 5, \\\"right\\\": 5, \\\"bottom\\\": 5}` to specify padding for each side of the visualization.\\n\\n__Default value__: `5`\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"spec\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/LayerSpec\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/CompositeUnitSpec\"\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"facet\",\n\t\t\t\t\"spec\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TopLevelHConcatSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"$schema\": {\n\t\t\t\t\t\"description\": \"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.\",\n\t\t\t\t\t\"format\": \"uri\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"autoResize\": {\n\t\t\t\t\t\"description\": \"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\\n\\n__Default value__: `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"description\": \"CSS color property to use as the background of visualization.\\n\\n__Default value:__ none (transparent)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"config\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Config\",\n\t\t\t\t\t\"description\": \"Vega-Lite configuration object. This property can only be defined at the top-level of a specification.\"\n\t\t\t\t},\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"hconcat\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Spec\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Padding\",\n\t\t\t\t\t\"description\": \"The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\\nIf an object, the value should have the format `{\\\"left\\\": 5, \\\"top\\\": 5, \\\"right\\\": 5, \\\"bottom\\\": 5}` to specify padding for each side of the visualization.\\n\\n__Default value__: `5`\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"hconcat\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TopLevelLayerSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"$schema\": {\n\t\t\t\t\t\"description\": \"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.\",\n\t\t\t\t\t\"format\": \"uri\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"autoResize\": {\n\t\t\t\t\t\"description\": \"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\\n\\n__Default value__: `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"description\": \"CSS color property to use as the background of visualization.\\n\\n__Default value:__ none (transparent)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"config\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Config\",\n\t\t\t\t\t\"description\": \"Vega-Lite configuration object. This property can only be defined at the top-level of a specification.\"\n\t\t\t\t},\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"height\": {\n\t\t\t\t\t\"description\": \"The height of a visualization.\\n\\n__Default value:__\\n- For y-axis with a continuous (non-ordinal) scale, the height will be the value of [`config.view.height`](spec.html#config).\\n- For y-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the height is determined by the value of `rangeStep` and the cardinality of the field mapped to y-channel. Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](spec.html#config).\\n- If no field is mapped to `x` channel, the `height` will be the value of `rangeStep`.\\n\\n__Note__: For plot with `row` and `column` channels, this represents the height of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"layer\": {\n\t\t\t\t\t\"description\": \"Layer or single view specifications to be layered.\\n\\n__Note__: Specifications inside `layer` cannot use `row` and `column` channels as layering facet specifications is not allowed.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/LayerSpec\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"$ref\": \"#/definitions/CompositeUnitSpec\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Padding\",\n\t\t\t\t\t\"description\": \"The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\\nIf an object, the value should have the format `{\\\"left\\\": 5, \\\"top\\\": 5, \\\"right\\\": 5, \\\"bottom\\\": 5}` to specify padding for each side of the visualization.\\n\\n__Default value__: `5`\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"width\": {\n\t\t\t\t\t\"description\": \"The width of a visualization.\\n\\n__Default value:__ This will be determined by the following rules:\\n\\n- For x-axis with a continuous (non-ordinal) scale, the width will be the value of [`config.view.width`](spec.html#config).\\n- For x-axis with an ordinal scale: if [`rangeStep`](scale.html#ordinal) is a numeric value (default), the width is determined by the value of `rangeStep` and the cardinality of the field mapped to x-channel. Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](spec.html#config).\\n- If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks.\\n\\n__Note:__ For plot with `row` and `column` channels, this represents the width of a single view.\\n\\n__See also:__ The documentation for [width and height](size.html) contains more examples.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"layer\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TopLevelRepeatSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"$schema\": {\n\t\t\t\t\t\"description\": \"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.\",\n\t\t\t\t\t\"format\": \"uri\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"autoResize\": {\n\t\t\t\t\t\"description\": \"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\\n\\n__Default value__: `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"description\": \"CSS color property to use as the background of visualization.\\n\\n__Default value:__ none (transparent)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"config\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Config\",\n\t\t\t\t\t\"description\": \"Vega-Lite configuration object. This property can only be defined at the top-level of a specification.\"\n\t\t\t\t},\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Padding\",\n\t\t\t\t\t\"description\": \"The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\\nIf an object, the value should have the format `{\\\"left\\\": 5, \\\"top\\\": 5, \\\"right\\\": 5, \\\"bottom\\\": 5}` to specify padding for each side of the visualization.\\n\\n__Default value__: `5`\"\n\t\t\t\t},\n\t\t\t\t\"repeat\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Repeat\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"spec\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Spec\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"repeat\",\n\t\t\t\t\"spec\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TopLevelVConcatSpec\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"$schema\": {\n\t\t\t\t\t\"description\": \"URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema.\",\n\t\t\t\t\t\"format\": \"uri\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"autoResize\": {\n\t\t\t\t\t\"description\": \"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\\n\\n__Default value__: `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"description\": \"CSS color property to use as the background of visualization.\\n\\n__Default value:__ none (transparent)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"config\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Config\",\n\t\t\t\t\t\"description\": \"Vega-Lite configuration object. This property can only be defined at the top-level of a specification.\"\n\t\t\t\t},\n\t\t\t\t\"data\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Data\",\n\t\t\t\t\t\"description\": \"An object describing the data source\"\n\t\t\t\t},\n\t\t\t\t\"description\": {\n\t\t\t\t\t\"description\": \"An optional description of this mark for commenting purpose.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"name\": {\n\t\t\t\t\t\"description\": \"Name of the visualization for later reference.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Padding\",\n\t\t\t\t\t\"description\": \"The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\\nIf an object, the value should have the format `{\\\"left\\\": 5, \\\"top\\\": 5, \\\"right\\\": 5, \\\"bottom\\\": 5}` to specify padding for each side of the visualization.\\n\\n__Default value__: `5`\"\n\t\t\t\t},\n\t\t\t\t\"resolve\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Resolve\"\n\t\t\t\t},\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/TitleParams\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Title for the plot.\"\n\t\t\t\t},\n\t\t\t\t\"transform\": {\n\t\t\t\t\t\"description\": \"An array of data transformations such as filter and new field calculation.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Transform\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"vconcat\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"$ref\": \"#/definitions/Spec\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"vconcat\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"TopLevelExtendedSpec\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/TopLevelFacetedUnitSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/TopLevelLayerSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/TopLevelFacetedSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/TopLevelRepeatSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/TopLevelVConcatSpec\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/TopLevelHConcatSpec\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"TopLevelProperties\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"autoResize\": {\n\t\t\t\t\t\"description\": \"Resize is a boolean indicating if autosize layout should be re-calculated on every update.\\n\\n__Default value__: `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"background\": {\n\t\t\t\t\t\"description\": \"CSS color property to use as the background of visualization.\\n\\n__Default value:__ none (transparent)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Padding\",\n\t\t\t\t\t\"description\": \"The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides.\\nIf an object, the value should have the format `{\\\"left\\\": 5, \\\"top\\\": 5, \\\"right\\\": 5, \\\"bottom\\\": 5}` to specify padding for each side of the visualization.\\n\\n__Default value__: `5`\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"Transform\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/FilterTransform\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/CalculateTransform\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/LookupTransform\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/BinTransform\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/TimeUnitTransform\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/SummarizeTransform\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"Type\": {\n\t\t\t\"description\": \"Constants and utilities for data type \\n Data type based on level of measurement \",\n\t\t\t\"enum\": [\n\t\t\t\t\"quantitative\",\n\t\t\t\t\"ordinal\",\n\t\t\t\t\"temporal\",\n\t\t\t\t\"nominal\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"UrlData\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"format\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/DataUrlFormat\",\n\t\t\t\t\t\"description\": \"An object that specifies the format for parsing the data file.\"\n\t\t\t\t},\n\t\t\t\t\"url\": {\n\t\t\t\t\t\"description\": \"An URL from which to load the data set. Use the `format.type` property\\nto ensure the loaded data is correctly parsed.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"url\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"UtcMultiTimeUnit\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"utcyearquarter\",\n\t\t\t\t\"utcyearquartermonth\",\n\t\t\t\t\"utcyearmonth\",\n\t\t\t\t\"utcyearmonthdate\",\n\t\t\t\t\"utcyearmonthdatehours\",\n\t\t\t\t\"utcyearmonthdatehoursminutes\",\n\t\t\t\t\"utcyearmonthdatehoursminutesseconds\",\n\t\t\t\t\"utcquartermonth\",\n\t\t\t\t\"utcmonthdate\",\n\t\t\t\t\"utchoursminutes\",\n\t\t\t\t\"utchoursminutesseconds\",\n\t\t\t\t\"utcminutesseconds\",\n\t\t\t\t\"utcsecondsmilliseconds\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"UtcSingleTimeUnit\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"utcyear\",\n\t\t\t\t\"utcquarter\",\n\t\t\t\t\"utcmonth\",\n\t\t\t\t\"utcday\",\n\t\t\t\t\"utcdate\",\n\t\t\t\t\"utchours\",\n\t\t\t\t\"utcminutes\",\n\t\t\t\t\"utcseconds\",\n\t\t\t\t\"utcmilliseconds\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"VLOnlyConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"countTitle\": {\n\t\t\t\t\t\"description\": \"Default axis and legend title for count fields.\\n\\n__Default value:__ `'Number of Records'`.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"invalidValues\": {\n\t\t\t\t\t\"description\": \"Defines how Vega-Lite should handle invalid values (`null` and `NaN`).\\n- If set to `\\\"filter\\\"` (default), all data items with null values are filtered.\\n- If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes.\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"filter\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"numberFormat\": {\n\t\t\t\t\t\"description\": \"D3 Number format for axis labels and text tables. For example \\\"s\\\" for SI units. Use [D3's number format pattern](https://github.com/d3/d3-format#locale_format).\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"scale\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ScaleConfig\",\n\t\t\t\t\t\"description\": \"Scale configuration determines default properties for all [scales](scale.html). For a full list of scale configuration options, please see the [corresponding section of the scale documentation](scale.html#config).\"\n\t\t\t\t},\n\t\t\t\t\"selection\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/SelectionConfig\",\n\t\t\t\t\t\"description\": \"An object hash for defining default properties for each type of selections. \"\n\t\t\t\t},\n\t\t\t\t\"stack\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/StackOffset\",\n\t\t\t\t\t\"description\": \"Default stack offset for stackable mark. \"\n\t\t\t\t},\n\t\t\t\t\"timeFormat\": {\n\t\t\t\t\t\"description\": \"Default datetime format for axis and legend labels. The format can be set directly on each axis and legend. Use [D3's time format pattern](https://github.com/d3/d3-time-format#locale_format).\\n\\n__Default value:__ `'%b %d, %Y'`.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"view\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/ViewConfig\",\n\t\t\t\t\t\"description\": \"Default properties for [single view plots](spec.html#single). \"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ValueDef\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"Definition object for a constant value of an encoding channel.\",\n\t\t\t\"properties\": {\n\t\t\t\t\"value\": {\n\t\t\t\t\t\"description\": \"A constant value in visual domain.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"number\",\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"boolean\"\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"value\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VerticalAlign\": {\n\t\t\t\"enum\": [\n\t\t\t\t\"top\",\n\t\t\t\t\"middle\",\n\t\t\t\t\"bottom\"\n\t\t\t],\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\"VgAxisBase\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"description\": \"Base object for Vega's Axis and Axis Config.\\nAll of these properties are both properties of Vega's Axis and Axis Config.\",\n\t\t\t\"properties\": {\n\t\t\t\t\"domain\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\\n\\n__Default value:__ `true`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"grid\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if grid lines should be included as part of the axis\\n\\n__Default value:__ `true` for [continuous scales](scale.html#continuous) that are not binned; otherwise, `false`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"labelAngle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the axis labels.\\n\\n__Default value:__ `-90` for nominal, ordinal, temporal, and binned fields; `0` otherwise.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": -360,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelOverlap\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"parity\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"greedy\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `\\\"parity\\\"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `\\\"greedy\\\"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes).\\n\\n__Default value:__ `true` for non-nominal fields with non-log scales; `\\\"greedy\\\"` for log scales; otherwise `false`.\"\n\t\t\t\t},\n\t\t\t\t\"labelPadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between axis and text labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labels\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if labels should be included as part of the axis.\\n\\n__Default value:__ `true`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"maxExtent\": {\n\t\t\t\t\t\"description\": \"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\\n\\n__Default value:__ `undefined`.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minExtent\": {\n\t\t\t\t\t\"description\": \"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\\n\\n__Default value:__ `30` for y-axis; `undefined` for x-axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tickSize\": {\n\t\t\t\t\t\"description\": \"The size in pixels of axis ticks.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"ticks\": {\n\t\t\t\t\t\"description\": \"Boolean value that determines whether the axis should include ticks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"titleAlign\": {\n\t\t\t\t\t\"description\": \"Horizontal text alignment of axis titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleAngle\": {\n\t\t\t\t\t\"description\": \"Angle in degrees of axis titles.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleMaxLength\": {\n\t\t\t\t\t\"description\": \"Max length for axis title if the title is automatically generated from the field's description.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titlePadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between title and axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgAxisConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"bandPosition\": {\n\t\t\t\t\t\"description\": \"An interpolation fraction indicating where, for `band` scales, axis ticks should be positioned. A value of `0` places ticks at the left edge of their bands. A value of `0.5` places ticks in the middle of their bands.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"domain\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\\n\\n__Default value:__ `true`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"domainColor\": {\n\t\t\t\t\t\"description\": \"Color of axis domain line.\\n\\n__Default value:__ (none, using Vega default).\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"domainWidth\": {\n\t\t\t\t\t\"description\": \"Stroke width of axis domain line\\n\\n__Default value:__ (none, using Vega default).\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"grid\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if grid lines should be included as part of the axis\\n\\n__Default value:__ `true` for [continuous scales](scale.html#continuous) that are not binned; otherwise, `false`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"gridColor\": {\n\t\t\t\t\t\"description\": \"Color of gridlines.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"gridDash\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the grid dash array.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"gridOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity of grid (value between [0,1])\\n\\n__Default value:__ (`1` by default)\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gridWidth\": {\n\t\t\t\t\t\"description\": \"The grid width, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelAngle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the axis labels.\\n\\n__Default value:__ `-90` for nominal, ordinal, temporal, and binned fields; `0` otherwise.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": -360,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelColor\": {\n\t\t\t\t\t\"description\": \"The color of the tick label, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelFont\": {\n\t\t\t\t\t\"description\": \"The font of the tick label.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelFontSize\": {\n\t\t\t\t\t\"description\": \"The font size of the label, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelLimit\": {\n\t\t\t\t\t\"description\": \"Maximum allowed pixel width of axis tick labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelOverlap\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"parity\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\"greedy\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `\\\"parity\\\"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `\\\"greedy\\\"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes).\\n\\n__Default value:__ `true` for non-nominal fields with non-log scales; `\\\"greedy\\\"` for log scales; otherwise `false`.\"\n\t\t\t\t},\n\t\t\t\t\"labelPadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between axis and text labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labels\": {\n\t\t\t\t\t\"description\": \"A boolean flag indicating if labels should be included as part of the axis.\\n\\n__Default value:__ `true`.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"maxExtent\": {\n\t\t\t\t\t\"description\": \"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\\n\\n__Default value:__ `undefined`.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"minExtent\": {\n\t\t\t\t\t\"description\": \"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\\n\\n__Default value:__ `30` for y-axis; `undefined` for x-axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tickColor\": {\n\t\t\t\t\t\"description\": \"The color of the axis's tick.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"tickRound\": {\n\t\t\t\t\t\"description\": \"Boolean flag indicating if pixel position values should be rounded to the nearest integer.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"tickSize\": {\n\t\t\t\t\t\"description\": \"The size in pixels of axis ticks.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tickWidth\": {\n\t\t\t\t\t\"description\": \"The width, in pixels, of ticks.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"ticks\": {\n\t\t\t\t\t\"description\": \"Boolean value that determines whether the axis should include ticks.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"titleAlign\": {\n\t\t\t\t\t\"description\": \"Horizontal text alignment of axis titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleAngle\": {\n\t\t\t\t\t\"description\": \"Angle in degrees of axis titles.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleBaseline\": {\n\t\t\t\t\t\"description\": \"Vertical text baseline for axis titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleColor\": {\n\t\t\t\t\t\"description\": \"Color of the title, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleFont\": {\n\t\t\t\t\t\"description\": \"Font of the title. (e.g., `\\\"Helvetica Neue\\\"`).\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleFontSize\": {\n\t\t\t\t\t\"description\": \"Font size of the title.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleFontWeight\": {\n\t\t\t\t\t\"description\": \"Font weight of the title. (e.g., `\\\"bold\\\"`).\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"number\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"titleLimit\": {\n\t\t\t\t\t\"description\": \"Maximum allowed pixel width of axis titles.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleMaxLength\": {\n\t\t\t\t\t\"description\": \"Max length for axis title if the title is automatically generated from the field's description.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titlePadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between title and axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleX\": {\n\t\t\t\t\t\"description\": \"X-coordinate of the axis title relative to the axis group.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleY\": {\n\t\t\t\t\t\"description\": \"Y-coordinate of the axis title relative to the axis group.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgBinding\": {\n\t\t\t\"anyOf\": [\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/VgCheckboxBinding\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/VgRadioBinding\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/VgSelectBinding\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/VgRangeBinding\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"$ref\": \"#/definitions/VgGenericBinding\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"VgCheckboxBinding\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"element\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"input\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"checkbox\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"input\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgEventStream\": {},\n\t\t\"VgGenericBinding\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"element\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"input\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"input\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgLegendBase\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"entryPadding\": {\n\t\t\t\t\t\"description\": \"Padding (in pixels) between legend entries in a symbol legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fillColor\": {\n\t\t\t\t\t\"description\": \"Background fill color for the full legend.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"offset\": {\n\t\t\t\t\t\"description\": \"The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle.\\n\\n__Default value:__ `0`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/LegendOrient\",\n\t\t\t\t\t\"description\": \"The orientation of the legend, which determines how the legend is positioned within the scene. One of \\\"left\\\", \\\"right\\\", \\\"top-left\\\", \\\"top-right\\\", \\\"bottom-left\\\", \\\"bottom-right\\\", \\\"none\\\".\\n\\n__Default value:__ `\\\"right\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between the legend and axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleAlign\": {\n\t\t\t\t\t\"description\": \"Horizontal text alignment for legend titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgLegendConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"cornerRadius\": {\n\t\t\t\t\t\"description\": \"Corner radius for the full legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"entryPadding\": {\n\t\t\t\t\t\"description\": \"Padding (in pixels) between legend entries in a symbol legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fillColor\": {\n\t\t\t\t\t\"description\": \"Background fill color for the full legend.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"gradientHeight\": {\n\t\t\t\t\t\"description\": \"The height of the gradient, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gradientLabelBaseline\": {\n\t\t\t\t\t\"description\": \"Text baseline for color ramp gradient labels.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"gradientLabelLimit\": {\n\t\t\t\t\t\"description\": \"The maximum allowed length in pixels of color ramp gradient labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gradientLabelOffset\": {\n\t\t\t\t\t\"description\": \"Vertical offset in pixels for color ramp gradient labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gradientStrokeColor\": {\n\t\t\t\t\t\"description\": \"The color of the gradient stroke, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"gradientStrokeWidth\": {\n\t\t\t\t\t\"description\": \"The width of the gradient stroke, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"gradientWidth\": {\n\t\t\t\t\t\"description\": \"The width of the gradient, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelAlign\": {\n\t\t\t\t\t\"description\": \"The alignment of the legend label, can be left, middle or right.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelBaseline\": {\n\t\t\t\t\t\"description\": \"The position of the baseline of legend label, can be top, middle or bottom.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelColor\": {\n\t\t\t\t\t\"description\": \"The color of the legend label, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelFont\": {\n\t\t\t\t\t\"description\": \"The font of the legend label.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"labelFontSize\": {\n\t\t\t\t\t\"description\": \"The font size of legend label.\\n\\n__Default value:__ `10`.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelLimit\": {\n\t\t\t\t\t\"description\": \"Maximum allowed pixel width of axis tick labels.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"labelOffset\": {\n\t\t\t\t\t\"description\": \"The offset of the legend label.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"offset\": {\n\t\t\t\t\t\"description\": \"The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle.\\n\\n__Default value:__ `0`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/LegendOrient\",\n\t\t\t\t\t\"description\": \"The orientation of the legend, which determines how the legend is positioned within the scene. One of \\\"left\\\", \\\"right\\\", \\\"top-left\\\", \\\"top-right\\\", \\\"bottom-left\\\", \\\"bottom-right\\\", \\\"none\\\".\\n\\n__Default value:__ `\\\"right\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"padding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between the legend and axis.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeColor\": {\n\t\t\t\t\t\"description\": \"Border stroke color for the full legend.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"Border stroke dash pattern for the full legend.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"Border stroke width for the full legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"symbolColor\": {\n\t\t\t\t\t\"description\": \"The color of the legend symbol,\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"symbolSize\": {\n\t\t\t\t\t\"description\": \"The size of the legend symbol, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"symbolStrokeWidth\": {\n\t\t\t\t\t\"description\": \"The width of the symbol's stroke.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"symbolType\": {\n\t\t\t\t\t\"description\": \"Default shape type (such as \\\"circle\\\") for legend symbols.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleAlign\": {\n\t\t\t\t\t\"description\": \"Horizontal text alignment for legend titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleBaseline\": {\n\t\t\t\t\t\"description\": \"Optional mark property definitions for custom legend styling. \\n Vertical text baseline for legend titles.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleColor\": {\n\t\t\t\t\t\"description\": \"The color of the legend title, can be in hex color code or regular color name.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleFont\": {\n\t\t\t\t\t\"description\": \"The font of the legend title.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"titleFontSize\": {\n\t\t\t\t\t\"description\": \"The font size of the legend title.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titleFontWeight\": {\n\t\t\t\t\t\"description\": \"The font weight of the legend title.\",\n\t\t\t\t\t\"type\": [\n\t\t\t\t\t\t\"string\",\n\t\t\t\t\t\t\"number\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"titleLimit\": {\n\t\t\t\t\t\"description\": \"Maximum allowed pixel width of axis titles.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"titlePadding\": {\n\t\t\t\t\t\"description\": \"The padding, in pixels, between title and legend.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgMarkConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"align\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/HorizontalAlign\",\n\t\t\t\t\t\"description\": \"The horizontal alignment of the text. One of `\\\"left\\\"`, `\\\"right\\\"`, `\\\"center\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"angle\": {\n\t\t\t\t\t\"description\": \"The rotation angle of the text, in degrees.\",\n\t\t\t\t\t\"maximum\": 360,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"baseline\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VerticalAlign\",\n\t\t\t\t\t\"description\": \"The vertical alignment of the text. One of `\\\"top\\\"`, `\\\"middle\\\"`, `\\\"bottom\\\"`.\\n\\n__Default value:__ `\\\"middle\\\"`\"\n\t\t\t\t},\n\t\t\t\t\"dx\": {\n\t\t\t\t\t\"description\": \"The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"dy\": {\n\t\t\t\t\t\"description\": \"The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fill\": {\n\t\t\t\t\t\"description\": \"Default Fill Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fillOpacity\": {\n\t\t\t\t\t\"description\": \"The fill opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"font\": {\n\t\t\t\t\t\"description\": \"The typeface to set the text in (e.g., `\\\"Helvetica Neue\\\"`).\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fontSize\": {\n\t\t\t\t\t\"description\": \"The font size, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fontStyle\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/FontStyle\",\n\t\t\t\t\t\"description\": \"The font style (e.g., `\\\"italic\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"fontWeight\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeight\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeightNumber\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"The font weight (e.g., `\\\"bold\\\"`).\"\n\t\t\t\t},\n\t\t\t\t\"interpolate\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Interpolate\",\n\t\t\t\t\t\"description\": \"The line interpolation method to use for line and area marks. One of the following:\\n- `\\\"linear\\\"`: piecewise linear segments, as in a polyline.\\n- `\\\"linear-closed\\\"`: close the linear segments to form a polygon.\\n- `\\\"step\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"step-before\\\"`: alternate between vertical and horizontal segments, as in a step function.\\n- `\\\"step-after\\\"`: alternate between horizontal and vertical segments, as in a step function.\\n- `\\\"basis\\\"`: a B-spline, with control point duplication on the ends.\\n- `\\\"basis-open\\\"`: an open B-spline; may not intersect the start or end.\\n- `\\\"basis-closed\\\"`: a closed B-spline, as in a loop.\\n- `\\\"cardinal\\\"`: a Cardinal spline, with control point duplication on the ends.\\n- `\\\"cardinal-open\\\"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points.\\n- `\\\"cardinal-closed\\\"`: a closed Cardinal spline, as in a loop.\\n- `\\\"bundle\\\"`: equivalent to basis, except the tension parameter is used to straighten the spline.\\n- `\\\"monotone\\\"`: cubic interpolation that preserves monotonicity in y.\"\n\t\t\t\t},\n\t\t\t\t\"limit\": {\n\t\t\t\t\t\"description\": \"The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"opacity\": {\n\t\t\t\t\t\"description\": \"The overall opacity (value between [0,1]).\\n\\n__Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise.\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Orient\",\n\t\t\t\t\t\"description\": \"The orientation of a non-stacked bar, tick, area, and line charts.\\nThe value is either horizontal (default) or vertical.\\n- For bar, rule and tick, this determines whether the size of the bar and tick\\nshould be applied to x or y dimension.\\n- For area, this property determines the orient property of the Vega output.\\n- For line, this property determines the sort order of the points in the line\\nif `config.sortLineBy` is not specified.\\nFor stacked charts, this is always determined by the orientation of the stack;\\ntherefore explicitly specified value will be ignored.\"\n\t\t\t\t},\n\t\t\t\t\"radius\": {\n\t\t\t\t\t\"description\": \"Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"shape\": {\n\t\t\t\t\t\"description\": \"The default symbol shape to use. One of: `\\\"circle\\\"` (default), `\\\"square\\\"`, `\\\"cross\\\"`, `\\\"diamond\\\"`, `\\\"triangle-up\\\"`, or `\\\"triangle-down\\\"`, or a custom SVG path.\\n\\n__Default value:__ `\\\"circle\\\"`\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"size\": {\n\t\t\t\t\t\"description\": \"The pixel area each the point/circle/square.\\nFor example: in the case of circles, the radius is determined in part by the square root of the size value.\\n\\n__Default value:__ `30`\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"description\": \"Default Stroke Color. This has higher precedence than config.color\\n\\n__Default value:__ (None)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"An array of alternating stroke, space lengths for creating dashed or dotted lines.\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeDashOffset\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the stroke dash array.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity (value between [0,1]).\\n\\n__Default value:__ `1`\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"The stroke width, in pixels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"tension\": {\n\t\t\t\t\t\"description\": \"Depending on the interpolation type, sets the tension parameter (for line and area marks).\",\n\t\t\t\t\t\"maximum\": 1,\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"description\": \"Placeholder text if the `text` channel is not specified\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"theta\": {\n\t\t\t\t\t\"description\": \"Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating \\\"north\\\".\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgRadioBinding\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"element\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"input\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"radio\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"options\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"input\",\n\t\t\t\t\"options\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgRangeBinding\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"element\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"input\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"range\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"max\": {\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"min\": {\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"step\": {\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"input\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgScheme\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"count\": {\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"extent\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"scheme\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"scheme\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgSelectBinding\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"element\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"input\": {\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"select\"\n\t\t\t\t\t],\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"options\": {\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"input\",\n\t\t\t\t\"options\"\n\t\t\t],\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VgTitleConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"anchor\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/Anchor\",\n\t\t\t\t\t\"description\": \"The anchor position for placing the title. One of `\\\"start\\\"`, `\\\"middle\\\"`, or `\\\"end\\\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title.\\n\\n__Default value:__ `\\\"middle\\\"` for [single](spec.html) and [layered](layer.html) views.\\n`\\\"start\\\"` for other composite views.\\n\\n__Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](spec.html) and [layered](layer.html) views. For other composite views, `anchor` is always `\\\"start\\\"`.\"\n\t\t\t\t},\n\t\t\t\t\"angle\": {\n\t\t\t\t\t\"description\": \"Angle in degrees of title text.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"baseline\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/VerticalAlign\",\n\t\t\t\t\t\"description\": \"Vertical text baseline for title text.\"\n\t\t\t\t},\n\t\t\t\t\"color\": {\n\t\t\t\t\t\"description\": \"Text color for title text.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"font\": {\n\t\t\t\t\t\"description\": \"Font name for title text.\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fontSize\": {\n\t\t\t\t\t\"description\": \"Font size in pixels for title text.\\n\\n__Default value:__ `10`.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"fontWeight\": {\n\t\t\t\t\t\"anyOf\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeight\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"$ref\": \"#/definitions/FontWeightNumber\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"description\": \"Font weight for title text.\"\n\t\t\t\t},\n\t\t\t\t\"limit\": {\n\t\t\t\t\t\"description\": \"The maximum allowed length in pixels of legend labels.\",\n\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"offset\": {\n\t\t\t\t\t\"description\": \"Offset in pixels of the title from the chart body and axes.\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"orient\": {\n\t\t\t\t\t\"$ref\": \"#/definitions/TitleOrient\",\n\t\t\t\t\t\"description\": \"Default title orientation (\\\"top\\\", \\\"bottom\\\", \\\"left\\\", or \\\"right\\\")\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"ViewConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"clip\": {\n\t\t\t\t\t\"description\": \"Whether the view should be clipped.\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t},\n\t\t\t\t\"fill\": {\n\t\t\t\t\t\"description\": \"The fill color.\\n\\n__Default value:__ (none)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"fillOpacity\": {\n\t\t\t\t\t\"description\": \"The fill opacity (value between [0,1]).\\n\\n__Default value:__ (none)\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"height\": {\n\t\t\t\t\t\"description\": \"The default height of the single plot or each plot in a trellis plot when the visualization has a continuous (non-ordinal) y-scale with `rangeStep` = `null`.\\n\\n__Default value:__ `200`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"stroke\": {\n\t\t\t\t\t\"description\": \"The stroke color.\\n\\n__Default value:__ (none)\",\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t},\n\t\t\t\t\"strokeDash\": {\n\t\t\t\t\t\"description\": \"An array of alternating stroke, space lengths for creating dashed or dotted lines.\\n\\n__Default value:__ (none)\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t},\n\t\t\t\t\t\"type\": \"array\"\n\t\t\t\t},\n\t\t\t\t\"strokeDashOffset\": {\n\t\t\t\t\t\"description\": \"The offset (in pixels) into which to begin drawing with the stroke dash array.\\n\\n__Default value:__ (none)\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeOpacity\": {\n\t\t\t\t\t\"description\": \"The stroke opacity (value between [0,1]).\\n\\n__Default value:__ (none)\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"strokeWidth\": {\n\t\t\t\t\t\"description\": \"The stroke width, in pixels.\\n\\n__Default value:__ (none)\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t},\n\t\t\t\t\"width\": {\n\t\t\t\t\t\"description\": \"The default width of the single plot or each plot in a trellis plot when the visualization has a continuous (non-ordinal) x-scale or ordinal x-scale with `rangeStep` = `null`.\\n\\n__Default value:__ `200`\",\n\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t},\n\t\t\"VlOnlyGuideConfig\": {\n\t\t\t\"additionalProperties\": false,\n\t\t\t\"properties\": {\n\t\t\t\t\"shortTimeLabels\": {\n\t\t\t\t\t\"description\": \"Whether month names and weekday names should be abbreviated.\\n\\n__Default value:__ `false`\",\n\t\t\t\t\t\"type\": \"boolean\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"object\"\n\t\t}\n\t}\n};\n\n/***/ }),\n/* 177 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************!*\\\n !*** ./~/add-dom-event-listener/lib/index.js ***!\n \\***********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = addEventListener;\n\nvar _EventObject = __webpack_require__(/*! ./EventObject */ 309);\n\nvar _EventObject2 = _interopRequireDefault(_EventObject);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction addEventListener(target, eventType, callback) {\n function wrapCallback(e) {\n var ne = new _EventObject2[\"default\"](e);\n callback.call(target, ne);\n }\n\n if (target.addEventListener) {\n target.addEventListener(eventType, wrapCallback, false);\n return {\n remove: function remove() {\n target.removeEventListener(eventType, wrapCallback, false);\n }\n };\n } else if (target.attachEvent) {\n target.attachEvent('on' + eventType, wrapCallback);\n return {\n remove: function remove() {\n target.detachEvent('on' + eventType, wrapCallback);\n }\n };\n }\n}\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 178 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************!*\\\n !*** ./~/ajv/lib/compile/schema_obj.js ***!\n \\*****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(/*! ./util */ 67);\n\nmodule.exports = SchemaObject;\n\nfunction SchemaObject(obj) {\n util.copy(obj, this);\n}\n\n\n/***/ }),\n/* 179 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************!*\\\n !*** ./~/ajv/lib/dotjs/_limit.js ***!\n \\***********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate__limit(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $isMax = $keyword == 'maximum',\n $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',\n $schemaExcl = it.schema[$exclusiveKeyword],\n $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,\n $op = $isMax ? '<' : '>',\n $notOp = $isMax ? '>' : '<',\n $errorKeyword = undefined;\n if ($isDataExcl) {\n var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),\n $exclusive = 'exclusive' + $lvl,\n $exclType = 'exclType' + $lvl,\n $exclIsNumber = 'exclIsNumber' + $lvl,\n $opExpr = 'op' + $lvl,\n $opStr = '\\' + ' + $opExpr + ' + \\'';\n out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';\n $schemaValueExcl = 'schemaExcl' + $lvl;\n out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \\'boolean\\' && ' + ($exclType) + ' != \\'undefined\\' && ' + ($exclType) + ' != \\'number\\') { ';\n var $errorKeyword = $exclusiveKeyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_exclusiveLimit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'' + ($exclusiveKeyword) + ' should be boolean\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($exclType) + ' == \\'number\\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \\'' + ($op) + '\\' : \\'' + ($op) + '=\\';';\n } else {\n var $exclIsNumber = typeof $schemaExcl == 'number',\n $opStr = $op;\n if ($exclIsNumber && $isData) {\n var $opExpr = '\\'' + $opStr + '\\'';\n out += ' if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';\n } else {\n if ($exclIsNumber && $schema === undefined) {\n $exclusive = true;\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $schemaValue = $schemaExcl;\n $notOp += '=';\n } else {\n if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);\n if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {\n $exclusive = true;\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $notOp += '=';\n } else {\n $exclusive = false;\n $opStr += '=';\n }\n }\n var $opExpr = '\\'' + $opStr + '\\'';\n out += ' if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';\n }\n }\n $errorKeyword = $errorKeyword || $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ' + ($opStr) + ' ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue);\n } else {\n out += '' + ($schemaValue) + '\\'';\n }\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n\n/***/ }),\n/* 180 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************!*\\\n !*** ./~/ajv/lib/dotjs/_limitItems.js ***!\n \\****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate__limitItems(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxItems' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have ';\n if ($keyword == 'maxItems') {\n out += 'more';\n } else {\n out += 'less';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' items\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n\n/***/ }),\n/* 181 */\n/* unknown exports provided */\n/* all exports used */\n/*!*****************************************!*\\\n !*** ./~/ajv/lib/dotjs/_limitLength.js ***!\n \\*****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate__limitLength(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxLength' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n if (it.opts.unicode === false) {\n out += ' ' + ($data) + '.length ';\n } else {\n out += ' ucs2length(' + ($data) + ') ';\n }\n out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitLength') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be ';\n if ($keyword == 'maxLength') {\n out += 'longer';\n } else {\n out += 'shorter';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' characters\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n\n/***/ }),\n/* 182 */\n/* unknown exports provided */\n/* all exports used */\n/*!*********************************************!*\\\n !*** ./~/ajv/lib/dotjs/_limitProperties.js ***!\n \\*********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate__limitProperties(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $op = $keyword == 'maxProperties' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have ';\n if ($keyword == 'maxProperties') {\n out += 'more';\n } else {\n out += 'less';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' properties\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n\n/***/ }),\n/* 183 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************!*\\\n !*** ./~/ajv/lib/dotjs/validate.js ***!\n \\*************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_validate(it, $keyword, $ruleType) {\n var out = '';\n var $async = it.schema.$async === true,\n $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),\n $id = it.self._getId(it.schema);\n if (it.isTop) {\n if ($async) {\n it.async = true;\n var $es7 = it.opts.async == 'es7';\n it.yieldAwait = $es7 ? 'await' : 'yield';\n }\n out += ' var validate = ';\n if ($async) {\n if ($es7) {\n out += ' (async function ';\n } else {\n if (it.opts.async != '*') {\n out += 'co.wrap';\n }\n out += '(function* ';\n }\n } else {\n out += ' (function ';\n }\n out += ' (data, dataPath, parentData, parentDataProperty, rootData) { \\'use strict\\'; ';\n if ($id && (it.opts.sourceCode || it.opts.processCode)) {\n out += ' ' + ('/\\*# sourceURL=' + $id + ' */') + ' ';\n }\n }\n if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {\n var $keyword = 'false schema';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n if (it.schema === false) {\n if (it.isTop) {\n $breakOnError = true;\n } else {\n out += ' var ' + ($valid) + ' = false; ';\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'false schema') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'boolean schema is false\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n } else {\n if (it.isTop) {\n if ($async) {\n out += ' return data; ';\n } else {\n out += ' validate.errors = null; return true; ';\n }\n } else {\n out += ' var ' + ($valid) + ' = true; ';\n }\n }\n if (it.isTop) {\n out += ' }); return validate; ';\n }\n return out;\n }\n if (it.isTop) {\n var $top = it.isTop,\n $lvl = it.level = 0,\n $dataLvl = it.dataLevel = 0,\n $data = 'data';\n it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));\n it.baseId = it.baseId || it.rootId;\n delete it.isTop;\n it.dataPathArr = [undefined];\n out += ' var vErrors = null; ';\n out += ' var errors = 0; ';\n out += ' if (rootData === undefined) rootData = data; ';\n } else {\n var $lvl = it.level,\n $dataLvl = it.dataLevel,\n $data = 'data' + ($dataLvl || '');\n if ($id) it.baseId = it.resolve.url(it.baseId, $id);\n if ($async && !it.async) throw new Error('async schema in sync schema');\n out += ' var errs_' + ($lvl) + ' = errors;';\n }\n var $valid = 'valid' + $lvl,\n $breakOnError = !it.opts.allErrors,\n $closingBraces1 = '',\n $closingBraces2 = '';\n var $errorKeyword;\n var $typeSchema = it.schema.type,\n $typeIsArray = Array.isArray($typeSchema);\n if ($typeIsArray && $typeSchema.length == 1) {\n $typeSchema = $typeSchema[0];\n $typeIsArray = false;\n }\n if (it.schema.$ref && $refKeywords) {\n if (it.opts.extendRefs == 'fail') {\n throw new Error('$ref: validation keywords used in schema at path \"' + it.errSchemaPath + '\" (see option extendRefs)');\n } else if (it.opts.extendRefs !== true) {\n $refKeywords = false;\n console.warn('$ref: keywords ignored in schema at path \"' + it.errSchemaPath + '\"');\n }\n }\n if ($typeSchema) {\n if (it.opts.coerceTypes) {\n var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);\n }\n var $rulesGroup = it.RULES.types[$typeSchema];\n if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type';\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type',\n $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';\n out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { ';\n if ($coerceToTypes) {\n var $dataType = 'dataType' + $lvl,\n $coerced = 'coerced' + $lvl;\n out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; ';\n if (it.opts.coerceTypes == 'array') {\n out += ' if (' + ($dataType) + ' == \\'object\\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \\'array\\'; ';\n }\n out += ' var ' + ($coerced) + ' = undefined; ';\n var $bracesCoercion = '';\n var arr1 = $coerceToTypes;\n if (arr1) {\n var $type, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $type = arr1[$i += 1];\n if ($i) {\n out += ' if (' + ($coerced) + ' === undefined) { ';\n $bracesCoercion += '}';\n }\n if (it.opts.coerceTypes == 'array' && $type != 'array') {\n out += ' if (' + ($dataType) + ' == \\'array\\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; } ';\n }\n if ($type == 'string') {\n out += ' if (' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\') ' + ($coerced) + ' = \\'\\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \\'\\'; ';\n } else if ($type == 'number' || $type == 'integer') {\n out += ' if (' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \\'string\\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';\n if ($type == 'integer') {\n out += ' && !(' + ($data) + ' % 1)';\n }\n out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';\n } else if ($type == 'boolean') {\n out += ' if (' + ($data) + ' === \\'false\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \\'true\\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';\n } else if ($type == 'null') {\n out += ' if (' + ($data) + ' === \\'\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';\n } else if (it.opts.coerceTypes == 'array' && $type == 'array') {\n out += ' if (' + ($dataType) + ' == \\'string\\' || ' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';\n }\n }\n }\n out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n out += ' ' + ($data) + ' = ' + ($coerced) + '; ';\n if (!$dataLvl) {\n out += 'if (' + ($parentData) + ' !== undefined)';\n }\n out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';\n } else {\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n }\n out += ' } ';\n }\n }\n if (it.schema.$ref && !$refKeywords) {\n out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';\n if ($breakOnError) {\n out += ' } if (errors === ';\n if ($top) {\n out += '0';\n } else {\n out += 'errs_' + ($lvl);\n }\n out += ') { ';\n $closingBraces2 += '}';\n }\n } else {\n if (it.opts.v5 && it.schema.patternGroups) {\n console.warn('keyword \"patternGroups\" is deprecated and disabled. Use option patternGroups: true to enable.');\n }\n var arr2 = it.RULES;\n if (arr2) {\n var $rulesGroup, i2 = -1,\n l2 = arr2.length - 1;\n while (i2 < l2) {\n $rulesGroup = arr2[i2 += 1];\n if ($shouldUseGroup($rulesGroup)) {\n if ($rulesGroup.type) {\n out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { ';\n }\n if (it.opts.useDefaults && !it.compositeRule) {\n if ($rulesGroup.type == 'object' && it.schema.properties) {\n var $schema = it.schema.properties,\n $schemaKeys = Object.keys($schema);\n var arr3 = $schemaKeys;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $sch = $schema[$propertyKey];\n if ($sch.default !== undefined) {\n var $passData = $data + it.util.getProperty($propertyKey);\n out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = ';\n if (it.opts.useDefaults == 'shared') {\n out += ' ' + (it.useDefault($sch.default)) + ' ';\n } else {\n out += ' ' + (JSON.stringify($sch.default)) + ' ';\n }\n out += '; ';\n }\n }\n }\n } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {\n var arr4 = it.schema.items;\n if (arr4) {\n var $sch, $i = -1,\n l4 = arr4.length - 1;\n while ($i < l4) {\n $sch = arr4[$i += 1];\n if ($sch.default !== undefined) {\n var $passData = $data + '[' + $i + ']';\n out += ' if (' + ($passData) + ' === undefined) ' + ($passData) + ' = ';\n if (it.opts.useDefaults == 'shared') {\n out += ' ' + (it.useDefault($sch.default)) + ' ';\n } else {\n out += ' ' + (JSON.stringify($sch.default)) + ' ';\n }\n out += '; ';\n }\n }\n }\n }\n }\n var arr5 = $rulesGroup.rules;\n if (arr5) {\n var $rule, i5 = -1,\n l5 = arr5.length - 1;\n while (i5 < l5) {\n $rule = arr5[i5 += 1];\n if ($shouldUseRule($rule)) {\n var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);\n if ($code) {\n out += ' ' + ($code) + ' ';\n if ($breakOnError) {\n $closingBraces1 += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces1) + ' ';\n $closingBraces1 = '';\n }\n if ($rulesGroup.type) {\n out += ' } ';\n if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {\n out += ' else { ';\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n }\n }\n if ($breakOnError) {\n out += ' if (errors === ';\n if ($top) {\n out += '0';\n } else {\n out += 'errs_' + ($lvl);\n }\n out += ') { ';\n $closingBraces2 += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces2) + ' ';\n }\n if ($top) {\n if ($async) {\n out += ' if (errors === 0) return data; ';\n out += ' else throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; ';\n out += ' return errors === 0; ';\n }\n out += ' }); return validate;';\n } else {\n out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';\n }\n out = it.util.cleanUpCode(out);\n if ($top) {\n out = it.util.finalCleanUpCode(out, $async);\n }\n\n function $shouldUseGroup($rulesGroup) {\n var rules = $rulesGroup.rules;\n for (var i = 0; i < rules.length; i++)\n if ($shouldUseRule(rules[i])) return true;\n }\n\n function $shouldUseRule($rule) {\n return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImlementsSomeKeyword($rule));\n }\n\n function $ruleImlementsSomeKeyword($rule) {\n var impl = $rule.implements;\n for (var i = 0; i < impl.length; i++)\n if (it.schema[impl[i]] !== undefined) return true;\n }\n return out;\n}\n\n\n/***/ }),\n/* 184 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************************!*\\\n !*** ./~/babel-runtime/core-js/object/define-property.js ***!\n \\***********************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(/*! core-js/library/fn/object/define-property */ 375), __esModule: true };\n\n/***/ }),\n/* 185 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************!*\\\n !*** ./~/co/index.js ***!\n \\***********************/\n/***/ (function(module, exports) {\n\n\n/**\n * slice() reference.\n */\n\nvar slice = Array.prototype.slice;\n\n/**\n * Expose `co`.\n */\n\nmodule.exports = co['default'] = co.co = co;\n\n/**\n * Wrap the given generator `fn` into a\n * function that returns a promise.\n * This is a separate function so that\n * every `co()` call doesn't create a new,\n * unnecessary closure.\n *\n * @param {GeneratorFunction} fn\n * @return {Function}\n * @api public\n */\n\nco.wrap = function (fn) {\n createPromise.__generatorFunction__ = fn;\n return createPromise;\n function createPromise() {\n return co.call(this, fn.apply(this, arguments));\n }\n};\n\n/**\n * Execute the generator function or a generator\n * and return a promise.\n *\n * @param {Function} fn\n * @return {Promise}\n * @api public\n */\n\nfunction co(gen) {\n var ctx = this;\n var args = slice.call(arguments, 1)\n\n // we wrap everything in a promise to avoid promise chaining,\n // which leads to memory leak errors.\n // see https://github.com/tj/co/issues/180\n return new Promise(function(resolve, reject) {\n if (typeof gen === 'function') gen = gen.apply(ctx, args);\n if (!gen || typeof gen.next !== 'function') return resolve(gen);\n\n onFulfilled();\n\n /**\n * @param {Mixed} res\n * @return {Promise}\n * @api private\n */\n\n function onFulfilled(res) {\n var ret;\n try {\n ret = gen.next(res);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n\n /**\n * @param {Error} err\n * @return {Promise}\n * @api private\n */\n\n function onRejected(err) {\n var ret;\n try {\n ret = gen.throw(err);\n } catch (e) {\n return reject(e);\n }\n next(ret);\n }\n\n /**\n * Get the next value in the generator,\n * return a promise.\n *\n * @param {Object} ret\n * @return {Promise}\n * @api private\n */\n\n function next(ret) {\n if (ret.done) return resolve(ret.value);\n var value = toPromise.call(ctx, ret.value);\n if (value && isPromise(value)) return value.then(onFulfilled, onRejected);\n return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '\n + 'but the following object was passed: \"' + String(ret.value) + '\"'));\n }\n });\n}\n\n/**\n * Convert a `yield`ed value into a promise.\n *\n * @param {Mixed} obj\n * @return {Promise}\n * @api private\n */\n\nfunction toPromise(obj) {\n if (!obj) return obj;\n if (isPromise(obj)) return obj;\n if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);\n if ('function' == typeof obj) return thunkToPromise.call(this, obj);\n if (Array.isArray(obj)) return arrayToPromise.call(this, obj);\n if (isObject(obj)) return objectToPromise.call(this, obj);\n return obj;\n}\n\n/**\n * Convert a thunk to a promise.\n *\n * @param {Function}\n * @return {Promise}\n * @api private\n */\n\nfunction thunkToPromise(fn) {\n var ctx = this;\n return new Promise(function (resolve, reject) {\n fn.call(ctx, function (err, res) {\n if (err) return reject(err);\n if (arguments.length > 2) res = slice.call(arguments, 1);\n resolve(res);\n });\n });\n}\n\n/**\n * Convert an array of \"yieldables\" to a promise.\n * Uses `Promise.all()` internally.\n *\n * @param {Array} obj\n * @return {Promise}\n * @api private\n */\n\nfunction arrayToPromise(obj) {\n return Promise.all(obj.map(toPromise, this));\n}\n\n/**\n * Convert an object of \"yieldables\" to a promise.\n * Uses `Promise.all()` internally.\n *\n * @param {Object} obj\n * @return {Promise}\n * @api private\n */\n\nfunction objectToPromise(obj){\n var results = new obj.constructor();\n var keys = Object.keys(obj);\n var promises = [];\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var promise = toPromise.call(this, obj[key]);\n if (promise && isPromise(promise)) defer(promise, key);\n else results[key] = obj[key];\n }\n return Promise.all(promises).then(function () {\n return results;\n });\n\n function defer(promise, key) {\n // predefine the key in the result\n results[key] = undefined;\n promises.push(promise.then(function (res) {\n results[key] = res;\n }));\n }\n}\n\n/**\n * Check if `obj` is a promise.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isPromise(obj) {\n return 'function' == typeof obj.then;\n}\n\n/**\n * Check if `obj` is a generator.\n *\n * @param {Mixed} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isGenerator(obj) {\n return 'function' == typeof obj.next && 'function' == typeof obj.throw;\n}\n\n/**\n * Check if `obj` is a generator function.\n *\n * @param {Mixed} obj\n * @return {Boolean}\n * @api private\n */\nfunction isGeneratorFunction(obj) {\n var constructor = obj.constructor;\n if (!constructor) return false;\n if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;\n return isGenerator(constructor.prototype);\n}\n\n/**\n * Check for plain object.\n *\n * @param {Mixed} val\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(val) {\n return Object == val.constructor;\n}\n\n\n/***/ }),\n/* 186 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************************!*\\\n !*** ./~/compassql/build/src/query/groupby.js ***!\n \\************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar util_1 = __webpack_require__(/*! datalib/src/util */ 32);\nvar shorthand_1 = __webpack_require__(/*! ./shorthand */ 99);\nvar property_1 = __webpack_require__(/*! ../property */ 18);\nvar propindex_1 = __webpack_require__(/*! ../propindex */ 48);\nvar util_2 = __webpack_require__(/*! ../util */ 13);\nexports.REPLACE_BLANK_FIELDS = { '*': '' };\nexports.REPLACE_XY_CHANNELS = { x: 'xy', y: 'xy' };\nexports.REPLACE_FACET_CHANNELS = { row: 'facet', column: 'facet' };\nexports.REPLACE_MARK_STYLE_CHANNELS = { color: 'style', opacity: 'style', shape: 'style', size: 'style' };\nfunction isExtendedGroupBy(g) {\n return util_1.isObject(g) && !!g['property'];\n}\nexports.isExtendedGroupBy = isExtendedGroupBy;\nfunction parseGroupBy(groupBy, include, replaceIndex) {\n include = include || new propindex_1.PropIndex();\n replaceIndex = replaceIndex || new propindex_1.PropIndex();\n groupBy.forEach(function (grpBy) {\n if (isExtendedGroupBy(grpBy)) {\n include.setByKey(grpBy.property, true);\n replaceIndex.setByKey(grpBy.property, grpBy.replace);\n }\n else {\n include.setByKey(grpBy, true);\n }\n });\n return {\n include: include,\n replaceIndex: replaceIndex,\n replacer: shorthand_1.getReplacerIndex(replaceIndex)\n };\n}\nexports.parseGroupBy = parseGroupBy;\nfunction toString(groupBy) {\n if (util_1.isArray(groupBy)) {\n return groupBy.map(function (g) {\n if (isExtendedGroupBy(g)) {\n if (g.replace) {\n var replaceIndex_1 = util_2.keys(g.replace).reduce(function (index, valFrom) {\n var valTo = g.replace[valFrom];\n (index[valTo] = index[valTo] || []).push(valFrom);\n return index;\n }, {});\n return g.property + '[' + util_2.keys(replaceIndex_1).map(function (valTo) {\n var valsFrom = replaceIndex_1[valTo].sort();\n return valsFrom.join(',') + '=>' + valTo;\n }).join(';') + ']';\n }\n return g.property;\n }\n return g;\n }).join(',');\n }\n else {\n return groupBy;\n }\n}\nexports.toString = toString;\nexports.GROUP_BY_FIELD_TRANSFORM = [\n property_1.Property.FIELD, property_1.Property.TYPE,\n property_1.Property.AGGREGATE, property_1.Property.BIN, property_1.Property.TIMEUNIT, property_1.Property.STACK\n];\nexports.GROUP_BY_ENCODING = exports.GROUP_BY_FIELD_TRANSFORM.concat([\n {\n property: property_1.Property.CHANNEL,\n replace: {\n 'x': 'xy', 'y': 'xy',\n 'color': 'style', 'size': 'style', 'shape': 'style', 'opacity': 'style',\n 'row': 'facet', 'column': 'facet'\n }\n }\n]);\n\n\n/***/ }),\n/* 187 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************************!*\\\n !*** ./~/compassql/build/src/ranking/effectiveness/index.js ***!\n \\**************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar axis_1 = __webpack_require__(/*! ./axis */ 360);\nvar dimension_1 = __webpack_require__(/*! ./dimension */ 361);\nvar facet_1 = __webpack_require__(/*! ./facet */ 362);\nvar sizechannel_1 = __webpack_require__(/*! ./sizechannel */ 364);\nvar typechannel_1 = __webpack_require__(/*! ./typechannel */ 365);\nvar mark_1 = __webpack_require__(/*! ./mark */ 363);\nvar SCORERS = [\n new axis_1.AxisScorer(),\n new dimension_1.DimensionScorer(),\n new facet_1.FacetScorer(),\n new mark_1.MarkScorer(),\n new sizechannel_1.SizeChannelScorer(),\n new typechannel_1.TypeChannelScorer()\n];\n// TODO: x/y, row/column preference\n// TODO: stacking\n// TODO: Channel, Cardinality\n// TODO: Penalize over encoding\nfunction effectiveness(specM, schema, opt) {\n var features = SCORERS.reduce(function (f, scorer) {\n var scores = scorer.getScore(specM, schema, opt);\n return f.concat(scores);\n }, []);\n return {\n score: features.reduce(function (s, f) {\n return s + f.score;\n }, 0),\n features: features\n };\n}\nexports.effectiveness = effectiveness;\n\n\n/***/ }),\n/* 188 */\n/* unknown exports provided */\n/* all exports used */\n/*!********************************************!*\\\n !*** ./~/compassql/build/src/recommend.js ***!\n \\********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar config_1 = __webpack_require__(/*! ./config */ 69);\nvar generate_1 = __webpack_require__(/*! ./generate */ 356);\nvar nest_1 = __webpack_require__(/*! ./nest */ 125);\nvar normalize_1 = __webpack_require__(/*! ./query/normalize */ 357);\nvar ranking_1 = __webpack_require__(/*! ./ranking/ranking */ 367);\nfunction recommend(q, schema, config) {\n // 1. Normalize non-nested `groupBy` to always have `groupBy` inside `nest`\n // and merge config with the following precedence\n // query.config > config > DEFAULT_QUERY_CONFIG\n q = __assign({}, normalize_1.normalize(q), { config: __assign({}, config_1.DEFAULT_QUERY_CONFIG, config, q.config) });\n // 2. Generate\n var answerSet = generate_1.generate(q.spec, schema, q.config);\n var nestedAnswerSet = nest_1.nest(answerSet, q.nest);\n var result = ranking_1.rank(nestedAnswerSet, q, schema, 0);\n return {\n query: q,\n result: result\n };\n}\nexports.recommend = recommend;\n\n\n/***/ }),\n/* 189 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************!*\\\n !*** ./~/component-indexof/index.js ***!\n \\**************************************/\n/***/ (function(module, exports) {\n\nmodule.exports = function(arr, obj){\n if (arr.indexOf) return arr.indexOf(obj);\n for (var i = 0; i < arr.length; ++i) {\n if (arr[i] === obj) return i;\n }\n return -1;\n};\n\n/***/ }),\n/* 190 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/core-js/library/modules/_dom-create.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(/*! ./_is-object */ 77)\n , document = __webpack_require__(/*! ./_global */ 50).document\n // in old IE typeof document.createElement is 'object'\n , is = isObject(document) && isObject(document.createElement);\nmodule.exports = function(it){\n return is ? document.createElement(it) : {};\n};\n\n/***/ }),\n/* 191 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************************************!*\\\n !*** ./~/core-js/library/modules/_ie8-dom-define.js ***!\n \\******************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(/*! ./_descriptors */ 60) && !__webpack_require__(/*! ./_fails */ 72)(function(){\n return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ 190)('div'), 'a', {get: function(){ return 7; }}).a != 7;\n});\n\n/***/ }),\n/* 192 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************!*\\\n !*** ./~/core-js/library/modules/_iobject.js ***!\n \\***********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(/*! ./_cof */ 127);\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n/***/ }),\n/* 193 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************!*\\\n !*** ./~/core-js/library/modules/_iter-define.js ***!\n \\***************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(/*! ./_library */ 131)\n , $export = __webpack_require__(/*! ./_export */ 49)\n , redefine = __webpack_require__(/*! ./_redefine */ 198)\n , hide = __webpack_require__(/*! ./_hide */ 73)\n , has = __webpack_require__(/*! ./_has */ 61)\n , Iterators = __webpack_require__(/*! ./_iterators */ 78)\n , $iterCreate = __webpack_require__(/*! ./_iter-create */ 391)\n , setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ 135)\n , getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ 195)\n , ITERATOR = __webpack_require__(/*! ./_wks */ 37)('iterator')\n , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n , FF_ITERATOR = '@@iterator'\n , KEYS = 'keys'\n , VALUES = 'values';\n\nvar returnThis = function(){ return this; };\n\nmodule.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){\n $iterCreate(Constructor, NAME, next);\n var getMethod = function(kind){\n if(!BUGGY && kind in proto)return proto[kind];\n switch(kind){\n case KEYS: return function keys(){ return new Constructor(this, kind); };\n case VALUES: return function values(){ return new Constructor(this, kind); };\n } return function entries(){ return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator'\n , DEF_VALUES = DEFAULT == VALUES\n , VALUES_BUG = false\n , proto = Base.prototype\n , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]\n , $default = $native || getMethod(DEFAULT)\n , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined\n , $anyNative = NAME == 'Array' ? proto.entries || $native : $native\n , methods, key, IteratorPrototype;\n // Fix native\n if($anyNative){\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base));\n if(IteratorPrototype !== Object.prototype){\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if(DEF_VALUES && $native && $native.name !== VALUES){\n VALUES_BUG = true;\n $default = function values(){ return $native.call(this); };\n }\n // Define iterator\n if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if(DEFAULT){\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if(FORCED)for(key in methods){\n if(!(key in proto))redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n\n/***/ }),\n/* 194 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************!*\\\n !*** ./~/core-js/library/modules/_object-gopn.js ***!\n \\***************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(/*! ./_object-keys-internal */ 196)\n , hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ 130).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O){\n return $keys(O, hiddenKeys);\n};\n\n/***/ }),\n/* 195 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/core-js/library/modules/_object-gpo.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(/*! ./_has */ 61)\n , toObject = __webpack_require__(/*! ./_to-object */ 101)\n , IE_PROTO = __webpack_require__(/*! ./_shared-key */ 136)('IE_PROTO')\n , ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function(O){\n O = toObject(O);\n if(has(O, IE_PROTO))return O[IE_PROTO];\n if(typeof O.constructor == 'function' && O instanceof O.constructor){\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n\n/***/ }),\n/* 196 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************************************!*\\\n !*** ./~/core-js/library/modules/_object-keys-internal.js ***!\n \\************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(/*! ./_has */ 61)\n , toIObject = __webpack_require__(/*! ./_to-iobject */ 52)\n , arrayIndexOf = __webpack_require__(/*! ./_array-includes */ 383)(false)\n , IE_PROTO = __webpack_require__(/*! ./_shared-key */ 136)('IE_PROTO');\n\nmodule.exports = function(object, names){\n var O = toIObject(object)\n , i = 0\n , result = []\n , key;\n for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while(names.length > i)if(has(O, key = names[i++])){\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n/***/ }),\n/* 197 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************************!*\\\n !*** ./~/core-js/library/modules/_object-sap.js ***!\n \\**************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(/*! ./_export */ 49)\n , core = __webpack_require__(/*! ./_core */ 25)\n , fails = __webpack_require__(/*! ./_fails */ 72);\nmodule.exports = function(KEY, exec){\n var fn = (core.Object || {})[KEY] || Object[KEY]\n , exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);\n};\n\n/***/ }),\n/* 198 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************************!*\\\n !*** ./~/core-js/library/modules/_redefine.js ***!\n \\************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./_hide */ 73);\n\n/***/ }),\n/* 199 */\n/* unknown exports provided */\n/* all exports used */\n/*!*************************************************!*\\\n !*** ./~/core-js/library/modules/_to-length.js ***!\n \\*************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(/*! ./_to-integer */ 138)\n , min = Math.min;\nmodule.exports = function(it){\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n/***/ }),\n/* 200 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************************************!*\\\n !*** ./~/core-js/library/modules/es6.string.iterator.js ***!\n \\**********************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $at = __webpack_require__(/*! ./_string-at */ 400)(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n__webpack_require__(/*! ./_iter-define */ 193)(String, 'String', function(iterated){\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function(){\n var O = this._t\n , index = this._i\n , point;\n if(index >= O.length)return {value: undefined, done: true};\n point = $at(O, index);\n this._i += point.length;\n return {value: point, done: false};\n});\n\n/***/ }),\n/* 201 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************************!*\\\n !*** ./~/css-in-js-utils/lib/hyphenateProperty.js ***!\n \\****************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = hyphenateProperty;\n\nvar _hyphenateStyleName = __webpack_require__(/*! hyphenate-style-name */ 437);\n\nvar _hyphenateStyleName2 = _interopRequireDefault(_hyphenateStyleName);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction hyphenateProperty(property) {\n return (0, _hyphenateStyleName2.default)(property);\n}\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 202 */\n/* unknown exports provided */\n/* all exports used */\n/*!**************************************!*\\\n !*** ./~/datalib/src/import/type.js ***!\n \\**************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar util = __webpack_require__(/*! ../util */ 32);\n\nvar TYPES = '__types__';\n\nvar PARSERS = {\n boolean: util.boolean,\n integer: util.number,\n number: util.number,\n date: util.date,\n string: function(x) { return x == null || x === '' ? null : x + ''; }\n};\n\nvar TESTS = {\n boolean: function(x) { return x==='true' || x==='false' || util.isBoolean(x); },\n integer: function(x) { return TESTS.number(x) && (x=+x) === ~~x; },\n number: function(x) { return !isNaN(+x) && !util.isDate(x); },\n date: function(x) { return !isNaN(Date.parse(x)); }\n};\n\nfunction annotation(data, types) {\n if (!types) return data && data[TYPES] || null;\n data[TYPES] = types;\n}\n\nfunction fieldNames(datum) {\n return util.keys(datum);\n}\n\nfunction bracket(fieldName) {\n return '[' + fieldName + ']';\n}\n\nfunction type(values, f) {\n values = util.array(values);\n f = util.$(f);\n var v, i, n;\n\n // if data array has type annotations, use them\n if (values[TYPES]) {\n v = f(values[TYPES]);\n if (util.isString(v)) return v;\n }\n\n for (i=0, n=values.length; !util.isValid(v) && i\n
\n 元素 6 高 100px 宽 50px
\n
\n \n */\n // element.offsetParent does the right thing in ie7 and below. Return parent with layout!\n // In other browsers it only includes elements with position absolute, relative or\n // fixed, not elements with overflow set to auto or scroll.\n // if (UA.ie && ieMode < 8) {\n // return element.offsetParent;\n // }\n // 统一的 offsetParent 方法\n var doc = __WEBPACK_IMPORTED_MODULE_0__utils__[\"a\" /* default */].getDocument(element);\n var body = doc.body;\n var parent = void 0;\n var positionStyle = __WEBPACK_IMPORTED_MODULE_0__utils__[\"a\" /* default */].css(element, 'position');\n var skipStatic = positionStyle === 'fixed' || positionStyle === 'absolute';\n\n if (!skipStatic) {\n return element.nodeName.toLowerCase() === 'html' ? null : element.parentNode;\n }\n\n for (parent = element.parentNode; parent && parent !== body; parent = parent.parentNode) {\n positionStyle = __WEBPACK_IMPORTED_MODULE_0__utils__[\"a\" /* default */].css(parent, 'position');\n if (positionStyle !== 'static') {\n return parent;\n }\n }\n return null;\n}\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (getOffsetParent);\n\n/***/ }),\n/* 205 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************************!*\\\n !*** ./~/inline-style-prefixer/utils/addNewValuesOnly.js ***!\n \\***********************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = addNewValuesOnly;\nfunction addIfNew(list, value) {\n if (list.indexOf(value) === -1) {\n list.push(value);\n }\n}\n\nfunction addNewValuesOnly(list, values) {\n if (Array.isArray(values)) {\n for (var i = 0, len = values.length; i < len; ++i) {\n addIfNew(list, values[i]);\n }\n } else {\n addIfNew(list, values);\n }\n}\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 206 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************!*\\\n !*** ./~/inline-style-prefixer/utils/isObject.js ***!\n \\***************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = isObject;\nfunction isObject(value) {\n return value instanceof Object && !Array.isArray(value);\n}\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 207 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************************************!*\\\n !*** ./~/inline-style-prefixer/utils/prefixValue.js ***!\n \\******************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = prefixValue;\nfunction prefixValue(plugins, property, value, style, metaData) {\n for (var i = 0, len = plugins.length; i < len; ++i) {\n var processedValue = plugins[i](property, value, style, metaData);\n\n // we can stop processing if a value is returned\n // as all plugin criteria are unique\n if (processedValue) {\n return processedValue;\n }\n }\n}\nmodule.exports = exports[\"default\"];\n\n/***/ }),\n/* 208 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************************!*\\\n !*** ./~/isomorphic-fetch/fetch-npm-browserify.js ***!\n \\****************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n// the whatwg-fetch polyfill installs the fetch() function\n// on the global object (window or self)\n//\n// Return that as the export for use in Webpack, Browserify etc.\n__webpack_require__(/*! whatwg-fetch */ 678);\nmodule.exports = self.fetch.bind(self);\n\n\n/***/ }),\n/* 209 */\n/* unknown exports provided */\n/* all exports used */\n/*!**********************************!*\\\n !*** ./~/object-assign/index.js ***!\n \\**********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 210 */\n/* exports provided: default */\n/* exports used: default */\n/*!*********************************!*\\\n !*** ./~/rc-animate/es/util.js ***!\n \\*********************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar util = {\n isAppearSupported: function isAppearSupported(props) {\n return props.transitionName && props.transitionAppear || props.animation.appear;\n },\n isEnterSupported: function isEnterSupported(props) {\n return props.transitionName && props.transitionEnter || props.animation.enter;\n },\n isLeaveSupported: function isLeaveSupported(props) {\n return props.transitionName && props.transitionLeave || props.animation.leave;\n },\n allowAppearCallback: function allowAppearCallback(props) {\n return props.transitionAppear || props.animation.appear;\n },\n allowEnterCallback: function allowEnterCallback(props) {\n return props.transitionEnter || props.animation.enter;\n },\n allowLeaveCallback: function allowLeaveCallback(props) {\n return props.transitionLeave || props.animation.leave;\n }\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (util);\n\n/***/ }),\n/* 211 */\n/* exports provided: default */\n/* exports used: default */\n/*!****************************************!*\\\n !*** ./~/rc-slider/es/common/Track.js ***!\n \\****************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends__ = __webpack_require__(/*! babel-runtime/helpers/extends */ 17);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);\n\n/* eslint-disable react/prop-types */\n\n\nvar Track = function Track(props) {\n var className = props.className,\n included = props.included,\n vertical = props.vertical,\n offset = props.offset,\n length = props.length,\n style = props.style;\n\n\n var positonStyle = vertical ? {\n bottom: offset + '%',\n height: length + '%'\n } : {\n left: offset + '%',\n width: length + '%'\n };\n\n var elStyle = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends___default()({\n visibility: included ? 'visible' : 'hidden'\n }, style, positonStyle);\n return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement('div', { className: className, style: elStyle });\n};\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Track);\n\n/***/ }),\n/* 212 */\n/* exports provided: default */\n/* exports used: default */\n/*!***********************************************!*\\\n !*** ./~/rc-slider/es/common/createSlider.js ***!\n \\***********************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = createSlider;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_objectWithoutProperties__ = __webpack_require__(/*! babel-runtime/helpers/objectWithoutProperties */ 75);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_objectWithoutProperties___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_objectWithoutProperties__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends__ = __webpack_require__(/*! babel-runtime/helpers/extends */ 17);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_defineProperty__ = __webpack_require__(/*! babel-runtime/helpers/defineProperty */ 68);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_defineProperty___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_defineProperty__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck__ = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ 27);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass__ = __webpack_require__(/*! babel-runtime/helpers/createClass */ 28);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn__ = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ 30);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_get__ = __webpack_require__(/*! babel-runtime/helpers/get */ 346);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_get__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_babel_runtime_helpers_inherits__ = __webpack_require__(/*! babel-runtime/helpers/inherits */ 29);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_babel_runtime_helpers_inherits___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_babel_runtime_helpers_inherits__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_react__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_react__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9_prop_types__ = __webpack_require__(/*! prop-types */ 1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_9_prop_types__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10_rc_util_es_Dom_addEventListener__ = __webpack_require__(/*! rc-util/es/Dom/addEventListener */ 502);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_classnames__ = __webpack_require__(/*! classnames */ 47);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11_classnames__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12_warning__ = __webpack_require__(/*! warning */ 114);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12_warning___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_12_warning__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__Steps__ = __webpack_require__(/*! ./Steps */ 493);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__Marks__ = __webpack_require__(/*! ./Marks */ 492);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__Handle__ = __webpack_require__(/*! ../Handle */ 148);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__utils__ = __webpack_require__(/*! ../utils */ 149);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction noop() {}\n\nfunction createSlider(Component) {\n var _class, _temp;\n\n return _temp = _class = function (_Component) {\n __WEBPACK_IMPORTED_MODULE_7_babel_runtime_helpers_inherits___default()(ComponentEnhancer, _Component);\n\n function ComponentEnhancer(props) {\n __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck___default()(this, ComponentEnhancer);\n\n var _this = __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn___default()(this, (ComponentEnhancer.__proto__ || Object.getPrototypeOf(ComponentEnhancer)).call(this, props));\n\n _this.onMouseDown = function (e) {\n if (e.button !== 0) {\n return;\n }\n\n var isVertical = _this.props.vertical;\n var position = __WEBPACK_IMPORTED_MODULE_16__utils__[\"e\" /* getMousePosition */](isVertical, e);\n if (!__WEBPACK_IMPORTED_MODULE_16__utils__[\"f\" /* isEventFromHandle */](e, _this.handlesRefs)) {\n _this.dragOffset = 0;\n } else {\n var handlePosition = __WEBPACK_IMPORTED_MODULE_16__utils__[\"g\" /* getHandleCenterPosition */](isVertical, e.target);\n _this.dragOffset = position - handlePosition;\n position = handlePosition;\n }\n _this.onStart(position);\n _this.addDocumentMouseEvents();\n __WEBPACK_IMPORTED_MODULE_16__utils__[\"b\" /* pauseEvent */](e);\n };\n\n _this.onTouchStart = function (e) {\n if (__WEBPACK_IMPORTED_MODULE_16__utils__[\"h\" /* isNotTouchEvent */](e)) return;\n\n var isVertical = _this.props.vertical;\n var position = __WEBPACK_IMPORTED_MODULE_16__utils__[\"i\" /* getTouchPosition */](isVertical, e);\n if (!__WEBPACK_IMPORTED_MODULE_16__utils__[\"f\" /* isEventFromHandle */](e, _this.handlesRefs)) {\n _this.dragOffset = 0;\n } else {\n var handlePosition = __WEBPACK_IMPORTED_MODULE_16__utils__[\"g\" /* getHandleCenterPosition */](isVertical, e.target);\n _this.dragOffset = position - handlePosition;\n position = handlePosition;\n }\n _this.onStart(position);\n _this.addDocumentTouchEvents();\n __WEBPACK_IMPORTED_MODULE_16__utils__[\"b\" /* pauseEvent */](e);\n };\n\n _this.onFocus = function (e) {\n var isVertical = _this.props.vertical;\n\n if (__WEBPACK_IMPORTED_MODULE_16__utils__[\"f\" /* isEventFromHandle */](e, _this.handlesRefs)) {\n var handlePosition = __WEBPACK_IMPORTED_MODULE_16__utils__[\"g\" /* getHandleCenterPosition */](isVertical, e.target);\n\n _this.dragOffset = 0;\n _this.onStart(handlePosition);\n __WEBPACK_IMPORTED_MODULE_16__utils__[\"b\" /* pauseEvent */](e);\n }\n };\n\n _this.onBlur = function (e) {\n _this.onEnd(e);\n };\n\n _this.onMouseMove = function (e) {\n if (!_this.sliderRef) {\n _this.onEnd();\n return;\n }\n var position = __WEBPACK_IMPORTED_MODULE_16__utils__[\"e\" /* getMousePosition */](_this.props.vertical, e);\n _this.onMove(e, position - _this.dragOffset);\n };\n\n _this.onTouchMove = function (e) {\n if (__WEBPACK_IMPORTED_MODULE_16__utils__[\"h\" /* isNotTouchEvent */](e) || !_this.sliderRef) {\n _this.onEnd();\n return;\n }\n\n var position = __WEBPACK_IMPORTED_MODULE_16__utils__[\"i\" /* getTouchPosition */](_this.props.vertical, e);\n _this.onMove(e, position - _this.dragOffset);\n };\n\n _this.onKeyDown = function (e) {\n if (_this.sliderRef && __WEBPACK_IMPORTED_MODULE_16__utils__[\"f\" /* isEventFromHandle */](e, _this.handlesRefs)) {\n _this.onKeyboard(e);\n }\n };\n\n _this.saveSlider = function (slider) {\n _this.sliderRef = slider;\n };\n\n if (undefined !== 'production') {\n var step = props.step,\n max = props.max,\n min = props.min;\n\n __WEBPACK_IMPORTED_MODULE_12_warning___default()(step && Math.floor(step) === step ? (max - min) % step === 0 : true, 'Slider[max] - Slider[min] (%s) should be a multiple of Slider[step] (%s)', max - min, step);\n }\n _this.handlesRefs = {};\n return _this;\n }\n\n __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass___default()(ComponentEnhancer, [{\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n if (__WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_get___default()(ComponentEnhancer.prototype.__proto__ || Object.getPrototypeOf(ComponentEnhancer.prototype), 'componentWillUnmount', this)) __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_get___default()(ComponentEnhancer.prototype.__proto__ || Object.getPrototypeOf(ComponentEnhancer.prototype), 'componentWillUnmount', this).call(this);\n this.removeDocumentEvents();\n }\n }, {\n key: 'addDocumentTouchEvents',\n value: function addDocumentTouchEvents() {\n this.onTouchMoveListener = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10_rc_util_es_Dom_addEventListener__[\"a\" /* default */])(document, 'touchmove', this.onTouchMove);\n this.onTouchUpListener = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10_rc_util_es_Dom_addEventListener__[\"a\" /* default */])(document, 'touchend', this.onEnd);\n }\n }, {\n key: 'addDocumentMouseEvents',\n value: function addDocumentMouseEvents() {\n this.onMouseMoveListener = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10_rc_util_es_Dom_addEventListener__[\"a\" /* default */])(document, 'mousemove', this.onMouseMove);\n this.onMouseUpListener = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10_rc_util_es_Dom_addEventListener__[\"a\" /* default */])(document, 'mouseup', this.onEnd);\n }\n }, {\n key: 'removeDocumentEvents',\n value: function removeDocumentEvents() {\n \n this.onTouchMoveListener && this.onTouchMoveListener.remove();\n this.onTouchUpListener && this.onTouchUpListener.remove();\n\n this.onMouseMoveListener && this.onMouseMoveListener.remove();\n this.onMouseUpListener && this.onMouseUpListener.remove();\n \n }\n }, {\n key: 'getSliderStart',\n value: function getSliderStart() {\n var slider = this.sliderRef;\n var rect = slider.getBoundingClientRect();\n\n return this.props.vertical ? rect.top : rect.left;\n }\n }, {\n key: 'getSliderLength',\n value: function getSliderLength() {\n var slider = this.sliderRef;\n if (!slider) {\n return 0;\n }\n\n var coords = slider.getBoundingClientRect();\n return this.props.vertical ? coords.height : coords.width;\n }\n }, {\n key: 'calcValue',\n value: function calcValue(offset) {\n var _props = this.props,\n vertical = _props.vertical,\n min = _props.min,\n max = _props.max;\n\n var ratio = Math.abs(Math.max(offset, 0) / this.getSliderLength());\n var value = vertical ? (1 - ratio) * (max - min) + min : ratio * (max - min) + min;\n return value;\n }\n }, {\n key: 'calcValueByPos',\n value: function calcValueByPos(position) {\n var pixelOffset = position - this.getSliderStart();\n var nextValue = this.trimAlignValue(this.calcValue(pixelOffset));\n return nextValue;\n }\n }, {\n key: 'calcOffset',\n value: function calcOffset(value) {\n var _props2 = this.props,\n min = _props2.min,\n max = _props2.max;\n\n var ratio = (value - min) / (max - min);\n return ratio * 100;\n }\n }, {\n key: 'saveHandle',\n value: function saveHandle(index, handle) {\n this.handlesRefs[index] = handle;\n }\n }, {\n key: 'render',\n value: function render() {\n var _classNames;\n\n var _props3 = this.props,\n prefixCls = _props3.prefixCls,\n className = _props3.className,\n marks = _props3.marks,\n dots = _props3.dots,\n step = _props3.step,\n included = _props3.included,\n disabled = _props3.disabled,\n vertical = _props3.vertical,\n min = _props3.min,\n max = _props3.max,\n children = _props3.children,\n maximumTrackStyle = _props3.maximumTrackStyle,\n style = _props3.style,\n railStyle = _props3.railStyle,\n dotStyle = _props3.dotStyle,\n activeDotStyle = _props3.activeDotStyle;\n\n var _get$call = __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_get___default()(ComponentEnhancer.prototype.__proto__ || Object.getPrototypeOf(ComponentEnhancer.prototype), 'render', this).call(this),\n tracks = _get$call.tracks,\n handles = _get$call.handles;\n\n var sliderClassName = __WEBPACK_IMPORTED_MODULE_11_classnames___default()(prefixCls, (_classNames = {}, __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_defineProperty___default()(_classNames, prefixCls + '-with-marks', Object.keys(marks).length), __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_defineProperty___default()(_classNames, prefixCls + '-disabled', disabled), __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_defineProperty___default()(_classNames, prefixCls + '-vertical', vertical), __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_defineProperty___default()(_classNames, className, className), _classNames));\n return __WEBPACK_IMPORTED_MODULE_8_react___default.a.createElement(\n 'div',\n {\n ref: this.saveSlider,\n className: sliderClassName,\n onTouchStart: disabled ? noop : this.onTouchStart,\n onMouseDown: disabled ? noop : this.onMouseDown,\n onKeyDown: disabled ? noop : this.onKeyDown,\n onFocus: disabled ? noop : this.onFocus,\n onBlur: disabled ? noop : this.onBlur,\n style: style\n },\n __WEBPACK_IMPORTED_MODULE_8_react___default.a.createElement('div', {\n className: prefixCls + '-rail',\n style: __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, maximumTrackStyle, railStyle)\n }),\n tracks,\n __WEBPACK_IMPORTED_MODULE_8_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__Steps__[\"a\" /* default */], {\n prefixCls: prefixCls,\n vertical: vertical,\n marks: marks,\n dots: dots,\n step: step,\n included: included,\n lowerBound: this.getLowerBound(),\n upperBound: this.getUpperBound(),\n max: max,\n min: min,\n dotStyle: dotStyle,\n activeDotStyle: activeDotStyle\n }),\n handles,\n __WEBPACK_IMPORTED_MODULE_8_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_14__Marks__[\"a\" /* default */], {\n className: prefixCls + '-mark',\n vertical: vertical,\n marks: marks,\n included: included,\n lowerBound: this.getLowerBound(),\n upperBound: this.getUpperBound(),\n max: max,\n min: min\n }),\n children\n );\n }\n }]);\n\n return ComponentEnhancer;\n }(Component), _class.displayName = 'ComponentEnhancer(' + Component.displayName + ')', _class.propTypes = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, Component.propTypes, {\n min: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.number,\n max: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.number,\n step: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.number,\n marks: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object,\n included: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.bool,\n className: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.string,\n prefixCls: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.string,\n disabled: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.bool,\n children: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.any,\n onBeforeChange: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.func,\n onChange: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.func,\n onAfterChange: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.func,\n handle: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.func,\n dots: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.bool,\n vertical: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.bool,\n style: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object,\n minimumTrackStyle: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object, maximumTrackStyle: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object, handleStyle: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object)]),\n trackStyle: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object)]),\n railStyle: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object,\n dotStyle: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object,\n activeDotStyle: __WEBPACK_IMPORTED_MODULE_9_prop_types___default.a.object\n }), _class.defaultProps = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, Component.defaultProps, {\n prefixCls: 'rc-slider',\n className: '',\n min: 0,\n max: 100,\n step: 1,\n marks: {},\n handle: function handle(_ref) {\n var index = _ref.index,\n restProps = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_objectWithoutProperties___default()(_ref, ['index']);\n\n delete restProps.dragging;\n return __WEBPACK_IMPORTED_MODULE_8_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_15__Handle__[\"a\" /* default */], __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, restProps, { key: index }));\n },\n\n onBeforeChange: noop,\n onChange: noop,\n onAfterChange: noop,\n included: true,\n disabled: false,\n dots: false,\n vertical: false,\n trackStyle: [{}],\n handleStyle: [{}],\n railStyle: {},\n dotStyle: {},\n activeDotStyle: {}\n }), _temp;\n}\n\n/***/ }),\n/* 213 */\n/* exports provided: default */\n/* exports used: default */\n/*!******************************************!*\\\n !*** ./~/rc-trigger/es/LazyRenderBox.js ***!\n \\******************************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_objectWithoutProperties__ = __webpack_require__(/*! babel-runtime/helpers/objectWithoutProperties */ 75);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_objectWithoutProperties___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_objectWithoutProperties__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__ = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ 27);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__ = __webpack_require__(/*! babel-runtime/helpers/createClass */ 28);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_possibleConstructorReturn__ = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ 30);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_possibleConstructorReturn___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_possibleConstructorReturn__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_inherits__ = __webpack_require__(/*! babel-runtime/helpers/inherits */ 29);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_inherits___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_inherits__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(/*! react */ 0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(/*! prop-types */ 1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__);\n\n\n\n\n\n\n\n\nvar LazyRenderBox = function (_Component) {\n __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_inherits___default()(LazyRenderBox, _Component);\n\n function LazyRenderBox() {\n __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_classCallCheck___default()(this, LazyRenderBox);\n\n return __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_possibleConstructorReturn___default()(this, (LazyRenderBox.__proto__ || Object.getPrototypeOf(LazyRenderBox)).apply(this, arguments));\n }\n\n __WEBPACK_IMPORTED_MODULE_2_babel_runtime_helpers_createClass___default()(LazyRenderBox, [{\n key: 'shouldComponentUpdate',\n value: function shouldComponentUpdate(nextProps) {\n return nextProps.hiddenClassName || nextProps.visible;\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n hiddenClassName = _props.hiddenClassName,\n visible = _props.visible,\n props = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_objectWithoutProperties___default()(_props, ['hiddenClassName', 'visible']);\n\n if (hiddenClassName || __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.count(props.children) > 1) {\n if (!visible && hiddenClassName) {\n props.className += ' ' + hiddenClassName;\n }\n return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement('div', props);\n }\n\n return __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.only(props.children);\n }\n }]);\n\n return LazyRenderBox;\n}(__WEBPACK_IMPORTED_MODULE_5_react__[\"Component\"]);\n\nLazyRenderBox.propTypes = {\n children: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.any,\n className: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n visible: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,\n hiddenClassName: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string\n};\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (LazyRenderBox);\n\n/***/ }),\n/* 214 */\n/* exports provided: getAlignFromPlacement, getPopupClassNameFromAlign, saveRef */\n/* exports used: getPopupClassNameFromAlign, getAlignFromPlacement, saveRef */\n/*!**********************************!*\\\n !*** ./~/rc-trigger/es/utils.js ***!\n \\**********************************/\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = getAlignFromPlacement;\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = getPopupClassNameFromAlign;\n/* harmony export (immutable) */ __webpack_exports__[\"c\"] = saveRef;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends__ = __webpack_require__(/*! babel-runtime/helpers/extends */ 17);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends__);\n\nfunction isPointsEq(a1, a2) {\n return a1[0] === a2[0] && a1[1] === a2[1];\n}\n\nfunction getAlignFromPlacement(builtinPlacements, placementStr, align) {\n var baseAlign = builtinPlacements[placementStr] || {};\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_extends___default()({}, baseAlign, align);\n}\n\nfunction getPopupClassNameFromAlign(builtinPlacements, prefixCls, align) {\n var points = align.points;\n for (var placement in builtinPlacements) {\n if (builtinPlacements.hasOwnProperty(placement)) {\n if (isPointsEq(builtinPlacements[placement].points, points)) {\n return prefixCls + '-placement-' + placement;\n }\n }\n }\n return '';\n}\n\nfunction saveRef(name, component) {\n this[name] = component;\n}\n\n/***/ }),\n/* 215 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************!*\\\n !*** ./~/rc-util/lib/Dom/addEventListener.js ***!\n \\***********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports['default'] = addEventListenerWrap;\n\nvar _addDomEventListener = __webpack_require__(/*! add-dom-event-listener */ 177);\n\nvar _addDomEventListener2 = _interopRequireDefault(_addDomEventListener);\n\nvar _reactDom = __webpack_require__(/*! react-dom */ 24);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction addEventListenerWrap(target, eventType, cb) {\n /* eslint camelcase: 2 */\n var callback = _reactDom2['default'].unstable_batchedUpdates ? function run(e) {\n _reactDom2['default'].unstable_batchedUpdates(cb, e);\n } : cb;\n return (0, _addDomEventListener2['default'])(target, eventType, callback);\n}\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 216 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************!*\\\n !*** ./~/react-datetime/~/object-assign/index.js ***!\n \\***************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction ToObject(val) {\n\tif (val == null) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction ownEnumerableKeys(obj) {\n\tvar keys = Object.getOwnPropertyNames(obj);\n\n\tif (Object.getOwnPropertySymbols) {\n\t\tkeys = keys.concat(Object.getOwnPropertySymbols(obj));\n\t}\n\n\treturn keys.filter(function (key) {\n\t\treturn propIsEnumerable.call(obj, key);\n\t});\n}\n\nmodule.exports = Object.assign || function (target, source) {\n\tvar from;\n\tvar keys;\n\tvar to = ToObject(target);\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = arguments[s];\n\t\tkeys = ownEnumerableKeys(Object(from));\n\n\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\tto[keys[i]] = from[keys[i]];\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 217 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************************************!*\\\n !*** ./~/react-jsonschema-form/lib/components/fields/DescriptionField.js ***!\n \\***************************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _react = __webpack_require__(/*! react */ 0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = __webpack_require__(/*! prop-types */ 1);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction DescriptionField(props) {\n var id = props.id,\n description = props.description;\n\n if (!description) {\n // See #312: Ensure compatibility with old versions of React.\n return _react2.default.createElement(\"div\", null);\n }\n if (typeof description === \"string\") {\n return _react2.default.createElement(\n \"p\",\n { id: id, className: \"field-description\" },\n description\n );\n } else {\n return _react2.default.createElement(\n \"div\",\n { id: id, className: \"field-description\" },\n description\n );\n }\n}\n\nif (undefined !== \"production\") {\n DescriptionField.propTypes = {\n id: _propTypes2.default.string,\n description: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.element])\n };\n}\n\nexports.default = DescriptionField;\n\n/***/ }),\n/* 218 */\n/* unknown exports provided */\n/* all exports used */\n/*!***************************************************************************!*\\\n !*** ./~/react-jsonschema-form/lib/components/fields/UnsupportedField.js ***!\n \\***************************************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = UnsupportedField;\n\nvar _react = __webpack_require__(/*! react */ 0);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction UnsupportedField(_ref) {\n var schema = _ref.schema;\n\n // XXX render json as string so dev can inspect faulty subschema\n return _react2.default.createElement(\n \"div\",\n { className: \"unsupported-field\" },\n \"Unsupported field schema \",\n JSON.stringify(schema, null, 2),\n \".\"\n );\n}\n\n/***/ }),\n/* 219 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************!*\\\n !*** ./~/react-modal/lib/helpers/tabbable.js ***!\n \\***********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = findTabbableDescendants;\n/*!\n * Adapted from jQuery UI core\n *\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n\nvar tabbableNode = /input|select|textarea|button|object/;\n\nfunction hidden(el) {\n return el.offsetWidth <= 0 && el.offsetHeight <= 0 || el.style.display === 'none';\n}\n\nfunction visible(element) {\n var parentElement = element;\n while (parentElement) {\n if (parentElement === document.body) break;\n if (hidden(parentElement)) return false;\n parentElement = parentElement.parentNode;\n }\n return true;\n}\n\nfunction focusable(element, isTabIndexNotNaN) {\n var nodeName = element.nodeName.toLowerCase();\n var res = tabbableNode.test(nodeName) && !element.disabled || (nodeName === \"a\" ? element.href || isTabIndexNotNaN : isTabIndexNotNaN);\n return res && visible(element);\n}\n\nfunction tabbable(element) {\n var tabIndex = element.getAttribute('tabindex');\n if (tabIndex === null) tabIndex = undefined;\n var isTabIndexNaN = isNaN(tabIndex);\n return (isTabIndexNaN || tabIndex >= 0) && focusable(element, !isTabIndexNaN);\n}\n\nfunction findTabbableDescendants(element) {\n return [].slice.call(element.querySelectorAll('*'), 0).filter(tabbable);\n}\n\n/***/ }),\n/* 220 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************!*\\\n !*** ./~/react-modal/lib/index.js ***!\n \\************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _Modal = __webpack_require__(/*! ./components/Modal */ 546);\n\nvar _Modal2 = _interopRequireDefault(_Modal);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _Modal2.default;\n\n/***/ }),\n/* 221 */\n/* unknown exports provided */\n/* all exports used */\n/*!************************************************!*\\\n !*** ./~/react-spinners/dist/helpers/index.js ***!\n \\************************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) {\n if (true) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof exports !== \"undefined\") {\n factory(exports);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod.exports);\n global.index = mod.exports;\n }\n})(this, function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n var calculateRgba = exports.calculateRgba = function calculateRgba(color, opacity) {\n if (color[0] === '#') {\n color = color.slice(1);\n }\n\n if (color.length === 3) {\n var res = '';\n color.split('').forEach(function (c) {\n res += c;\n res += c;\n });\n color = res;\n }\n\n var rgbValues = color.match(/.{2}/g).map(function (hex) {\n return parseInt(hex, 16);\n }).join(', ');\n return 'rgba(' + rgbValues + ', ' + opacity + ')';\n };\n});\n\n/***/ }),\n/* 222 */\n/* unknown exports provided */\n/* all exports used */\n/*!*******************************************!*\\\n !*** ./~/react-tabs/lib/helpers/count.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.getTabsCount = getTabsCount;\nexports.getPanelsCount = getPanelsCount;\n\nvar _childrenDeepMap = __webpack_require__(/*! ../helpers/childrenDeepMap */ 152);\n\nvar _Tab = __webpack_require__(/*! ../components/Tab */ 84);\n\nvar _Tab2 = _interopRequireDefault(_Tab);\n\nvar _TabPanel = __webpack_require__(/*! ../components/TabPanel */ 85);\n\nvar _TabPanel2 = _interopRequireDefault(_TabPanel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getTabsCount(children) {\n var tabCount = 0;\n (0, _childrenDeepMap.deepForEach)(children, function (child) {\n if (child.type === _Tab2.default) tabCount++;\n });\n\n return tabCount;\n}\n\nfunction getPanelsCount(children) {\n var panelCount = 0;\n (0, _childrenDeepMap.deepForEach)(children, function (child) {\n if (child.type === _TabPanel2.default) panelCount++;\n });\n\n return panelCount;\n}\n\n/***/ }),\n/* 223 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************************!*\\\n !*** ./~/react-tabs/lib/helpers/propTypes.js ***!\n \\***********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.childrenPropType = childrenPropType;\nexports.onSelectPropType = onSelectPropType;\nexports.selectedIndexPropType = selectedIndexPropType;\n\nvar _childrenDeepMap = __webpack_require__(/*! ../helpers/childrenDeepMap */ 152);\n\nvar _Tab = __webpack_require__(/*! ../components/Tab */ 84);\n\nvar _Tab2 = _interopRequireDefault(_Tab);\n\nvar _TabList = __webpack_require__(/*! ../components/TabList */ 105);\n\nvar _TabList2 = _interopRequireDefault(_TabList);\n\nvar _TabPanel = __webpack_require__(/*! ../components/TabPanel */ 85);\n\nvar _TabPanel2 = _interopRequireDefault(_TabPanel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction childrenPropType(props, propName, componentName) {\n var error = void 0;\n var tabsCount = 0;\n var panelsCount = 0;\n var tabListFound = false;\n var listTabs = [];\n var children = props[propName];\n\n (0, _childrenDeepMap.deepForEach)(children, function (child) {\n if (child.type === _TabList2.default) {\n if (child.props && child.props.children && _typeof(child.props.children) === 'object') {\n (0, _childrenDeepMap.deepForEach)(child.props.children, function (listChild) {\n return listTabs.push(listChild);\n });\n }\n\n if (tabListFound) {\n error = new Error(\"Found multiple 'TabList' components inside 'Tabs'. Only one is allowed.\");\n }\n tabListFound = true;\n }\n if (child.type === _Tab2.default) {\n if (!tabListFound || listTabs.indexOf(child) === -1) {\n error = new Error(\"Found a 'Tab' component outside of the 'TabList' component. 'Tab' components have to be inside the 'TabList' component.\");\n }\n tabsCount++;\n } else if (child.type === _TabPanel2.default) {\n panelsCount++;\n }\n });\n\n if (!error && tabsCount !== panelsCount) {\n error = new Error('There should be an equal number of \\'Tab\\' and \\'TabPanel\\' in `' + componentName + '`.' + ('Received ' + tabsCount + ' \\'Tab\\' and ' + panelsCount + ' \\'TabPanel\\'.'));\n }\n\n return error;\n}\n\nfunction onSelectPropType(props, propName, componentName, location, propFullName) {\n var prop = props[propName];\n var name = propFullName || propName;\n var error = null;\n\n if (prop && typeof prop !== 'function') {\n error = new Error('Invalid ' + location + ' `' + name + '` of type `' + (typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) + '` supplied to `' + componentName + '`, expected `function`.');\n } else if (props.selectedIndex != null && prop == null) {\n error = new Error('The ' + location + ' `' + name + '` is marked as required in `' + componentName + '`, but its value is `undefined` or `null`.\\n`onSelect` is required when `selectedIndex` is also set. Not doing so will make the tabs not do anything, as `selectedIndex` indicates that you want to handle the selected tab yourself.\\nIf you only want to set the inital tab replace `selectedIndex` with `defaultIndex`.');\n }\n\n return error;\n}\n\nfunction selectedIndexPropType(props, propName, componentName, location, propFullName) {\n var prop = props[propName];\n var name = propFullName || propName;\n var error = null;\n\n if (prop != null && typeof prop !== 'number') {\n error = new Error('Invalid ' + location + ' `' + name + '` of type `' + (typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) + '` supplied to `' + componentName + '`, expected `number`.');\n } else if (props.defaultIndex != null && prop != null) {\n return new Error('The ' + location + ' `' + name + '` cannot be used together with `defaultIndex` in `' + componentName + '`.\\nEither remove `' + name + '` to let `' + componentName + '` handle the selected tab internally or remove `defaultIndex` to handle it yourself.');\n }\n\n return error;\n}\n\n/***/ }),\n/* 224 */\n/* unknown exports provided */\n/* all exports used */\n/*!******************************************!*\\\n !*** ./~/react-tabs/lib/helpers/uuid.js ***!\n \\******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.default = uuid;\nexports.reset = reset;\n// Get a universally unique identifier\nvar count = 0;\nfunction uuid() {\n return \"react-tabs-\" + count++;\n}\n\nfunction reset() {\n count = 0;\n}\n\n/***/ }),\n/* 225 */\n/* unknown exports provided */\n/* all exports used */\n/*!***********************************!*\\\n !*** ./~/react-tabs/lib/index.js ***!\n \\***********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\nexports.resetIdCounter = exports.Tabs = exports.TabPanel = exports.TabList = exports.Tab = undefined;\n\nvar _Tabs = __webpack_require__(/*! ./components/Tabs */ 577);\n\nvar _Tabs2 = _interopRequireDefault(_Tabs);\n\nvar _TabList = __webpack_require__(/*! ./components/TabList */ 105);\n\nvar _TabList2 = _interopRequireDefault(_TabList);\n\nvar _Tab = __webpack_require__(/*! ./components/Tab */ 84);\n\nvar _Tab2 = _interopRequireDefault(_Tab);\n\nvar _TabPanel = __webpack_require__(/*! ./components/TabPanel */ 85);\n\nvar _TabPanel2 = _interopRequireDefault(_TabPanel);\n\nvar _uuid = __webpack_require__(/*! ./helpers/uuid */ 224);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.Tab = _Tab2.default;\nexports.TabList = _TabList2.default;\nexports.TabPanel = _TabPanel2.default;\nexports.Tabs = _Tabs2.default;\nexports.resetIdCounter = _uuid.reset;\n\n/***/ }),\n/* 226 */\n/* unknown exports provided */\n/* all exports used */\n/*!****************************************!*\\\n !*** ./~/setimmediate/setImmediate.js ***!\n \\****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a