From 5ae168ceb30ac2239b31afc26d66a2ec5bb70309 Mon Sep 17 00:00:00 2001 From: mgasner Date: Thu, 18 Apr 2019 12:45:00 -0400 Subject: [PATCH] Reference docs (#1237) --- python_modules/dagster/dagster/__init__.py | 4 + python_modules/dagster/dev-requirements.txt | 2 +- python_modules/dagster/docs/index.rst | 1 + .../docs/sections/api/apidocs/pipeline.rst | 6 +- .../sections/learn/tutorial/hello_dag.rst | 2 +- .../learn/tutorial/multiple_outputs.rst | 2 +- .../sections/learn/tutorial/resources.rst | 2 +- .../docs/sections/learn/tutorial/types.rst | 2 +- .../docs/sections/reference/dependency.png | Bin 0 -> 70938 bytes .../docs/sections/reference/expectation.png | Bin 0 -> 81376 bytes .../sections/reference/materialization.png | Bin 0 -> 121164 bytes .../docs/sections/reference/pipeline.png | Bin 0 -> 101386 bytes .../docs/sections/reference/reference.rst | 262 + .../docs/sections/reference/repository.png | Bin 0 -> 141970 bytes .../docs/sections/reference/resource.png | Bin 0 -> 104840 bytes .../docs/sections/reference/result.png | Bin 0 -> 33295 bytes .../dagster/docs/sections/reference/solid.png | Bin 0 -> 19298 bytes .../docs/sections/reference/transform_fn.png | Bin 0 -> 38601 bytes .../docs/snapshots/snap_test_doc_build.py | 28153 +++++++++++++++- python_modules/dagster/docs/test_doc_build.py | 4 +- 20 files changed, 28427 insertions(+), 13 deletions(-) create mode 100644 python_modules/dagster/docs/sections/reference/dependency.png create mode 100644 python_modules/dagster/docs/sections/reference/expectation.png create mode 100644 python_modules/dagster/docs/sections/reference/materialization.png create mode 100644 python_modules/dagster/docs/sections/reference/pipeline.png create mode 100644 python_modules/dagster/docs/sections/reference/reference.rst create mode 100644 python_modules/dagster/docs/sections/reference/repository.png create mode 100644 python_modules/dagster/docs/sections/reference/resource.png create mode 100644 python_modules/dagster/docs/sections/reference/result.png create mode 100644 python_modules/dagster/docs/sections/reference/solid.png create mode 100644 python_modules/dagster/docs/sections/reference/transform_fn.png diff --git a/python_modules/dagster/dagster/__init__.py b/python_modules/dagster/dagster/__init__.py index a6a71720c5565..7f17c6e37f001 100644 --- a/python_modules/dagster/dagster/__init__.py +++ b/python_modules/dagster/dagster/__init__.py @@ -1,6 +1,8 @@ from dagster.core import types from dagster.core.execution import ( + InitContext, + InitResourceContext, PipelineConfigEvaluationError, PipelineExecutionResult, SolidExecutionResult, @@ -109,6 +111,8 @@ 'execute_pipeline_iterator', 'execute_pipeline', 'ExecutionContext', + 'InitContext', + 'InitResourceContext', 'InProcessExecutorConfig', 'MultiprocessExecutorConfig', 'PipelineConfigEvaluationError', diff --git a/python_modules/dagster/dev-requirements.txt b/python_modules/dagster/dev-requirements.txt index 1162b12598bfe..dd8e81da65c41 100644 --- a/python_modules/dagster/dev-requirements.txt +++ b/python_modules/dagster/dev-requirements.txt @@ -7,7 +7,7 @@ pytest-runner==4.2 recommonmark==0.4.0 rope==0.11 snapshottest==0.5.0 -Sphinx==2.0.1; python_version >= '3.6' +Sphinx>=2.0.1; python_version >= '3.6' sphinx-autobuild==0.7.1 yapf==0.22.0 twine==1.11.0 diff --git a/python_modules/dagster/docs/index.rst b/python_modules/dagster/docs/index.rst index b45770b6972b0..8863a346d887b 100644 --- a/python_modules/dagster/docs/index.rst +++ b/python_modules/dagster/docs/index.rst @@ -7,6 +7,7 @@ Install Learn API Docs + Reference Community diff --git a/python_modules/dagster/docs/sections/api/apidocs/pipeline.rst b/python_modules/dagster/docs/sections/api/apidocs/pipeline.rst index 8e255cedd8c14..c62e1d1cb2603 100644 --- a/python_modules/dagster/docs/sections/api/apidocs/pipeline.rst +++ b/python_modules/dagster/docs/sections/api/apidocs/pipeline.rst @@ -21,10 +21,10 @@ Contexts & Resources :members: .. autoclass:: InitContext - :memebers: + :members: .. autoclass:: ExecutionContext - :memebers: + :members: .. autoclass:: ResourceDefinition :members: @@ -32,7 +32,7 @@ Contexts & Resources .. autodecorator:: resource .. autoclass:: InitResourceContext - :memebers: + :members: ---- diff --git a/python_modules/dagster/docs/sections/learn/tutorial/hello_dag.rst b/python_modules/dagster/docs/sections/learn/tutorial/hello_dag.rst index 9d9b2e065fc1f..90bf5f505e408 100644 --- a/python_modules/dagster/docs/sections/learn/tutorial/hello_dag.rst +++ b/python_modules/dagster/docs/sections/learn/tutorial/hello_dag.rst @@ -25,7 +25,7 @@ This pipeline introduces a few new concepts. pipeline's DAG. .. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/hello_dag.py - :lines: 23-25 + :lines: 18 :dedent: 8 The first layer of keys in this dict are the *names* of solids in the pipeline. The second layer diff --git a/python_modules/dagster/docs/sections/learn/tutorial/multiple_outputs.rst b/python_modules/dagster/docs/sections/learn/tutorial/multiple_outputs.rst index e923ed7fcd98d..848f72b9a00bd 100644 --- a/python_modules/dagster/docs/sections/learn/tutorial/multiple_outputs.rst +++ b/python_modules/dagster/docs/sections/learn/tutorial/multiple_outputs.rst @@ -81,7 +81,7 @@ and then execute that pipeline. .. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/multiple_outputs.py :linenos: :caption: multiple_outputs.py - :lines: 36-49,86-97 + :lines: 36-49,86-96 You must create a config file diff --git a/python_modules/dagster/docs/sections/learn/tutorial/resources.rst b/python_modules/dagster/docs/sections/learn/tutorial/resources.rst index e94f62399fd0e..bdb4e4763a9b6 100644 --- a/python_modules/dagster/docs/sections/learn/tutorial/resources.rst +++ b/python_modules/dagster/docs/sections/learn/tutorial/resources.rst @@ -73,7 +73,7 @@ Now we can simply change configuration and the "in-memory" version of the resource will be used instead of the cloud version: .. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py - :lines: 131-144 + :lines: 106-112 :emphasize-lines: 4 :dedent: 4 diff --git a/python_modules/dagster/docs/sections/learn/tutorial/types.rst b/python_modules/dagster/docs/sections/learn/tutorial/types.rst index 81dc75855cdb5..9709cdb8930de 100644 --- a/python_modules/dagster/docs/sections/learn/tutorial/types.rst +++ b/python_modules/dagster/docs/sections/learn/tutorial/types.rst @@ -12,7 +12,7 @@ Basic Typing ^^^^^^^^^^^^ .. literalinclude:: ../../../../../libraries/dagster-pandas/dagster_pandas/data_frame.py - :lines: 1, 84-92, 95 + :lines: 1, 84-92, 94 What this code doing is annotating/registering an existing type as a dagster type. Now one can include this type and use it as an input or output of a solid. The system will do a typecheck diff --git a/python_modules/dagster/docs/sections/reference/dependency.png b/python_modules/dagster/docs/sections/reference/dependency.png new file mode 100644 index 0000000000000000000000000000000000000000..17b1c1e5258bc4153bd2b846e9396f5e8230eaf5 GIT binary patch literal 70938 zcmeFZAM$cWG@W&*-1&|mPT zLUKYdFy-NB_XY^i@5Dxu%5pF;pDAHry!~NdZlRaFw_#wMm|{i88`)Sf8W`IcnlQRr*+N&q!0@_qLqA%XI2sVUT3K2G>~AER4)d|Ivmn<$b=&tzd6% z0^RwUK0gcZpF96w*Z$dum+5))|MM_^IsJ1L$|^r9FVlZw<42W+P-(!x2*OB-3aPrj z*iS+F@m9j~ap{Wh0xVN8Pq83XVO+986A*{u zccI*&sK8%_V~C>?Bv%avYtwjqa8=&M`M(OzqeGv)-WWId6j@|yhaD)8g_iFXxcHw@jsIi)C1{DMGOKGe7X$1H@t&rLp2yz zg93^!BmF~ zgt`qps>vgU^D{VhU`?AoTQ2Yu^r^nyqF>*F(@z1%hq#p*z|0Vk-Qtq4Yc=vdT&4ev zFvEZ&&6^rsRz<~nbJ%{7I+wx#T;ZH}YtjKdV&2lwo7oDS*uDGcW48=}qhpr#KDRC8 zAK^Kr$iAilP9}<}ZxH$>^$JBF!>2l*bg%JOhWL%wQ>5=c`A}5L+}djMEzGrTQp&CM z+Iwhm<~OdXTjj4g$E_K(>kkUVlMT)`=MxF15UQy)id=EG~6^b(vJ|$QP*g0OL zb#&1yOnf?Xw2JGD>fV5GW>C>lx48r;mee{rz+7DdSNI^q{yD-fSC@zfUX>$rLNT8= z#XAS8P-Y$KT0^atxh(ZCxpqTU>t#sI>m5?^QiijK+A6$pTPh17BzaNwN(2{KLHSjeIYHvG&DKrtrh7$3EgKho)MdEYnq{+C+Xm>KK+GY(Gn3_a_{_9S(4m5O6C# zgv?jkATNBY{JbtMw)=b8o8E3ydq^|0O;7m`ejYZLPi|t zZA$Pfa&8?YHmxtdtu{>RP4?KQX^YCak0Hm+=V6lfW;b1^1C*2pS;6-Kt$ZEwxEKRZ z(&UEYzgsZ#8lo>FNViaS?viBJ%AONkx*kA1<|5=h(Ks<6RE6u6e9XI`SKL8?u|jKd zuel|!gNVq-LyFbJF?AJC2R^ghHfIxnyI`~Cfp=CDrrzk=H^OQUjdFKyaWJ}uW7>Ki z8d($g%&~k=ESn{+Wo^yw8bvt?*B7cR0`%f)lgCg#2YG4TDTHJT1uc-?tN)VLzoY|e zKMDAUXFDHCb`&OhF-G4nP%&z0THk%(y8hll&*13t6U$TT#KC|4L5gyw0Qo9TC}MGb zE>XI>>7fXtNVg8G-^mR!4$!Vy?TF*!%wm)i{RB8L=1is4+hSvhsI+8 z*t@9rx{((CGg7$_fOMm(B9%~+A7gr_`CRSzjGN=#?(bAVJ9&EK%-9hV z8B--ugoRH>cu@ok4enE^Pc5;tEz&1m*t(RehUSyGDqB=crl?IUeSx+zn`ujWr#D5; zj{-6EUs#z0#+&Kya-7M>bTOoYyrqAxEH*0Xf2Gq97rSBsqa9(7c2i+bvT^j<9~0cu zewb9W_6Nd-Bo-Z^wGCflk$`_3k&q-_-sSrrr!@y=d#Q7B#!f2zmqgR!0cG&!Y9NML z)@Z@*2y~3BpHH;+!s#jYjAD=2Eo&BCN+Kp^LP-?Uw#cMav z@vU&9$Q_0R%U$&k62dtLvTu)iv@a`tp)_diPG9dSBTYe>$-Flz_>nOn5Shl!0E9C$ zAetizAdEbi$*&q%eAFOa5XilB;D?{_`Noc(^c-~xATTNqO)TOGsF0FHa_84<%*cSy zsdwno+JRjT!QRJ$p>p`>G)6ybyp48yYiKGRf2kq&2TZ`OMjo>oThgD8+ zz+tP*Y%R)Tz0bYZ_SF!RWq zc=XVIT(I_UDi*jVBkwS@Oj=;ds7OG&KlsIp7y&z4s4=Un;;R~wL{Y`xb%uz3%!G8S z-kickI+D)QoQw-EqWj+iK)_g9>|uecmfFkse1G~m)UUr1UXyMx$Y|498Qt1KT9jt{ z1I}6W;*QAj&j8|&V~`!BzIHdrzP;|y?@Pc6n8dtS2z1p)KPH7@W7YgY_+KA`Z@H8Ct{NZ%#m zU^;U9ow!TCPLbceZU$zCE$u`LPkQUvoc6b(rEH%UVONq8VKvicTQQ%erP8dq+}W+P zU?<*0L56XoHe`p5zb<`VEgPkJiau$sDh_Jv$3k+j^0z4ay!F-oK04wD&DXS$fF~To zuE*$rM2Jc`Jk64DrxywH8~lAa62(Qx9s=xe?Vkk6Obsx0vW~*fwTFGrHll@?6dOUo z-?l9|b|dUqUW8G0j^WQ~{%J-XOR^ha7tjMsZ!YA>$H3em76^#M4OOzgoT2R&tdxJp zzvdXU3T3il^XZ*XqwnN7k?UA%>Y(E^f{A2A3+?{oLa`cO)V@Z@Pt*Nv@~ z7!<$i1Nz7roJ;fYqwr*+=ZPTr)V4VhKg1qVS6>Cf&rb4iLcyL`z9+koS82q7&vje@b5VwSF%k6K#MR?nRff zh&WSpR%-BMHc1T(>8EerJ+MJc9*)`Dz(9Ml(P^7E+K9^n3nu_BNtYnMmbbM#VLZcc z6QD)kx1j6BV-gbHEY!HvB@XlC{p(yYtIs=zA)_sM0Pw;!Hikx*%^e>sn~aSNg)~}! z*_|XpGmY(G6(1>*Og~H{U_7D_Z~&+AviVGk3fxT0a)Q z?@o>z@;5XD?!4?Yit`Czg4A4COqRxp3#ttsMx^P; z4Ti3;Xjf$qR{s=6WR9r?#&7evIA=%fEnQ|27iro-tWG_W?BNf?^COQxqG`8~a7^)v zUSATXuv7LmlXz)zeq6id&;3&}puypp=xhUPB7f6@D%I4LZ3AZL;qggB*aOizG*bPy z3y`$3WJ~Zcbc2d=5x`9_De z)!6iTj;WG81&jyyQMV5cEc-!#q^z!wXe;;-QWA3(C2`O3H||+jELlOvGP7{OKj;)& zau^2n`0U^U2T&13?n!+MO{R7_8vNH`+R!^&nEo~(enZ}3GwCY2v1p?aBtOfD`7u>YT75hjq;(>Q3;27|V-n0|a4)&2DHBO;JpQme=>NnS_dNZ23LOdo8Lf{y037JMxG% z(2C(o!SoPdNq@bCN9of4^kRlp7|$!O)g1Q7g(MVmVqRXPlOsf0qw!varNp&h)hG0`$lDL2NJ#*NKo?x@*;`@7IQpu zUNE;xzV$^#TZPLASpI~!o$jLn`|`6TP2~JLbM{cjJkW1FMtWRdt2cD2x|HIIkwbcE$6xSM{5O?VxWE$k1<8+b4dS z&{snpm-Ybyq>khsJNkSMV^OpNM9L@4qTRG7cLCw3$VRD^bpBN*mT8f;jMDyu?9V+l zfEH?$e$pX? zh4z?-AkTzhtU-b55n5C}G`8w*2qZS04~#P&cr@51W6UZcqLtwO!e97SQMJ6eNZN&= zU1TfyhPPR6x%u4qVqh>#btP50(;Yj9@W#Sti|&SpOW`DeT8qhR)GYcBI^jcNK+H}l zVt;~IPyJFX1fv5;LxA;!fG;Om%cLb6-5= z9u0DY=o;D9=f#?A9y!n~fDFxx(%F{X{(^2iT)0&AG#l>GtHj{&9yg!Xhu!ZJY#g

*l!7V*zPLSGSBMqNlhxaL@IoEtgA=#S?c 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 literal 0 HcmV?d00001 diff --git a/python_modules/dagster/docs/sections/reference/expectation.png b/python_modules/dagster/docs/sections/reference/expectation.png new file mode 100644 index 0000000000000000000000000000000000000000..6425dc34199465fd3e29c48db0a466c86b712986 GIT binary patch literal 81376 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 MK~ug`)++S>03M`i$N&HU literal 0 HcmV?d00001 diff --git a/python_modules/dagster/docs/sections/reference/materialization.png b/python_modules/dagster/docs/sections/reference/materialization.png new file mode 100644 index 0000000000000000000000000000000000000000..20690e8ad89721bc6292c7115bdd4cb72c336d42 GIT binary patch literal 121164 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%0DjUBGuHBi8Vnt9iFOoMQd}3x3q2-4Ir= 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

l9fcx|8l)~Sf@GEBXOyLP( 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, will undoubtably be familiar +if you've previously worked with tools like Airflow. However, Dagster has some important differences +from other workflow systems to facilitate operating at a higher level of abstraction. + +Solid +^^^^^ + +.. image:: solid.png + :scale: 40 % + :align: center + +A solid is a functional unit of computation with defined inputs and outputs. Solids can be strung +together into `pipelines <#pipeline>`__ by defining `dependencies <#dependency-definition>`__ +between their inputs and outputs. Solids are reusable and instances of a solid may appear many +times in a given pipeline, or across many different pipelines. + +Solids often wrap code written in or intended to execute in other systems (e.g., SQL statements, +Jupyter notebooks, or Spark jobs written in Scala), providing a common interface for defining, +orchestrating, and managing data processing applications with heterogeneous components. + +Solids can optionally define the types of their inputs and outputs, and can define a typed schema +so that their inputs can be read from external configuration files. Solids can also enforce +`expectations <#expectation>`__ on their inputs and outputs. + +Solids are defined using the :func:`@lambda_solid ` or +:func:`@solid ` decorators, or using the underlying +:class:`SolidDefinition ` class. These APIs wrap an underlying +`transform function`, making its metadata queryable by higher-level tools. + +Transform Function +^^^^^^^^^^^^^^^^^^ + +.. image:: transform_fn.png + :scale: 40 % + :align: center + +The user-supplied function which forms the heart of a solid definition. The transform functions are +the business logic defined by you as the user; this business logic is what will be executed when the +solid is invoked by the Dagster engine. + + +Result +^^^^^^ + +.. image:: result.png + :scale: 40 % + :align: center + +A result is how a solid's transform function communicates the value of an output, and its +name, to Dagster. + +Solid transform functions are expected to yield a stream of results. Implementers of a solid must +ensure their tranform yields :class:`Result ` objects. + +In the common case where only a single result is yielded, the machinery provides sugar allowing +the user to return a value instead of yielding it, and automatically wrapping the value in the +:class:`Result ` class. + +.. _dependency-definition: + +Dependency Definition +^^^^^^^^^^^^^^^^^^^^^ + +.. image:: dependency.png + :scale: 40 % + :align: center + +Solids are linked together into `pipelines <#pipeline>`__ by defining the dependencies between +their inputs and outputs. Dependencies are data-driven, not workflow-driven -- they define what +data is required for solids to execute, not how or when they execute. + +This reflects an important separation of concerns -- the same pipeline may have very different +execution semantics depending on the environment in which it runs or the way in which it is +scheduled, but these conditions should be expressed separately from its underlying structure. + +Dependencies are defined when constructing pipelines, using the +:class:`DependencyDefinition ` class. + +Intermediates +^^^^^^^^^^^^^ + +.. image:: materialization.png + :scale: 42 % + :align: center + +The intermediate outputs of solids in a pipeline can be materialized. The Dagster engine can +materialize outputs in a number of formats (e.g., json, pickle), and can store materialized +intermediates locally or in object stores such as S3 or GCS. + +Materialized intermediates make it possible to introspect the intermediate state of a pipeline +execution and ask questions like, "Exactly what output did this solid have on this particular run?" +This is useful when auditing or debugging pipelines, and makes it possible to establish the +`provenance` of data artifacts. + +Materialized intermediates also enable `partial re-execution` of pipelines "starting from" a +materialized state of the upstream execution. This is useful when a pipeline fails halfway through, +or in order to explore how new logic in part of a pipeline would have operated on outputs from +previous runs of the pipeline. + +Expectation +^^^^^^^^^^^ + +.. image:: expectation.png + :scale: 40 % + :align: center + +An expectation is a function that determines whether the input or output of a solid passes a +given condition -- for instance, that a value is non-null, or that it is distributed in a certain +way. + +Expectations can be used to enforce runtime data quality and integrity constraints, so that +pipelines fail early -- before any downstream solids execute on bad data. + +Expectations are defined using the :class:`ExpectationDefinition ` +class. We also provide a `thin wrapper `_ +around the `great_expectations `_ library +so you can use its existing repertoire of expectartions with Dagster. + +.. _pipeline: + +Pipeline +^^^^^^^^ + +.. image:: pipeline.png + :scale: 40 % + :align: center + +Data pipelines are directed acyclic graphs (DAGs) of solids -- that is, they are made up of a number +of solids which have data `dependencies <#dependency-definition>`__ on each other (but no circular +dependencies), along with a set of associated pipeline context definitions, which declare the various +environments in which a pipeline can execute. + +Pipelines are defined using the :class:`PipelineDefinition ` class, and +their contexts are defined using :class:`PipelineContextDefinition `. + +When a pipeline is combined with a given config conforming to one of its declared contexts, it can +be compiled by the Dagster engine into an execution plan that can be executed on various compute +substrates. + +Concretely, a pipeline might include context definitions for local testing (where databases and +other resources will be mocked, in-memory, or local) and for running in production (where resources +will require different credentials and expose configuration options). When a pipeline is compiled +with a config corresponding to one of these contexts, it yields an execution plan suitable for the +given environment. + +Resources +^^^^^^^^^ + +.. image:: resource.png + :scale: 40 % + :align: center + +Resources are pipeline-scoped and typically used to expose features of the execution environment +(like database connections) to solids during pipeline execution. Resources can also clean up +after execution resolves. They are typically defined using the :func:`@resource ` +decorator or using the :class:`ResourceDefinition` class directly. + +Repository +^^^^^^^^^^ + +.. image:: repository.png + :scale: 40 % + :align: center + +A repository is a collection of pipelines that can be made available to the Dagit UI and other +higher-level tools. Repositories are defined using the +:class:`RepositoryDefinition ` class, and made available to +higher-level tools with a special ``repository.yml`` file that tells the tools where to look for a +repository definition. + +Dagster Types +^^^^^^^^^^^^^ + +The Dagster type system allows authors of solids and pipelines to optionally and gradually define +the types of the data that flows between solids, and so to introduce compile-time and runtime checks +into their pipelines. + +Types also allow for custom materialization, and are typically defined using the +:func:`@dagster_type ` decorator or the +:func:`as_dagster_type ` API. It is also possible to inherit from +:class:`RuntimeType ` directly. + +Environment Config +^^^^^^^^^^^^^^^^^^ + +Environment config defines the external environment with which a pipeline will interact for a given +execution plan. Environment config can be used to change solid behavior, define pipeline- or +solid-scoped resources and data that will be available during execution, or even shim solid inputs. + +Environment config is complementary to data (solid inputs and outputs) -- think of inputs and +outputs as specifying `what` data a pipeline operates on, and config as specifying `how` it +operates. + +Concretely, imagine a pipeline of solids operating on a data warehouse. The solids might emit and +consume table partition IDs and aggregate statistics as inputs and outputs -- the data on which they +operate. Environment config might specify how to connect to the warehouse (so that the pipeline +could also operate against a local test database), how to log the results of intermediate +computations, or where to put artifacts like plots and summary tables. + +Configuration Schemas +^^^^^^^^^^^^^^^^^^^^^ + +Configuration schemas define how users can config pipelines (using either Python dicts, YAML, +or JSON). They tell the Dagster engine how to type check environment config provided in one of +these formats against the pipeline context and enable many errors to be caught with rich messaging +at compile time. + +Config fields are defined using the :class:`Field ` class. + +DAG +^^^ + +DAG is short for `directed acyclic graph`. In this context, we are concerned with graphs where the +nodes are computations and the edges are dependencies between those computations. The dependencies +are `directed` because the outputs of one computation are the inputs to another. +These graphs are `acyclic` because there are no circular dependencies -- in other words, the graph +has a clear beginning and end, and we can always figure out what order to execute its nodes in. + +Execution Plan +^^^^^^^^^^^^^^ +An execution plan is a concrete plan for executing a DAG of execution steps created by compiling a +pipeline and a config. The execution plan is aware of the topological ordering of the execution +steps, enabling physical execution on one of the available executor engines (e.g., in-process, +multiprocess, using Airflow). + +Users do not directly instantiate or manipulate execution plans. + +Execution Step +^^^^^^^^^^^^^^ + +Execution steps are concrete computations, one or more of which corresponds to a solid in a pipeline +that has been compiled with a config. Some execution steps are generated in order to compute the +core transform functions of solids, but execution steps may also be generated in order to +materialize outputs, check expectations against outputs, etc. + +Users do not directly instantiate or manipulate execution steps. + +Dagster Event +^^^^^^^^^^^^^ + +When a pipeline is executed, a stream of events communicate the progress of its execution. This +includes top level events when the pipeline starts and completes, when execution steps succeed, +fail, or are skipped due to upstream failures, and when outputs are generated and materialized. + +Users do not directly instantiate or manipulate Dagster events, but they are consumed by the GraphQL +interface that supports the Dagit tool. + +InputDefinition +^^^^^^^^^^^^^^^ + +Optionally typed definition of the data that a solid requires in order to execute. Defined inputs +may often also be shimmed through config. Inputs are defined using the +:class:`InputDefinition ` class, usually when defining a solid. + +OutputDefinition +^^^^^^^^^^^^^^^^ + +Optionally typed definition of the result that a solid will produce. Outputs are defined using the +:class:`OutputDefinition ` class, usually when defining a solid. diff --git a/python_modules/dagster/docs/sections/reference/repository.png b/python_modules/dagster/docs/sections/reference/repository.png new file mode 100644 index 0000000000000000000000000000000000000000..5cccc66918322a75e6e66f5577ce8c8e78c1d958 GIT binary patch literal 141970 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 Tha6VV7=Xaj)z4*}Q$iB}?<879 literal 0 HcmV?d00001 diff --git a/python_modules/dagster/docs/sections/reference/resource.png b/python_modules/dagster/docs/sections/reference/resource.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5f3411e6b67ba6bff60de7f56f7572b9c95a68 GIT binary patch literal 104840 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⁢(S<|Ut4;#^mr3~6nW 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%0D2WJ<_=la6b{fwR7W?b7B5a;Jg6Oi^`+Jd&f7s?f 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 literal 0 HcmV?d00001 diff --git a/python_modules/dagster/docs/sections/reference/solid.png b/python_modules/dagster/docs/sections/reference/solid.png new file mode 100644 index 0000000000000000000000000000000000000000..6d5fba0436834cd80da307f64e3beb54a6fec5b3 GIT binary patch literal 19298 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 E5Bn>=A^-pY literal 0 HcmV?d00001 diff --git a/python_modules/dagster/docs/sections/reference/transform_fn.png b/python_modules/dagster/docs/sections/reference/transform_fn.png new file mode 100644 index 0000000000000000000000000000000000000000..f978034959ab9c8477dc17a3883ddfce01cefa29 GIT binary patch literal 38601 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 literal 0 HcmV?d00001 diff --git a/python_modules/dagster/docs/snapshots/snap_test_doc_build.py b/python_modules/dagster/docs/snapshots/snap_test_doc_build.py index 55dd4cf356d90..065d5c756029f 100644 --- a/python_modules/dagster/docs/snapshots/snap_test_doc_build.py +++ b/python_modules/dagster/docs/snapshots/snap_test_doc_build.py @@ -40,7 +40,8 @@ 'api', 'community', 'install', - 'learn' + 'learn', + 'reference' ], [ ] @@ -135,6 +136,18 @@ [ ] ), + ( + [ + '.', + 'doctrees', + 'sections', + 'reference' + ], + [ + ], + [ + ] + ), ( [ '.', @@ -203,7 +216,8 @@ 'api', 'community', 'install', - 'learn' + 'learn', + 'reference' ], [ ] @@ -303,6 +317,20 @@ 'unittesting.rst.txt' ] ), + ( + [ + '.', + 'html', + '_sources', + 'sections', + 'reference' + ], + [ + ], + [ + 'reference.rst.txt' + ] + ), ( [ '.', @@ -350,7 +378,8 @@ 'api', 'community', 'install', - 'learn' + 'learn', + 'reference' ], [ ] @@ -477,5 +506,28123 @@ 'types.html', 'unittesting.html' ] + ), + ( + [ + '.', + 'html', + 'sections', + 'reference' + ], + [ + ], + [ + 'reference.html' + ] ) ] + +snapshots['test_build_all_docs 2'] = '''# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 079eac8fa5c70ec98266e33bdc3db323 +tags: 645f666f9bcd5a90fca523b33c5a78b7 +''' + +snapshots['test_build_all_docs 3'] = ''' + + + + + + + Index — Dagster + + + + + + + + + + + + + + + + + + + +

+
+
+ + + + + +
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | R + | S + | T + | V + +
+

A

+ + + +
+ +

B

+ + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

V

+ + +
+ + + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 4'] = ''' + + + + + + Home — Dagster + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ +
+
+
+

Why Dagster?

+ Dagster is a system for building modern data applications. Combining + an elegant programming model and beautiful tools, Dagster allows + infrastructure engineers, data engineers, and data scientists to + seamlessly collaborate to process and produce the trusted, reliable + data needed in today's world. +
+ + 🛠  Get Started » + +
+
+

Elegant Programming Model

+
+ Dagster is a set of abstractions for building self-describing, + testable, and reliable data applications. It embraces the + principles of functional data programming; gradual, optional + typing; and testability as a first-class value. +
+
+ +
+

Beautiful Tools

+
+ Dagster's development environment, dagit -- designed for data + engineers, machine learning engineers, data scientists -- enables + astoundingly productive local development. +
+
+ +
+

Flexible and Incremental

+
+ Dagster integrates with your existing tools and infrastructure. + Dagster can invoke any computation -- whether it be Spark, a + Python, a Jupyter notebook, or SQL -- and is designed to deploy to + any workflow engine, such as Airflow. +
+
+
+
+ + + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 5'] = ''' + + + + + + Python Module Index — Dagster + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ + +

Python Module Index

+ +
+ d +
+ + + + + + + +
 
+ d
+ dagster +
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 6'] = ''' + + + + + + Search — Dagster + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +

Search

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+

+ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

+
+ + + +
+ +
+ +
+ +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 7'] = ''' + + + + + + Overview: module code — Dagster + + + + + + + + + + + + + + + + + + + + + + + + + + +''' + +snapshots['test_build_all_docs 8'] = '''.. title:: Home + +.. toctree:: + :maxdepth: 2 + :name: Documentation + + Install + Learn + API Docs + Reference + + Community + +.. TODO: Write this section Deploying +''' + +snapshots['test_build_all_docs 9'] = '''Code of Conduct +======================= + +Our Pledge +------------- + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +Our Standards +------------- + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +Our Responsibilities +-------------------- + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +Scope +----- + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +Enforcement +----------- + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team on Slack. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +Attribution +----------- +This Code of Conduct is adapted from the Contributor Covenant, version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq +''' + +snapshots['test_build_all_docs 10'] = '''Community +======================= + +Here, we've including instructions for how to contribute to the Dagster project. We welcome both +code contributions and issue reports. + +.. toctree:: + :maxdepth: 1 + + code_of_conduct + contributing + release_notes + Github + StackOverflow +''' + +snapshots['test_build_all_docs 11'] = '''Contributing +============ + +If you are planning to contribute to dagster, you will need to set up a local +development environment. + +Local development setup +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Install Python. Python 3.6 or above recommended. + + Note: If you use Python 3.7 dagster-airflow will not install and run properly + as airflow is not Python 3.7 compatible. Until [AIRFLOW-2876](https://github.com/apache/airflow/pull/3723) + is resolved (expected in 1.10.3), Airflow (and, as a consequence, dagster-airflow) + is incompatible with Python 3.7. + + The rest of the modules will work properly so you can ignore this error and develop the rest + of the modules. + +2. Create and activate a virtualenv. + +.. code-block:: console + + $ python3 -m venv dagsterenv + $ source dagsterenv/bin/activate + +3. Install yarn. If you are on macOS, this should be: + +.. code-block:: console + + $ brew install yarn + +4. Run the script dev_env_setup.sh at repo root. This sets up a full +dagster developer environment with all modules and runs tests that +do not require heavy external dependencies such as docker. This will +take a few minutes. + + $ ./dev_env_setup.sh + +5. Run some tests manually to make sure things are working. + + $ pytest python_modules/dagster/dagster_tests + +Have fun coding! + +6. Set up pre-commit hooks + +We use black to enforce a consistent code style. To set up a pre-commit hook, just run: + +.. code-block:: console + + $ pre-commit install + +(The `pre-commit` package is installed in dagster's dev-requirements.) + +Running dagit webapp in development +------------------------------------- +For development, run the dagit GraphQL server on a different port than the +webapp, from any directory that contains a repository.yml file. For example: + +.. code-block:: console + + $ cd dagster/python_modules/dagster/dagster/tutorials/intro_tutorial + $ dagit -p 3333 + +Keep this running. Then, in another terminal, run the local development +(autoreloading, etc.) version of the webapp: + +.. code-block:: console + + $ cd dagster/js_modules/dagit + $ make dev_webapp + +To run JavaScript tests for the dagit frontend, you can run: + +.. code-block:: console + + $ cd dagster/js_modules/dagit + $ yarn test + +In webapp development it's handy to run ``yarn run jest --watch`` to have an +interactive test runner. + +Some webapp tests use snapshots--auto-generated results to which the test +render tree is compared. Those tests are supposed to break when you change +something. + +Check that the change is sensible and run ``yarn run jest -u`` to update the +snapshot to the new result. You can also update snapshots interactively +when you are in ``--watch`` mode. + +Releasing +----------- +Projects are released using the Python script at ``dagster/bin/publish.py``. + +Developing docs +--------------- +Running a live html version of the docs can expedite documentation development. + +.. code-block:: console + + $ cd python_modules/dagster/docs + $ make livehtml + + +''' + +snapshots['test_build_all_docs 12'] = '''Release Notes +============= + +Dagster versions follow the guidelines in `PEP 440 `_. + +To make dependency management easier in the context of a monorepo with many installable projects, +package versions move in lockstep with each other and with git tags. + +As the API is still in flux, we aren't following strict semantic versioning rules at this point, but roughly +intend micro versions to reflect a regular release schedule and minor versions to reflect +milestones in the framework's capability. + +0.4.0 +----- +**API Changes** + +- There is now a new top-level configuration section ``storage`` which controls whether or not + execution should store intermediate values and the history of pipeline runs on the filesystem, + on S3, or in memory. The ``dagster`` CLI now includes options to list and wipe pipeline run + history. Facilities are provided for user-defined types to override the default serialization + used for storage. +- Similarily, there is a new configuration for ``RunConfig`` where the user can specify + intermediate value storage via an API. +- ``OutputDefinition`` now contains an explicit ``is_optional`` parameter and defaults to being + not optional. +- New functionality in ``dagster.check``: ``is_list`` +- New functionality in ``dagster.seven``: py23-compatible ``FileNotFoundError``, ``json.dump``, + ``json.dumps``. +- Dagster default logging is now multiline for readability. +- The ``Nothing`` type now allows dependencies to be constructed between solids that do not have + data dependencies. +- Many error messages have been improved. +- ``throw_on_user_error`` has been renamed to ``raise_on_error`` in all APIs, public and private + +**GraphQL** + +- The GraphQL layer has been extracted out of Dagit into a separate dagster-graphql package. +- ``startSubplanExecution`` has been replaced by ``executePlan``. +- ``startPipelineExecution`` now supports reexecution of pipeline subsets. + +**Dagit** + +- It is now possible to reexecute subsets of a pipeline run from Dagit. +- Dagit's `Execute` tab now opens runs in separate browser tabs and a new `Runs` tab allows you to + browse and view historical runs. +- Dagit no longer scaffolds configuration when creating new `Execute` tabs. This functionality will + be refined and revisited in the future. +- Dagit's `Explore` tab is more performant on large DAGs. +- The ``dagit -q`` command line flag has been deprecated in favor of a separate command-line + ``dagster-graphql`` utility. +- The execute button is now greyed out when Dagit is offline. +- The Dagit UI now includes more contextual cues to make the solid in focus and its connections + more salient. +- Dagit no longer offers to open materializations on your machine. Clicking an on-disk + materialization now copies the path to your clipboard. +- Pressing Ctrl-Enter now starts execution in Dagit's Execute tab. +- Dagit properly shows List and Nullable types in the DAG view. + +**Dagster-Airflow** + +- Dagster-Airflow includes functions to dynamically generate containerized (``DockerOperator``-based) + and uncontainerized (``PythonOperator``-based) Airflow DAGs from Dagster pipelines and config. + +**Libraries** + +- Dagster integration code with AWS, Great Expectations, Pandas, Pyspark, Snowflake, and Spark + has been reorganized into a new top-level libraries directory. These modules are now + importable as ``dagster_aws``, ``dagster_ge``, ``dagster_pandas``, ``dagster_pyspark``, + ``dagster_snowflake``, and ``dagster_spark``. +- Removed dagster-sqlalchemy and dagma + +**Examples** + +- Added the event-pipeline-demo, a realistic web event data pipeline using Spark and Scala. +- Added the Pyspark pagerank example, which demonstrates how to incrementally introduce dagster + into existing data processing workflows. + +**Documentation** + +- Docs have been expanded, reorganized, and reformatted. + +0.3.5 +----- +**Dagit** + +- Dagit now defaults to ``--watch``; run ``dagit --no-watch`` to disable (process-based) + autoreloading. + +0.3.4 +----- + +**API Changes** + +- ``ExecutionMetadata`` has been renamed to ``RunConfig`` +- ``throw_on_user_error`` is no longer a top level argument to ``execute_pipeline``, but + instead is part of the ``InProcessExecutorConfig`` +- We no longer include values of configs in config parsing error exception to prevent + accidental logging of sensitive information that might be in config files. + +**Dagit** + +- Show total execution time at the bottom of the execution pane +- Remove extra scrollbars in Windows and Mac with external mouse +- New dynamics for multiple runs in dagit; run history; better tabbing behavior. + +**Dagstermill** + +- Repo registration is now optional; "Hello, World" examples are now boilerplate free. + +0.3.3 +----- + +**API Changes** + +- Removed ``step``, ``environment_config``, ``event_callback``, ``has_event_callback``, + ``persistence_strategy``, ``events``, and ``execution_metadata properties`` from user-facing + context objects. +- Removed ``solid_subset`` parameter to ``execute_pipeline``. +- ``check.inst`` and associated methods take type tuples. + +**GraphQL** + +- ``StartSubplanExecutionInvalidStepsError`` and ``InvalidSubplanExecutionError`` replaced + with more exact ``StartSubplanExecutionInvalidStepError`` and + ``InvalidSubplanMissingInputError`` + +**Dagit** + +- Dagit can launch Jupyter to explore and execute Dagstermill output notebooks. + + +**Bugfixes** + +- #849: Dagit watches fewer files and runs faster. +- #856: Execution steps are displayed in order in Dagit. +- #863, #865: Dagstermill errors are reported. +- #873: Dagit provides visual feedback as soon as pipelines are executed. +- #871: Pipeline validation errors appear in Dagit. +- #872: Dagit logs stream reliably. + + +0.3.2 +----- + +**API Changes** + +- The ``info`` object passed to transform and expectation functions has been renamed to ``context``. + All fields that were previously available on the ``info.context`` object are now hoisted to the + top level ``context`` object. Additionally an alias for ``config`` has been introduced: + ``solid_config``. So where you would have written ``info.config`` it is now + ``context.solid_config`` Logging should be done with the top-level property ``context.log``. + The ``context`` and ``config`` properies on this new context object are deprecated, will warn + for now, and be eliminated when 0.4.0 is released. +- The ``info`` object passed context and resource creation functions is now named ``init_context`` + by convention. +- PipelineExecutionResult's (returned from execute_pipeline) ``result_list`` property has been + renamed to ``solid_result_list`` +- execute_pipeline_iterator now returns an iterable of ``ExecutionStepEvent`` instead of + ``SolidExecutionResult`` +- Breaking: All arguments named ``environment`` to ``execute_pipeline`` and its variants has + been renamed to ``environment_dict``. +- Breaking: Types of objects flowed as the first argument to context, resource, transform, and + expectation functions have been renamed. If you do instanceof checks on these objects, they will + fail. Property-level compatibility has not changed and should not require code changes. + +**GraphQL** + +- ``StepResult`` has been renamed to ``StepEvent``. +- ``stepResults`` property on ``startSubplanExecution`` has been renamed to ``stepEvents``. +- ``StepSuccessResult`` is now ``SuccessfulStepOutputEvent`` +- ``StepFailureResult`` is now ``StepFailureEvent`` +- Added ``UNMARSHAL_INPUT`` and ``MARSHAL_OUTPUT`` values to the ``StepKind`` enumeration. + Marshalling steps are now implemented as execution steps themselves. + +**Dagit** + +- Link to output notebook rendered in dagit when dagstermill solids are executed. + +**Dagstermill** + +- Dagstermill solids now required reduced scaffolding. + +**Bugfixes** + +- #792: ``execute_pipeline_iterator`` now properly streams results at step-event granularity. +- #820: Unbreak config scaffolding within dagit. + + + +0.3.1 +----- + +**API Changes** + +- New decorator-based ``@resource`` API as a more concise alternative to ``ResourceDefinition`` +- Dagster config type system now supports enum types. (``dagster.Enum`` and ``dagster.EnumType``) +- New top level properties ``resources`` and ``log`` on ``info``. +- The context stack in ``RuntimeExecutionContext`` is no longer modifiable by the user during a + transform. It has been renamed to ``tags``. +- ``ReentrantInfo`` has been renamed to ``ExecutionMetadata`` + +**GraphQL** + +- GraphQL queries and mutations taking a pipeline name now take both a pipeline name and an optional + solid subset and have slightly improved call signatures. +- The config and runtime type system split is now reflected in the GraphQL frontend. This was the + infrastructure piece that allowed the fix to #598. ``runtimeTypeOrError`` and + ``configTypeOrError`` are now top level fields, and there are ``configTypes`` and + ``runtimeTypes`` fields on ``Pipeline``. Top-level field type and types property on ``Pipeline`` + has been eliminated. +- ``StepTag has been renamed to ``StepKind`` +- Added s``tartSubplanExecution`` to enable pipeline execution at step subset granularity +- Deprecated ``ExecutionStep.name`` in favor of ``ExecutionStep.key`` +- Added ``isBuiltin`` to ``RuntimeType`` + +**Dagit** + +- `Execute` tab now supports partial pipeline execution via a solid selector in the bottom left. +- Dagit execute button is redesigned, indicates running state, and is unpressable when the + dagit process is dead. +- The config editor now offers autocompletion for enum values. + +**Dagstermill** + +- Dagstermill has a dramatically improved parameter passing experience and scaffolding and is ready + for broader consumption. + +**Bugfixes** + +- #598: Correctly display input and output schemas for types in dagit +- #670: Internal system error "dagster.check.CheckError: Invariant failed. Description: Should not + be in context" raised when user throwing error during transform. Now the appropriate user error + should be raised. +- #672: Dagit sometimes hangs (TypeError: unsupported operand type(s) for -: 'float' and + 'NoneType' in console log) +- #575: Improve error messaging by masking anonymous type names +''' + +snapshots['test_build_all_docs 13'] = '''Install +======================= + +Quick Start +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +To install dagster and dagit, run: + +.. code-block:: console + + $ pip install dagster dagit + +This will install the latest stable version of dagster's packages in your current Python +environment. + + +Detailed Installation Guide +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Dagster is tested on Python 3.7.3, 3.6.8, 3.5.7, and 2.7.16. Python 3 is strongly +encouraged -- if you can, you won't regret making the switch! + +To check that Python and the pip package manager are already installed, you can run: + +.. code-block:: console + + $ python --version + $ pip --version + +If you're running Python 3.3 or later, you already have the venv package for managing +virtualenvs. On Python 2.7, you can check whether you have the virtualenv tool installed by +running: + +.. code-block:: console + + $ virtualenv --version + +If these tools aren't present on your system, you can install them as follows: + +Ubuntu +*********** + +.. code-block:: console + + $ sudo apt update + $ sudo apt install python3-dev python3-pip + +macOS +*********** +Using `Homebrew `_: + +.. code-block:: console + + $ brew update + $ brew install python # Python 3 + +On Python 2.7, you can install virtualenv with: + +.. code-block:: console + + $ sudo pip install -U virtualenv # system-wide install + +Windows (Python 3) +****************** +- Install the *Microsoft Visual C++ 2015 Redistributable Update 3*. This comes with *Visual Studio 2015* but can be installed separately as follows: + + 1. Go to the Visual Studio downloads, + 2. Select *Redistributables and Build Tools*, + 3. Download and install the *Microsoft Visual C++ 2015 Redistributable Update 3*. + +- Install the 64-bit Python 3 release for Windows (select ``pip`` as an optional feature). + +To use the ``dagit`` tool, you will also need to +`install yarn `_. + + +Notes on Python virtualenvs +*************************** +We strongly recommend installing dagster inside a Python virtualenv. If you are +running Anaconda, you should install dagster inside a Conda environment. + +To create a virtual environment on Python 3, you can just run: + +.. code-block:: console + + $ python3 -m venv ~/.venvs/dagster + +This will create a new Python environment whose interpreter and libraries +are isolated from those installed in other virtual environments, and +(by default) any libraries installed in a “system” Python installed as part +of your operating system. + +On Python 2, you can use a tool like +`virtualenvwrapper `_ +to manage your virtual environments, or just run: + +.. code-block:: console + + $ virtualenv ~/.venvs/dagster + +You'll then need to 'activate' the virtualenvironment, in bash by +running: + +.. code-block:: console + + $ source ~/.venvs/dagster/bin/activate + +(For other shells, see the +`venv documentation `_.) + +If you are using Anaconda, you can run: + +.. code-block:: console + + $ conda create --name dagster + +And then, on macOS or Ubuntu: + +.. code-block:: console + + $ source activate dagster + +Or, on Windows: + +.. code-block:: console + + $ activate dagster + +''' + +snapshots['test_build_all_docs 14'] = '''Learn +======================= + +.. toctree:: + :maxdepth: 1 + + tutorial/index + principles + +Other Guides +***************** +.. toctree:: + :maxdepth: 1 + + guides/028_to_030_new_concepts + guides/028_to_030_upgrade_guide +''' + +snapshots['test_build_all_docs 15'] = '''Principles +------------------------- +Dagster is opinionated about how data pipelines should be built and structured. What do we think +is important? + +Functional +^^^^^^^^^^ +Data pipelines should be expressed as DAGs (directed acyclic graphs) of functional, idempotent +computations. Individual nodes in the graph consume their inputs, perform some computation, and +yield outputs, either with no side effects or with clearly advertised side effects. Given the +same inputs and configuration, the computation should always produce the same output. If these +computations have external dependencies, these should be parametrizable, so that the computations +may execute in different environments. + + * See Maxime Beauchemin's Medium article on `Functional Data Engineering `_ + for an excellent overview of functional programing in batch computations. + +Self-describing +^^^^^^^^^^^^^^^ +Data pipelines should be self-describing, with rich metadata and types. Users should be able to +approach an unfamiliar pipeline and use tooling to inspect it and discover its structure, +capabilities, and requirements. Pipeline metadata should be co-located with the pipeline's actual +code: documentation and code should be delivered as a single artifact. + +Compute-agnostic +^^^^^^^^^^^^^^^^ +Heterogeneity in data pipelines is the norm, rather than the exception. Data pipelines are written +collaboratively by many people in different personas -- data engineers, machine-learning engineers, +data scientists, analysts and so on -- who have different needs and tools, and are particular about +those tools. + +Dagster has opinions about best practices for structuring data pipelines. It has no opinions +about what libraries and engines should do actual compute. Dagster pipelines can be made up of +any Python computations, whether they use Pandas, Spark, or call out to SQL or any other DSL or +library deemed appropriate to the task. + +Testable +^^^^^^^^ +Testing data pipelines is notoriously difficult. Because testing is so difficult, it is often never +done, or done poorly. Dagster pipelines are designed to be tested. Dagster provides explicit support +for pipeline authors to manage and maintain multiple execution environments -- for example, unit +testing, integration testing, and production environments. Dagster can also execute arbitrary +subsets and nodes of pipelines, which is critical for testability (and useful in operational +contexts as well). + +Verifiable data quality +^^^^^^^^^^^^^^^^^^^^^^^ +Testing code is important in data pipelines, but it is not sufficient. Data quality tests -- run +during every meaningful stage of computation in production -- are critical to reduce the +maintenance burden of data pipelines. Pipeline authors generally do not have control over their +input data, and make many implicit assumptions about that data. Data formats can also change +over time. In order to control this entropy, Dagster encourages users to computationally verify +assumptions (known as expectations) about the data as part of the pipeline process. This way, when +those assumptions break, the breakage can be reported quickly, easily, and with rich metadata +and diagnostic information. These expectations can also serve as contracts between teams. + + * See `Down with Pipeline Debt! `_ for a primer on pipeline tests for + data quality. + +Gradual, optional typing +^^^^^^^^^^^^^^^^^^^^^^^^ +Dagster contains a type system to describe the values flowing through the pipeline and the +configuration of the pipeline. As pipelines mature, gradual typing lets nodes in a pipeline +know if they are properly arranged and configured prior to execution, and provides rich +documentation and runtime error checking. +''' + +snapshots['test_build_all_docs 16'] = """# New Concepts in 0.3.0 + +The upgrade guide describes the changes you are _require_ to make to install 0.3.0. This guide +describes the changes you _should_ make in order to use the latest capabilities. The new concepts +take some getting used to, but are quite powerful. + +## Resources + +In 0.2.0 the notion of resources were relatively informal. This is no longer true: They are now an +officially supported abstraction. They break apart context creation into composable, reusable +chunks of software. + +### Defining a Resource + +Let's take a typical unittest context. + +Before: + +```py +def define_unittest_context(): + return PipelineContextDefinition( + config_field=Field( + Dict( + { + 'data_source_run_id' : _data_source_run_id_field(), + 'conf' : _conf_field(), + 'log_level' : _log_level_field(), + 'cleanup_files' : _cleanup_field(), + }, + ) + ), + context_fn=create_fileload_unittest_context, + description=''' +Context for use in unit tests. It does not allow for any interaction with aws +or s3, and can only be used for a subset of the pipeline that can execute on a +local machine. + +This context does not log to file and also has a configurable log_level. + ''' + ) + +def create_fileload_unittest_context(info): + data_source_run_id = info.config['data_source_run_id'] + log_level = level_from_string(info.config['log_level']) + pipeline_run_id = str(uuid.uuid4()) + + resources = FileloadResources( + aws=None, + redshift=None, + bucket_path=None, + local_fs=LocalFsHandleResource.for_pipeline_run(pipeline_run_id), + sa=None, + pipeline_guid=data_source_run_id) + + yield ExecutionContext( + loggers=[define_colored_console_logger('dagster', log_level)], + resources=resources, + tags={ + 'data_source_run_id': data_source_run_id, + 'data_source': 'new_data', + 'pipeline_run_id': pipeline_run_id, + }, + ) +``` + +That's quite the ball of wax for what should be relatively straightforward. And this doesn't even +include the boilerplate `FileloadResources` class as well. We're going to break this apart using +the `ResourceDefinition` abstraction and eliminate the need for that class. + +The only real reusable resource here is the LocalFsHandleResource, so let's break that out into +itss own `ResourceDefinition`. + +```py +def define_local_fs_resource(): + def _create_resource(init_context): + resource = LocalFsHandleResource.for_pipeline_run(init_context.run_id) + yield resource + if init_context.resource_config['cleanup_files']: + LocalFsHandleResource.clean_up_dir(init_context.run_id) + + return ResourceDefinition( + resource_fn=_create_resource, + config_field=Field( + Dict({'cleanup_files': Field(Bool, is_optional=True, default_value=True)}) + ), + ) +``` + +This is now a self-contained piece that can be reused in other contexts as well. + +Aside: We now guarantee a system-generated run_id, so the manually created pipeline_guid resource +is no longer relevant. + +The rest of the "resources" in the unittesting context are None, and we have a special helper to +create "none" resources. + +Let's put it all together: + +```py +def define_unittest_context(): + return PipelineContextDefinition( + config_field=Field(Dict({ + 'log_level' : _log_level_field(), + 'data_source_run_id': _data_source_run_id_field(), + })), + resources={ + 'local_fs': define_local_fs_resource(), + 'aws': ResourceDefinition.none_resource(), + 'redshift': ResourceDefinition.none_resource(), + 'bucket_path': ResourceDefinition.none_resource(), + 'sa': ResourceDefinition.none_resource(), + }, + context_fn=create_fileload_unittest_context, + description=''' +Context for use in unit tests. It does not allow for any interaction with aws +or s3, and can only be used for a subset of the pipeline that can execute on a +local machine. + +This context does not log to file and also has a configurable log_level. + ''' + ) + +def create_fileload_unittest_context(init_context): + data_source_run_id = init_context.context_config['data_source_run_id'] + log_level = level_from_string(init_context.context_config['log_level']) + + yield ExecutionContext( + loggers=[define_colored_console_logger('dagster', log_level)], + tags={ + 'data_source_run_id': data_source_run_id, + 'data_source': 'new_data', + }, + ) +``` + +Notice a few things. The bulk of the context creation function is now gone. Instead of having to +manually create the `FileloadResources`, that is replaced by a class (a `namedtuple`) that is +system-synthesized. Predictably it has N fields, one for each resource. The pipeline-code-facing +API is the same, it just requires less boilerplate within the pipeline infrastructure. + +### Configuring a Resource + +The configuration schema changes, as each resource has itss own section. + +Before: + +```py +environment = { + 'context':{ + 'unittest' : { + 'config' : { + 'data_source_run_id': str(uuid.uuid4()), + 'conf': CONF, + 'log_level': 'ERROR', + 'cleanup_files': False, + } + } + }, + 'solids': { + 'unzip_file': { + 'config' : { + 'zipped_file': ZIP_FILE_PATH, + } + } + } +} +``` + +In particular we need to move `cleanup_files` to a resource section of the config. + +```py +environment = { + 'context':{ + 'unittest' : { + 'config' : { + 'data_source_run_id': str(uuid.uuid4()), + 'log_level': 'ERROR', + }, + 'resources' : { + 'local_fs': { + 'config' : { + 'cleanup_files': False, + } + } + } + } + }, + 'solids': { + 'unzip_file': { + 'config' : { + 'zipped_file': ZIP_FILE_PATH, + } + } + } +} +``` + +While slightly more verbose, you will be able to count on more consistent of configuration +between pipelines as you reuse resources, and you an even potentially share resource configuration +_between_ pipelines using the configuration file merging feature of 0.3.0 + +## Resource Libraries + +The real promise of resources to build a library of resuable, composable resources. + +For example, here would be a resource to create a redshift connection. + +```py +def define_redshift_sa_resource(): + def _create_resource(init_context): + user = init_context.resource_config['user'] + password = init_context.resource_config['password'] + host = init_context.resource_config['host'] + port = init_context.resource_config['port'] + dbname = init_context.resource_config['dbname'] + return sa.create_engine(f'postgresql://{user}:{password}@{host}:{port}/{dbname}') + + return ResourceDefinition( + resource_fn=_create_resource, + config_field=Field( + Dict( + { + 'user' : Field(String), + 'password' : Field(String), + 'host' : Field(String), + 'port' : Field(Int), + 'dbname' : Field(String), + } + ) + ) + ) +``` + +This could be used -- unmodified -- across all your pipelines. This will also make it easier to +write reusable solids as they can know that they will be using the same resource. Indeed, we may +formalize this in subsequent releases, allowing solids to formally declare their dependencies on +specific resource types. + +## Solid-Level Configs to Inputs + +With the new ability to source inputs from the environment config files, we anticipate that +solid-level configuration will become much less common, and instead that we will uses inputs +and outputs exclusively. + +Let's use another example from the a typical fileload pipeline. + +Before: + +```py +@solid( + name='unzip_file', + inputs=[], + outputs=[OutputDefinition(dagster_type=DagsterTypes.PathToFile)], + description=''' +This takes a single, pre-existing zip folder with a single file and unzips it, +and then outputs the path to that file. +''', + config_def=ConfigDefinition( + types.ConfigDictionary('UnzipFileConfig', {'zipped_file' : Field(types.Path)}), + ), +) +def unzip_file(info): + context = info.context + zipped_file = info.config['zipped_file'] +``` + +You'll note that in 0.2.8 we have to model the incoming zipped file as config rather than an +input because `unzip_file` had no upstream dependencies and inputs +had to come from previous solids. In 0.3.0 this is no longer true. Inputs +can be sourced from the config file now, which means that by default you should +be modeling such things as inputs. + +After: + +```py +@solid( + name='unzip_file', + inputs=[InputDefinition('zipped_file', Path)], + outputs=[OutputDefinition(Path)], + description=''' +This takes a single, pre-existing zip folder with a single file and unzips it, +and then outputs the path to that file. +''', +) +def unzip_file(context, zipped_file): + # ... + pass +``` + +In order to invoke a pipeline that contains this solid, you need to satisy this input in the +environment config. + +Before: + +```py + environment = { + # .. context section omitted + 'solids': { + 'unzip_file': { + 'config' : { + 'zipped_file': ZIP_FILE_PATH, + } + } + } + } +``` + +After: + +```py + environment = { + # .. context section omitted + 'solids': { + 'unzip_file': { + 'inputs' : { + 'zipped_file': ZIP_FILE_PATH, + } + } + } + } +``` + +What's great about this new input structure is that now the unzip_file is more reusable as it could +be reused in the middle of a pipeline with its input coming from a previous solid, or as a solid +at the beginning of a pipeline. +""" + +snapshots['test_build_all_docs 17'] = """# Upgrading to 0.3.0 + +This guide is a step-by-step guide for upgrading from dagster 0.2.x to 0.3.0. This represents a +substantial upgrade in capabilities but also some breaking API changes. We'll detail them, provide +context and reasoning, and instructions about how to upgrade. + +## Required API Changes + +### 1. No more top level config subpackage. + +**Error:** + +``` +from dagster import ( +ImportError: cannot import name 'config' +``` + +We have eliminated the public-facing "config" namespace. (You use raw dictionaries instead of a +parallel, typed API to configure pipeline runs). + +**Fix:** Simply eliminate the include. You'll run into related errors later. + +### 2. No more dagster.sqlalchemy and dagster.pandas submodules. + +**Error:** + +``` +E ModuleNotFoundError: No module named 'dagster.sqlalchemy' +``` + +We have moved pandas and sqlalchemy code into their own separate modules (dagster-pandas and +dagster-sqlalchemy). This makes the core dagster library have less dependencies. + +**Fix:** Instead of importing `dagster.sqlalchemy` you need to `pip install dagster-sqlalchemy`, +add it to your virtual env, and then include `dagster_sqlalchemy` instead. + +### 3. ConfigDefinition no longer exists. + +**Error:** + +``` +ImportError: cannot import name 'ConfigDefinition' +``` + +We have eliminated a separate notion of a ConfigDefinition. Instead, we realized the user provided +config in a solid, resource, or context is just a `Field` that you would use to build a `Dict` or +`Selector`. So replace `ConfigDefinition` with Field. (Generally `config_def=ConfigDefinition` is +now `config_field=Field`) + +**Before:** + +```py +"production": PipelineContextDefinition( + context_fn=generate_production_execution_context, + config_def=ConfigDefinition( + # ... + ) +``` + +**After:** + +```py +"production": PipelineContextDefinition( + context_fn=generate_production_execution_context, + config_field=Field( + # ... + ) + +``` + +### 4. New, Simpler Dagster Type Definition API. + +**Error:** + +``` + description='''This represents a path to a file on disk''' +E TypeError: __init__() got multiple values for argument 'python_type' +``` + +**Another Error:** + +``` +E dagster.check.ParameterCheckError: Param "klass" was supposed to be a type. Got instead of type +``` + +There are now two different type creation APIs. One for _creating_ new types, and one for _annotating_ existing types that you include. + +**Examples:** + +```py +@dagster_type(description='This represents a path to a file on disk') +class PathToFile(str): + pass + +S3FileHandle = as_dagster_type( + namedtuple('S3FileHandle', 'bucket path'), + description=''' +upload_header_to_s3 and upload_service_line_to_s3 both result in files +being uploaded to s3. Hence the "output" of those two solids is a handle +to a file. The following stages take those as their inputs to create +redshift tables out of them. + +Properties: + - bucket: String + - path: String + ''' +) +``` + +Note you can use S3FileHandle and PathToFile as if they were just "normal types" as well. + +### 5. ConfigDictionary --> NamedDict or Dict + +We have a much less verbose API for building configuration schema: + +**Error:** + +``` +E AttributeError: module 'dagster.core.types' has no attribute 'ConfigDictionary +``` + +First, we are discouraging the use of the `types` namespace. Instead just +`from dagster import Dict` (or whatever class directly). +Second, `ConfigDictionary` is now just `NamedDict`. If the name of the type wasn't +particularily relevant you can also eliminate that and just use `Dict`. +Third, you do not have to name it. The net result is much nicer: + +**Before:** + +```py +types.ConfigDictionary( + 'DefaultContextConfig', + { + 'data_source_run_id' : Field(types.String, description=''' + This is a run id generated by the caller of this pipeline. Right + now this is required to tie a single run id to multiple executions + of the same pipeline. + '''), + 'conf' : Field(types.Any), + }, +) +``` + +**After:** + +```py +Dict({ + 'data_source_run_id' : Field(String, description=''' + This is a run id generated by the caller of this pipeline. Right + now this is required to tie a single run id to multiple executions + of the same pipeline. + '''), + 'conf' : Field(Any), +}) +``` + +This is a fairly mechanical transition. + +### 6. define_stub_solid no longer in top-level dagster + +This is now an internal utility function. If you really, really need it: + +`from dagster.core.utility_solids import define_stub_solid` + +### 7. Environments are raw dictionaries rather than config.\\* classes + +Per update 1 config classes no longer are public or used in the execute_pipeline family of APIs. +Use raw dictionaries instead. They should be shaped **exactly** like the yaml files. + +**Before:** + +```py + environment = config.Environment( + context=config.Context( + name='unittest', + config={ + 'data_source_run_id': str(uuid.uuid4()), + 'conf': CONF, + 'log_level': 'ERROR', + 'cleanup_files': False, + } + ), + solids={ + 'unzip_file': config.Solid({ + 'zipped_file': ZIP_FILE_PATH + }), + }, + ) +``` + +**After:** + +```py + environment = { + 'context':{ + 'unittest' : { + 'config' : { + 'data_source_run_id': str(uuid.uuid4()), + 'conf': CONF, + 'log_level': 'ERROR', + 'cleanup_files': False, + } + } + }, + 'solids': { + 'unzip_file': { + 'config' : { + 'zipped_file': ZIP_FILE_PATH, + } + } + } + } +``` + +While providing less guarantees within the python type system, this API results in very high quality +error checking and messaging from the dagster config schema. + +### 8. New testing APIs + +**Error:** + +``` + AttributeError: type object 'PipelineDefinition' has no attribute 'create_sub_pipeline' +``` + +or + +``` +AttributeError: type object 'PipelineDefinition' has no attribute 'create_single_solid_pipeline' +``` + +The creation of "sub" and "single_solid" pipelines was awkward and error-prone. Instead we have +the new functions `execute_solid` and `execute_solids`. You can now execute a single solid with a +single function call. + +**Before:** + +```py + pipeline = PipelineDefinition.create_single_solid_pipeline( + define_fileload_pipeline(), + 'unzip_file', + ) + + result = execute_pipeline(pipeline, environment) + + assert result.success + assert os.path.exists( + result.result_for_solid('unzip_file').transformed_value()) +``` + +**After:** + +```py + solid_result = execute_solid( + define_fileload_pipeline(), + 'unzip_file', + environment=environment + ) + + assert solid_result.success + assert os.path.exists(solid_result.transformed_value()) +``` + +**Before (with stubbed inputs):** + +```py + pipeline = PipelineDefinition.create_single_solid_pipeline( + define_fileload_pipeline(), + 'split_headers_and_service_lines', + { + 'split_headers_and_service_lines': { + 'unzipped_file': + define_stub_solid('unzipped_path_value', unzipped_path) + } + }, + ) + + result = execute_pipeline(pipeline, environment) + + assert result.success + solid_result = result.result_for_solid('split_headers_and_service_lines') + assert os.path.exists(solid_result.transformed_value('header_file')) + assert os.path.exists(solid_result.transformed_value('service_lines_file')) +``` + +**After (with stubbed inputs):** + +```py + solid_result = execute_solid( + define_fileload_pipeline(), + 'split_headers_and_service_lines', + inputs={ + 'unzipped_file': unzipped_path, + }, + environment=environment, + ) + + assert os.path.exists(solid_result.transformed_value('header_file')) + assert os.path.exists(solid_result.transformed_value('service_lines_file')) +``` + +**Before (subset execution):** + +```py + pipeline = PipelineDefinition.create_sub_pipeline( + define_fileload_pipeline(), + ['unzip_file'], + ['split_headers_and_service_lines'], + {}, + ) + + result = execute_pipeline(pipeline, environment) + + + assert result.success + solid_result = result.result_for_solid('split_headers_and_service_lines') + snapshot_check_results(snapshot, solid_result) +``` + +**After (subset execution):** + +```py + result_dict = execute_solids( + define_pipeline(), + ['unzip_file', 'split_headers_and_service_lines'], + environment=environment, + ) + + snapshot_check_results(snapshot, result_dict['split_headers_and_service_lines']) +``` + +### 9. Execution Context Lifecycle Changes + +**Error:** + +``` +AttributeError: 'ExecutionContext' object has no attribute 'value' +``` + +This is officially the most difficult change, conceptually. We changed the system so that the +`ExecutionContext` passed around to your solids (now `RuntimeExecutionContext`) is constructed +by the system rather than the user. The `ExecutionContext` object the user creates can be thought +of as `RuntimeExecutionContextParams`. We opted against that name because it was excessively +verbose. + +**Before:** + +```py + with context.value('data_source_run_id', data_source_run_id),\\ + context.value('data_source', 'new_data'),\\ + context.value('pipeline_run_id', pipeline_run_id): + + yield ExecutionContext( + loggers=[define_colored_console_logger('dagster', log_level)], + resources=resources + ) +``` + +**After:** + +```py + # because you no longer need the with clause here you can just return + # the ExecutionContext object directly + return ExecutionContext( + loggers=[define_colored_console_logger('dagster', log_level)], + resources=resources, + tags={ + 'data_source_run_id': data_source_run_id, + 'data_source': 'new_data', + 'pipeline_run_id': pipeline_run_id, + }, + ) + +``` + +10. **Non-null by default** + +**Error:** + +``` +E dagster.core.errors.DagsterTypeError: Solid solid_name input input_name received value None which does not pass the typecheck for Dagster type PandasDataFrame. Step solid_name.transform +``` + +You have encountered a type error. Likely it is because in 0.2.8, types could +accept None by default, and this is no longer true in 0.3.0. You have to opt into accepting nulls. + +**Before:** + +```py +@solid(outputs=[OutputDefinition(dagster_type=dagster_pd.DataFrame)]) +def return_none(context): + return None # None no longer allowed, would break at runtime +``` + +**After:** + +```py +@solid(outputs=[OutputDefinition(dagster_type=Nullable(dagster_pd.DataFrame))]) +def return_none(context): + return None # Because of Nullable wrapper, this is ok +``` + +### 11. Solid name uniqueness per-repository enforce by default + +**Error:** + +``` + dagster.core.errors.DagsterInvalidDefinitionError: Trying to add duplicate solid def solid_one in pipeline_two, Already saw in pipeline_one. +``` + +We enforce that solid names are unique per-repository by default. This is to setup +a future where you can look up a solid by name in a repository and view that as an +independent entity, among other things. An example of a feature this enables is the +ability to index back into all the places where that solid is used. + +As a temporary measure, we have added an `enforce_uniqueness` boolean flag to +RepositoryDefinition construction. However, this will not be supported forever as +we will be building features that rely on that property. + +**Fix is:** + +```py + + return RepositoryDefinition( + name='repo_name', + enforce_uniqueness=True, # add this flag + pipeline_dict={...} + ) +``` + +The preferred option is to make solid names unique. Prefixing solids in +offending pipelines with the pipeline name would be a straightforward approach +to solve this quickly. This would also guarantee that a later change would not +trigger this error again. + +### 12. Context is now a top-level argument to solids + +This is not a breaking change, but it will improve developer ergonomics +and is relatively straightforward to do. + +**Before:** + +```py + @solid + def a_solid(info): + info.context.info('something') + info.context.resources.a_resource.do_something() +``` + +**After:** + +```py + @solid + def a_solid(context): + context.log.info('something') # log in the name is more clear + context.resources.a_resource.do_something() # resources available top-level + context.run_id # run_id available as top level property + # no longer info.context.config as it was confusing + # when switching between resources, contexts, and solids + context.solid_config +``` + +The ability to refer to `info.context` will go away fairly +(there is a legacy adapter class to enable backwards compatability +and we do not want it to be immortal). We also want to enforce +that the name of the first variable is context. We are only +allowing info temporarily. +""" + +snapshots['test_build_all_docs 18'] = '''An actual DAG +------------- + +Next we will build a slightly more topologically complex DAG that demonstrates how dagster +determines the execution order of solids in a pipeline: + +.. image:: actual_dag_figure_one.png + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/actual_dag.py + :linenos: + :caption: actual_dag.py + +Again, it is worth noting how we are connecting *inputs* and *outputs* rather than just *tasks*. +Point your attention to the ``solid_d`` entry in the dependencies dictionary: we declare +dependencies on a per-input basis. + +When you execute this example, you'll see that ``solid_a`` executes first, then ``solid_b`` and +``solid_c`` -- in any order -- and ``solid_d`` executes last, after ``solid_b`` and ``solid_c`` +have both executed. + +In more sophisticated execution environments, ``solid_b`` and ``solid_c`` could execute not just +in any order, but at the same time, since their inputs don't depend on each other's outputs -- +but both would still have to execute after ``solid_a`` (because they depend on its output to +satisfy their inputs) and before ``solid_d`` (because their outputs in turn are depended on by +the input of ``solid_d``). + +Try it in dagit or from the command line: + +.. code-block:: console + + $ dagster pipeline execute -f actual_dag.py -n define_diamond_dag_pipeline + +What's the output of this DAG? + +We've seen how to wire solids together into DAGs. Now let's look more deeply at their +:doc:`Inputs `, and start to explore how solids can interact with their external +environment. +''' + +snapshots['test_build_all_docs 19'] = '''Configuration +------------- +For maximum flexibility, testability, and reusability, we want to avoid hardcoding solids' +(or pipelines') dependencies on the external world. + +We should be able to run the same code in different environments for test, in development, and in +production, and to parametrize our solids' interactions with the different facilities afforded by +each of those environments. + +Then, we can declaratively specify features of our environment without having to rewrite our code. + +Conceptually, where **inputs** are inputs to the computation done by a single solid, and might be +linked by a dependency definition to **outputs** of a previous computation in a DAG, +**configuration** should be used to specify *how* a computation executes. + +We'll illustrate this by configuring our hello world example to speak a couple of different +languages. + +This time, we'll use a more fully-featured API to define our solid -- +:py:func:`@solid ` instead of :py:func:`@lambda_solid `. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/config.py + :linenos: + :caption: config.py + +We will be exploring the :py:func:`@solid ` API in much more detail as this tutorial +proceeds. For now, the salient differences are: + +1. The :py:func:`@solid ` API takes an additional parameter, `config_field`, which + defines the structure and type of configuration values that can be set on each execution of the + solid. This parameter should be a :py:func:`Field `, which tells the dagster + machinery how to translate config values into runtime values available to the solid. +2. The function annotated by the :py:func:`@solid ` API receives an additional first + parameter, ``context``, of type :py:class:`TransformExecutionContext `. + The configuration passed into each solid is available to the annotated function as ``context.solid_config``. + +Configuration values are passed in a dict as the second argument to +:py:func:`execute_pipeline `. This dict specifies *all* of the +configuration to execute an entire pipeline. It may have many sections, but we're only +using one of them here: per-solid configuration specified under the key ``solids``. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/config.py + :lines: 22-24 + :dedent: 4 + +The ``solids`` dict is keyed by solid name, and each of its values in turn defines a ``config`` +key corresponding to the user-defined configuration schema for each particular solid (which we set +before using the ``config_field`` parameter). If these values don't match the user-defined schema, +we'll get a helpful error message. + +In this case, we've defined a single scalar string value as config. + +Let's see how to run this pipeline, with config, from the command line. In order to do this you +must provide config in the form of a yaml file: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/config_env.yml + :linenos: + :caption: config_env.yml + +Now you can run this pipeline with this config file like so: + +.. code-block:: console + + $ dagster pipeline execute -f config.py \\ + -n define_configurable_hello_pipeline -e config_env.yml + +To run this example from dagit, use the following command: + +.. code-block:: console + + $ dagit -f config.py -n define_configurable_hello_pipeline + +Just as with configurable inputs, you can edit the configuration on the fly in dagit's built-in +config editor. Try switching languages and rerunning the pipeline! + +.. image:: config_figure_one.png + +Next, we'll learn about configuration schemas and how the type system can help with the management +of config: :doc:`Configuration Schemas `. +''' + +snapshots['test_build_all_docs 20'] = '''Configuration Schemas +--------------------- + +Dagster includes a system for strongly-typed, self-describing configurations schemas. These +descriptions are very helpful when learning how to operate a pipeline, make a rich configuration +editing experience possible, and help to catch configuration errors before pipeline execution. + +Let's see how the configuration schema can prevent errors and improve pipeline documentation. +We'll replace the config field in our solid definition with a structured, strongly typed schema. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/configuration_schemas.py + :linenos: + :emphasize-lines: 31, 37 + :caption: configuration_schemas.py + +The configuration YAML file works as before: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/configuration_schemas.yml + :linenos: + :caption: configuration_schemas.yml + +Now let's imagine we made a mistake and passed a ``string`` in our configuration: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/configuration_schemas_runtime_error.yml + :linenos: + :emphasize-lines: 12 + :caption: configuration_schemas_runtime_error.yml + +And then ran it: + +.. code-block:: console + + $ dagster pipeline execute -f configuration_schemas.py \\ + -n define_demo_configuration_schema_repo \\ + demo_configuration_schema \\ + -e configuration_schemas_runtime_error.yml + ... + Traceback (most recent call last): + ... + File "configuration_schemas.py", line 20, in multiply_the_word + return word * context.solid_config['factor'] + TypeError: can't multiply sequence by non-int of type 'str' + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + ... + dagster.core.errors.DagsterExecutionStepExecutionError: Error occured during the execution of step: + step key: "multiply_the_word.transform" + solid instance: "multiply_the_word" + solid definition: "multiply_the_word" + + +This pipeline is not typechecked and therefore error is caught at runtime. It would be preferable +to catch this before execution. + +In order to do that, let us use the typed config solid. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/configuration_schemas_type_mismatch_error.yml + :linenos: + :emphasize-lines: 12 + :caption: configuration_schemas_runtime_error.yml + +And then run the pipeline + +.. code-block:: console + + $ dagster pipeline execute -f configuration_schemas.py \\ + -n define_demo_configuration_schema_repo \\ + typed_demo_configuration_schema \\ + -e configuration_schemas_type_mismatch_error.yml + +And you'll get a nice error *prior* to execution: + +.. code-block:: console + + dagster.core.execution.PipelineConfigEvaluationError: Pipeline "typed_demo_configuration_schema" config errors: + Error 1: Type failure at path "root:solids:typed_multiply_the_word:config:factor" on type "Int". Value at path root:solids:typed_multiply_the_word:config:factor is not valid. Expected "Int". + + +Now, instead of a runtime failure which might arise deep inside a time-consuming or expensive +pipeline execution, and which might be tedious to trace back to its root cause, we get a clear, +actionable error message before the pipeline is ever executed. + +Let's see what happens if we pass config with the wrong structure: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/configuration_schemas_wrong_field.yml + :linenos: + :emphasize-lines: 9 + :caption: configuration_schemas_wrong_field.yml + +And then run the pipeline: + +.. code-block:: console + + $ dagster pipeline execute -f configuration_schemas.py \\ + -n define_demo_configuration_schema_pipeline -e configuration_schemas_wrong_field.yml + ... + dagster.core.execution.PipelineConfigEvaluationError: Pipeline "demo_configuration_schema" config errors: + Error 1: Undefined field "multiply_the_word_with_typed_config" at path root:solids + Error 2: Missing required field "multiply_the_word" at path root:solids Expected: "{ count_letters?: DemoConfigurationSchema.SolidConfig.CountLetters multiply_the_word: DemoConfigurationSchema.SolidConfig.MultiplyTheWord }" + +Next, we'll see how to use the :doc:`Execution Context ` to further configure +how pipeline execution interacts with its environment. +''' + +snapshots['test_build_all_docs 21'] = '''============ +Dagstermill +============ + +A wonderful feature of using Dagster is that you can productionize Jupyter notebooks and involve them in a (production) pipeline as units of computation. + +There are a few stages of data scientists using notebooks in the wild. + +1. Unstructured scratch work, cells are often run out of order. +2. More refined prototyping, where cells are run sequentially. Usually the top cells contain parameters that are used in later cells. +3. Pieces of re-usable code are extracted from a notebook, turned into functions and put in a script (``.py`` file) + +Typically, only stage 3 would be involved in a production pipeline. However, with dagstermill, if you have a notebook in stage 2 (i.e. cells run sequentially to produce the desired output), with minimal effort you can register this notebook as a solid in the pipeline and use the notebook driven solid as a unit of computation that takes in inputs and produces outputs (that can be consumed by later stages of the pipeline). + +------------------------------------------ +A (Very Simple) Pipeline with a Notebook +------------------------------------------ + +Say you have a pipeline as shown below: + +.. image:: test_add_pipeline.png + +This is a very simple pipeline, where the solid ``return_one`` returns 1 and ``return_two`` returns 2. The notebook driven solid ``add_two_numbers`` simply adds two numbers and returns the result, as the name suggests. + +The notebook might have a cell that looks like the following: + +.. code-block:: python + + a = 3 + b = 5 + result = 3 + 5 + +Currently your notebook simply adds together the numbers ``3`` and ``5``, but in a more generic sense, your notebook is effectively a function that takes in inputs ``a`` and ``b`` and products output ``result``. To use the language of the dagster abstraction, it is a solid with inputs ``a``, ``b`` of dagster-type ``Int`` and with an ouput ``result`` of type ``Int``. + +To register this notebook as a dagster solid, we use the following lines of code. + +.. code-block:: python + + from dagster import InputDefinition, OutputDefinition, Int + import dagstermill as dm + + my_notebook_solid = dm.define_dagstermill_solid( + name='add_two_numbers', + notebook_path='/notebook/path/add_two_numbers.ipynb', + inputs = [ + InputDefinition(name='a', dagster_type=Int), + InputDefinition(name='b', dagster_type=Int) + ], + ouputs = [OutputDefinition(Int)] + ) + +The function ``dm.define_dagstermill_solid()`` returns an object of type ``SolidDefinition`` that can be passed into ``PipelineDefinition`` objects. We see that its arguments are rather self-explanatory: + +* ``name``: the name of the solid +* ``notebook_path``: the location of the notebook so that the dagster execution engine can run the code in the notebook +* ``inputs``, ``outputs``: the named and typed inputs and outputs of the notebook as a solid + +However, we also have to add some boilerplate to the notebook itself to make sure it plays nice with the dagstermill framework. The final notebook with the boilerplate looks as follows. + +.. image:: add_two_numbers.png + +1. ``import dagstermill as dm`` imports the dagstermill library, which is necesary for the rest of the boilerplate +2. ``dm.register_repository()`` takes a repository definition (``define_example_repository()`` in this case) and lets the notebook know how to find the repository that contains the corresponding notebook-driven solid. +3. There is a tagged cell with the tag ``parameters`` that should contain **only** the inputs of the notebook-driven solid. +4. If the notebook-driven solid has an output, then call ``dm.yield_result()`` with the result. + +There is a helpful `Dagstermill CLI`_ that you can use to generate notebooks that will automatically contain the requisite boilerplate. + +---------------------------------------- +Output Notebooks & How Dagstermill Works +---------------------------------------- + +The way dagstermill works is by auto-injecting a cell that replaces the `parameters`-tagged cell with the +runtime values of the inputs and then running the notebook using the `papermill `_ library. +A nice side effect of using the papermill library to run the notebook is that the output is contained in an "output notebook", +and the source notebook remains unchanged. Since the output notebook is itself a valid Jupyter notebook, debugging can be done within the notebook environment! + +The execution log contains the path to the output notebook so that you can access it after execution to examine and potentially debug the output. Within dagit we also provide a link to the output notebook, as shown below. + +.. image:: output_notebook.png + +---------------------------- +Summary of Using Dagstermill +---------------------------- + +Initially, you might want to prototype with a notebook without worrying about incorporating it into a dagster pipeline. When you want to incorporate it into a pipeline, do the following steps: + +1. Use ``dm.define_dagstermill_solid()`` to define the notebook-driven solid to include within a pipeline +2. Within the notebook, call ``import dagstermill as dm`` and make sure that you register the containing repository with ``dm.register_repository()`` +3. Make sure all inputs to the notebook-driven solid are contained in a tagged-cell with the ``parameters`` tag +4. For all outputs, call ``dm.yield_result()`` with the result and output name + +The `Dagstermill CLI`_ should help you with stage 2. + +----------------------------------------- +A (More Complicated) Dagstermill Pipeline +----------------------------------------- + +The above pipeline was a very simplistic use-case of a dagster pipeline involving notebook-driven solids. +Below we provide a more complicated example of a pipeline involving notebooks with outputs that are fed in as inputs into further steps in the pipeline. +This is a particular compelling use-case of incorporating notebook-driven solids into a pipeline, as the user no longer has to manually marshall the inputs and outputs of notebooks manually. +Instead, the dagster execution engine takes care of this for us! Let us look at the following machine-learning inspired pipeline. + +.. image:: ML_pipeline.png + +The corresponding dagster code for defining the pipeline is as follows: + +.. code-block:: python + + def define_tutorial_pipeline(): + return PipelineDefinition( + name='ML_pipeline', + solids=[clean_data_solid, LR_solid, RF_solid], + dependencies={ + SolidInstance('clean_data'): {}, + SolidInstance('linear_regression'): {'df': DependencyDefinition('clean_data')}, + SolidInstance('random_forest_regression'): {'df': DependencyDefinition('clean_data')}, + }, + ) + +The ``clean_data_solid`` solid is driven by the following notebook: + +.. image:: clean_data_ipynb.png + +We see that this notebook loads some data, filters it and yields it as a dataframe. +Then, this dataframe is consumed by the solids ``linear_regression`` and ``random_forest_regression``, which both consume inputs ``df`` that is flowed from the output of ``clean_data_solid``. + +The ``random_forest_regression`` solid is driven by the following notebook: + +.. image:: RF_ipynb.png + +Without the dagstermill abstraction, we'd have to manually save the output of the ``clean_data`` notebook to a location and make sure to load the same location in the 2 other notebooks. +However, the dagster execution engine takes care of this marshalling for us, +so notice that the ``random_forest_regression`` notebook is simply using ``df`` as a parameter +that will be over-written with its correct runtime value from the result of ``clean_data``. + +After running the pipeline, we can examine the ``random_forest_regression`` output notebook, which looks as follows: + +.. image:: RF_output_notebook.png + +The output notebook is quite convenient, because we can debug within the notebook environment as well as view plots and other output within the notebook context. +We can also look at the input that was flowed into the notebook (i.e. the filtered output of ``clean_data``). + +--------------------- +Full Dagstermill API +--------------------- + +The boilerplate necesary for a notebook involves some of the ``dagstermill`` API, but here we describe some more advanced API functionality. + +.. code-block:: python + + notebook_driven_solid = dm.define_dagstermill_solid( + name, + notebook_path, + inputs=None, + outputs=None, + config_field=None + ) + + assert(isinstance(notebook_driven_solid, SolidDefinition)) + +This function creates a notebook-driven solid by taking in a solid name, notebook location and typed inputs and outputs, and returns a SolidDefinition that can be used in a dagster Pipeline. + + +**Parameters**: + +* **name** (str) -- Name of solid in pipeline +* **notebook_path** (str) -- File path of notebook that drives the solid +* **inputs** (list[InputDefinition]) +* **outputs** (list[OutputDefinition]) +* **config_field** (generic) -- Config for the solid + + +.. code-block:: python + + dm.register_repository(repository_defn) + +To use a notebook as a solid in a pipeline, the first cell of the notebook *must* register the repository to which the notebook driven solid belongs. + +**Parameters** + +* **repository_defn** (RepositoryDefinition) -- RepositoryDefinition object to which solid belongs + +.. code-block:: python + + dm.yield_result(result_obj, output_name="result") + +If the notebook driven solid has outputs (as defined when using ``define_dagstermill_solid``), then call ``yield_result`` with the output and the output name (defaults to ``result``) to produce output for consumption for solids in later stages of the pipeline. + +**Parameters** + +* result_obj (generic) -- The result of the computation, must be of the type specified in the corresponding ``OutputDefinition`` +* output_name (str) -- Defaults to "result", but must match the name given in the OutputDefinition (which defaults to ``"result"`` if there is only 1 output) + +.. code-block:: python + + context = dm.get_context(config=None) + assert (isinstance(context, AbstractTransformExecutionContext)) + context.log.info("This will log some info to the logger") + +If you want access to the context object that is available in other solids, then you can call ``get_context()`` with the desired config within the notebook to access the context object and manipulate it as you would in any other solid. When the notebook is run as a solid in a pipeline, the context will be injected at runtime with the configuration provided for the entire pipeline. + +**Parameters** + +* config (dict) -- The config for the context (think dict version of yaml typically passed into config) + +=============== +Dagstermill CLI +=============== + +To assist you in productionizing notebooks, the dagstermill CLI will be helpful in adding boilerplate to existing notebooks to turn them into dagster solids (or creating notebooks from scratch with the requisite boilerplate). + +To create a notebook when you know the repository, use the ``dagstermill create-notebook`` command. The notebook name is provided with the ``--notebook`` argument. A repository can be provided using the ``.yml`` file or the other command line options for specifying the location of a repository definition. If the repository is not provided, then the scaffolding ``dm.register_repository()`` is not inserted. + +.. code-block:: console + + $ dagstermill create-notebook --notebook "notebook_name" -y repository.yml + +Normally, the ``create-notebook`` command will prompt to ask if you want to over-write an existing notebook with the same name (if such a notebook exists). The ``--force-overwrite`` flag forces the over-write. + +.. code-block:: console + + $ dagstermill create-notebook --help + + Usage: dagstermill create-notebook [OPTIONS] + + Creates new dagstermill notebook. + + Options: + -n, --fn-name TEXT Function that returns either repository or + pipeline + -m, --module-name TEXT Specify module where repository or pipeline + function lives + -f, --python-file TEXT Specify python file where repository or pipeline + function lives. + -y, --repository-yaml TEXT Path to config file. Defaults to + ./repository.yml. if --python-file and --module- + name are not specified + -note, --notebook TEXT Name of notebook + --force-overwrite Will force overwrite any existing notebook or + file with the same name. + --help Show this message and exit. + +**TODO**: Currently we don't auto-inject the parameters cell if it doesn't exist, but we can change the CLI to do this. + +Given a notebook that does not have the requisite scaffolding (perhaps a notebook created before knowing exact what dagster repository it belongs in), use the ``register-notebook`` command to specify an existing notebook and repository, and the CLI will inject the requiste cells in the notebook with the boilerplate for registering the repository and adding the parameters-tagged cell, if one doesn't exist. Note that this CLI command operates **in-place**, so the original notebook is modified! + +.. code-block:: console + + $ dagstermill register-notebook --notebook path/to/notebook -y repository.yaml + +**Example CLI usage** + +.. code-block:: console + + $ dagstermill create-notebook --notebook test_notebook + +Gives the following notebook--notice how there is no call to ``register_repository`` within the notebook. + +.. image:: pre_boilerplate_notebook.png + +After a while, say you finally have a repository file (``repository.yml``). Then you register the notebook, giving the following: + +.. code-block:: console + + $ ls + test_notebook.ipynb repository.yml + $ dagstermill register-notebook --notebook test_notebook.ipynb -y repository.yml + +.. image:: post_boilerplate_notebook.png + + + + + + + + +''' + +snapshots['test_build_all_docs 22'] = '''Execution Context +================= + +One of the most important objects in the system is the execution context. The execution +context, the logger, and the resources are threaded throughout the entire computation ( +via the ``context`` object passed to user code) and contains handles to logging facilities +and external resources. Interactions with logging systems, databases, and external +clusters (e.g. a Spark cluster) should be managed through these properties of the execution +context. + +This provides a powerful layer of indirection that allows a solid to abstract +away its surrounding environment. Using an execution context allows the system and +pipeline infrastructure to provide different implementations for different +environments, giving the engineer the opportunity to design pipelines that +can be executed on your local machine or your CI/CD pipeline as readily as +your production cluster environment. + +Logging +~~~~~~~ + +One of the most basic pipeline-level facilities is logging: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/execution_context.py + :lines: 1-16 + :caption: execution_context.py + +Run this example pipeline in dagit: + +.. code-block:: console + + $ dagster pipeline execute -m dagster.tutorials.intro_tutorial.tutorial_repository -n define_repository execution_context_pipeline + +And you'll notice log messages like this: + +.. code-block:: console + + 2019-04-05 16:54:31 - dagster - ERROR - + orig_message = "An error occurred." + log_message_id = "d567e965-31a1-4b99-8b6c-f2f7cfccfcca" + log_timestamp = "2019-04-05T23:54:31.678344" + run_id = "28188449-51bc-4c75-8b70-38cccb8e82e7" + pipeline = "execution_context_pipeline" + step_key = "error_message.transform" + solid = "error_message" + solid_definition = "error_message" + +These log messages are annonated with a bunch of key value pairs that indicate where in the +computation each log message was emitted. This happened because we logged through the execution +context. + +Notice that even though the user only logged the message "An error occurred", by routing logging +through the context we are able to provide richer error information -- including the name of the +solid and a timestamp -- in a semi-structured format. + +You'll notice that ``'A debug message.'`` does not appear in the execution logs. This +is because the default log level is ``INFO``, so debug-level messages will not appear. + +Let's change that by specifying some config. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/execution_context.yml + :language: YAML + :linenos: + :caption: execution_context.yml + +Save it as execution_context.yml and then run: + +.. code-block:: console + + $ dagster pipeline execute \\ + -m dagster.tutorials.intro_tutorial.tutorial_repository \\ + -n define_repository execution_context_pipeline \\ + -e execution_context.yml + +You'll see now that debug messages print out to the console. + +Although logging is a universally useful case for the execution context, this example only touches +on the capabilities of the context. Any pipeline-level facilities that pipeline authors might want +to make configurable for different environments -- for instance, access to file systems, databases, +or compute substrates -- can be configured using the context. + +We'll see how to use some of these other capabilities in the next section: +:doc:`Resources `. +''' + +snapshots['test_build_all_docs 23'] = '''Expectations +============ + +Dagster has a first-class concept to capture data quality tests. We call these +data quality tests expectations. + +Data pipelines have the property that they typically do not control +what data they ingest. Unlike a traditional application where you can +prevent users from entering malformed data, data pipelines do not have +that option. When unexpected data enters a pipeline and causes a software +error, typically the only recourse is to update your code. + +Lying within the code of data pipelines are a whole host of implicit +assumptions about the nature of the data. One way to frame the goal of +expectations is to say that they make those implict assumption explicit. +And by making these a first class concept they can be described with metadata, +inspected, and configured to run in different ways. + +You'll note the new concept of expecatations. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/expectations.py + :linenos: + :caption: expectations.py + :emphasize-lines: 17-22 + +At its core, an expectation is a function applied to either an input or an output. +Generally anywhere there is a type, you can apply an expectation. This function +can be as sophisticated as the user wants, anywhere from a simple null check to +checking thresholds of distrbutions or querying lookup tables. + + +If you run this pipeline, you'll notice some logging that indicates that the expectation +was processed + +We'll use this config file. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/expectations_pass.yml + :linenos: + :caption: expectations_pass.yml + +And then run: + +.. code-block:: console + + $ dagster pipeline execute -f expectations.py \\ + -n define_expectations_tutorial_pipeline -e \\ + expectations_pass.yml + +In that execution you'll notice a passing expectation: + +.. code-block:: console + + 2019-01-15 13:04:17 - dagster - INFO - orig_message="Execution of add_ints.output.num_one.expectation.check_positive succeeded in 0.06198883056640625" log_message_id="e903e121-e529-42ff-9561-b17dea553fba" run_id="71affcec-1c10-4a8b-9416-10115a01783f" pipeline="expectations_tutorial_pipeline" solid="add_ints" solid_definition="add_ints" event_type="EXECUTION_PLAN_STEP_SUCCESS" millis=0.06198883056640625 step_key="add_ints.output.num_one.expectation.check_positive" + +Now let's make this fail. Currently the default behavior is to throw an error and halt execution +when an expectation fails. So: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/expectations_fail.yml + :linenos: + :caption: expectations_fail.yml + +And then: + +.. code-block:: sh + + $ dagster pipeline execute -f expectations.py \\ + -n define_expectations_tutorial_pipeline \\ + -e expectations_fail.yml + + dagster.core.errors.DagsterExpectationFailedError: + DagsterExpectationFailedError(solid=add_ints, + output=num_one, expectation=check_positive + value=-2) + + +Because the system is explictly aware of these expectations they are viewable in dagit. +It can also configure the execution of these expectations. The capabilities of this part of the +system are currently quite immature, but we expect to develop these more in the future. The only +feature right now is the ability to skip expectations entirely. This is useful in a case where +expectations are expensive and you have a time-critical job you must execute. In that case you can +configure the pipeline to skip expectations entirely: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/expectations_skip_failed.yml + :linenos: + :caption: expectations_skip_fail.yml + +.. code-block:: sh + + $ dagster pipeline execute -f expectations.py \\ + -n define_expectations_tutorial_pipeline \\ + -e expectations_skip_failed.yml + +''' + +snapshots['test_build_all_docs 24'] = '''Hello, DAG +---------- +One of the core capabitilies of dagster is the ability to express data pipelines as arbitrary +directed acyclic graphs (DAGs) of solids. + +We'll define a very simple two-solid pipeline whose first solid returns a hardcoded string, +and whose second solid concatenates two copies of its input. The output of the pipeline should be +two concatenated copies of the hardcoded string. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/hello_dag.py + :linenos: + :caption: hello_dag.py + +This pipeline introduces a few new concepts. + +1. Solids can have **inputs** defined by instances of + :py:class:`InputDefinition `. Inputs allow us to connect solids to + each other, and give dagster information about solids' dependencies on each other (and, as + we'll see later, optionally let dagster check the types of the inputs at runtime). + +2. Solids' **dependencies** on each other are expressed by instances of + :py:class:`DependencyDefinition `. + You'll notice the new argument to :py:class:`PipelineDefinition ` + called ``dependencies``, which is a dict that defines the connections between solids in a + pipeline's DAG. + + .. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/hello_dag.py + :lines: 18 + :dedent: 8 + + The first layer of keys in this dict are the *names* of solids in the pipeline. The second layer + of keys are the *names* of the inputs to each solid. Each input in the DAG must be provided a + :py:class:`DependencyDefinition `. (Don't worry -- if you forget + to specify an input, a helpful error message will tell you what you missed.) + + In this case the dictionary encodes the fact that the input ``arg_one`` of solid ``solid_two`` + should flow from the output of ``solid_one``. + +Let's visualize the DAG we've just defined in dagit. + +.. code-block:: console + + $ dagit -f hello_dag.py -n define_hello_dag_pipeline + +Navigate to http://127.0.0.1:3000/hello_dag_pipeline/explore or choose the hello_dag_pipeline +from the dropdown: + +.. image:: hello_dag_figure_one.png + +One of the distinguishing features of dagster that separates it from many workflow engines is that +dependencies connect *inputs* and *outputs* rather than just *tasks*. An author of a dagster +pipeline defines the flow of execution by defining the flow of *data* within that +execution. This is core to the programming model of dagster, where each step in the pipeline +-- the solid -- is a *functional* unit of computation. + +Now run the pipeline we've just defined, either from dagit or from the command line: + +.. code-block:: console + +\t$ dagster pipeline execute -f hello_dag.py -n define_hello_dag_pipeline + +In the next section, :doc:`An actual DAG `, we'll build our first DAG with interesting +topology and see how dagster determines the execution order of a pipeline. +''' + +snapshots['test_build_all_docs 25'] = '''Hello, World +------------ +See :doc:`../../install/install` for instructions installing dagster (the core library) and dagit (the +web UI tool used to visualize your data pipelines) on your platform of choice. + +Let's write our first pipeline and save it as ``hello_world.py``. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/hello_world.py + :linenos: + :lines: 1-10 + :caption: hello_world.py + +This example introduces three concepts: + +1. A **solid** is a functional unit of computation in a data pipeline. In this example, we use the + decorator :py:func:`@lambda_solid ` to mark the function ``hello_world`` + as a solid: a functional unit which takes no inputs and returns the output ``'hello'`` every + time it's run. + +2. A **pipeline** is a set of solids arranged into a DAG of computation that produces data assets. + In this example, the call to :py:class:`PipelineDefinition ` defines + a pipeline with a single solid. + +3. We **execute** the pipeline by running :py:func:`execute_pipeline `. + Dagster will call into each solid in the pipeline, functionally transforming its inputs, if any, + and threading its outputs to solids further on in the DAG. + +Pipeline Execution +^^^^^^^^^^^^^^^^^^ + +Assuming you've saved this pipeline as ``hello_world.py``, we can execute it via any of three +different mechanisms: + +1. The CLI utility `dagster` +2. The GUI tool `dagit` +3. Using dagster as a library within your own script. + +CLI +~~~ + +.. code-block:: console + + $ dagster pipeline execute -f hello_world.py -n define_hello_world_pipeline + 2019-01-08 11:23:57 - dagster - INFO - orig_message="Beginning execution of pipeline hello_world_pipeline" log_message_id="5c829421-06c7-49eb-9195-7e828e37eab8" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" event_type="PIPELINE_START" + 2019-01-08 11:23:57 - dagster - INFO - orig_message="Beginning execution of hello_world.transform" log_message_id="5878513a-b510-4837-88cb-f77205931abb" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" solid="hello_world" solid_definition="hello_world" event_type="EXECUTION_PLAN_STEP_START" step_key="hello_world.transform" + 2019-01-08 11:23:57 - dagster - INFO - orig_message="Solid hello_world emitted output \\"result\\" value \'hello\'" log_message_id="b27fb70a-744a-46cc-81ba-677247b1b07b" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" solid="hello_world" solid_definition="hello_world" + 2019-01-08 11:23:57 - dagster - INFO - orig_message="Execution of hello_world.transform succeeded in 0.9558200836181641" log_message_id="25faadf5-b5a8-4251-b85c-dea6d00d99f0" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" solid="hello_world" solid_definition="hello_world" event_type="EXECUTION_PLAN_STEP_SUCCESS" millis=0.9558200836181641 step_key="hello_world.transform" + 2019-01-08 11:23:57 - dagster - INFO - orig_message="Step hello_world.transform emitted \'hello\' for output result" log_message_id="604dc47c-fe29-4d71-a531-97ae58fda0f4" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" + 2019-01-08 11:23:57 - dagster - INFO - orig_message="Completing successful execution of pipeline hello_world_pipeline" log_message_id="1563854b-758f-4ae2-8399-cb75946b0055" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" event_type="PIPELINE_SUCCESS" + +There's a lot of information in these log lines (we'll get to how you can use, and customize, +them later), but you can see that the third message is: +``Solid hello_world emitted output \\"result\\" value \'hello\'``. Success! + +Dagit +~~~~~ + +To visualize your pipeline (which only has one node) in dagit, you can run: + +.. code-block:: console + + $ dagit -f hello_world.py -n define_hello_world_pipeline + Serving on http://127.0.0.1:3000 + +You should be able to navigate to http://127.0.0.1:3000/hello_world_pipeline/explore in your web +browser and view your pipeline. + +.. image:: hello_world_figure_one.png + +There are lots of ways to execute dagster pipelines. If you navigate to the "Execute" +tab (http://127.0.0.1:3000/hello_world_pipeline/execute), you can execute your pipeline directly +from dagit by clicking the "Start Execution" button. + +.. image:: hello_world_figure_two.png + +A new window will open, and you'll see the pipeline execution commence with logs; here, you can +filter logs by level and search over the results + +.. image:: hello_world_figure_three.png + +Library +~~~~~~~ + +If you'd rather execute your pipelines as a script, you can do that without using the dagster CLI +at all. Just add a few lines to `hello_world.py` (highlighted in yellow): + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/hello_world.py + :linenos: + :caption: hello_world.py + :emphasize-lines: 13-15 + +Then you can just run: + +.. code-block:: console + + $ python hello_world.py + +Next, let's build our first multi-solid DAG in :doc:`Hello, DAG `! +''' + +snapshots['test_build_all_docs 26'] = '''Tutorial +======================= + +.. toctree:: + :maxdepth: 1 + + hello_world + hello_dag + actual_dag + inputs + config + configuration_schemas + execution_context + resources + repos + pipeline_cli_execution + types + expectations + multiple_outputs + reusable_solids + unittesting + dagstermill +''' + +snapshots['test_build_all_docs 27'] = '''Inputs +------ +So far we have only demonstrated pipelines whose solids yield hardcoded values and then flow them +through the pipeline. In order to be useful a pipeline must also interact with its external +environment. + +Let's return to our hello world example. But this time, we'll make the string +the solid returns be parameterized based on inputs. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/inputs.py + :lines: 1-17 + :linenos: + :caption: inputs.py + +Note that the input ``word`` to solid ``add_hello_to_word`` has no dependency specified. This +means that the operator of the pipeline must specify the input at pipeline execution +time. + +Recall that there are three primary ways to execute a pipeline: using the python API, from +the command line, and from dagit. We'll go through each of these and see how to specify the input +in each case. + +Python API +~~~~~~~~~~ +In the Python API, pipeline configuration is specified in the second argument to +:py:func:`execute_pipeline `, which must be a dict. This dict contains +*all* of the configuration to execute an entire pipeline. It may have many sections, but we'll only +use one of them here: per-solid configuration specified under the key ``solids``: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/inputs.py + :linenos: + :lines: 25,27,29-31 + :dedent: 8 + +The ``solids`` dict is keyed by solid name, and each solid is configured by a dict that may have +several sections of its own. In this case we are only interested in the ``inputs`` section, so +that we can specify that value of the input ``word``. + +The function ``execute_with_another_world`` demonstrates how one would invoke this pipeline +using the python API: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/inputs.py + :linenos: + :lines: 20-22,25,27,29-32 + +CLI +~~~ + +Next let's use the CLI. In order to do that we'll need to provide the environment +information via a config file. We'll use the same values as before, but in the form +of YAML rather than python dictionaries: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/inputs_env.yml + :language: YAML + :linenos: + :caption: inputs_env.yml + +And now specify that config file via the ``-e`` flag. + +.. code-block:: console + + $ dagster pipeline execute -f inputs.py \\ + -n define_hello_inputs_pipeline -e inputs_env.yml + +Dagit +~~~~~ + +As always, you can load the pipeline and execute it within dagit. + +.. code-block:: console + + $ dagit -f inputs.py -n define_hello_inputs_pipeline + Serving on http://127.0.0.1:3000 + +From the execute console, you can enter your config directly like so: + +.. image:: inputs_figure_one.png + +You'll notice that the config editor is auto-completing. Because it knows the structure +of the config, the editor can provide rich error information. We can improve the experience of +using the editor by appropriately typing the inputs, making everything less error-prone. + +Typing +^^^^^^ + +Right now the inputs and outputs of this solid are totally untyped. (Any input or output +without a type is automatically assigned the ``Any`` type.) This means that mistakes +are often not surfaced until the pipeline is executed. + +For example, imagine if our environment for our pipeline was: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/inputs_env_bad.yml + :language: YAML + :linenos: + :caption: inputs_env_bad.yml + +If we execute this pipeline with this config, it'll fail at runtime. + +Enter this config in dagit, hit execute, and you'll see the execution fail: + +.. image:: inputs_figure_two_untyped_execution.png + +Click on the red dot on the execution step that failed and a detailed stacktrace will pop up. + +.. image:: inputs_figure_three_error_modal.png + +It would be better if we could catch this error earlier, when we specify the config. So let's +make the inputs typed. + +A user can apply types to inputs and outputs. In this case we just want to type them as the +built-in ``String``. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/inputs.py + :lines: 35-40 + :emphasize-lines: 1 + :caption: inputs.py + +By using typed input instead we can catch this error prior to execution. + +.. image:: inputs_figure_four_error_prechecked.png + +Next, we'll look at a closely allied concept -- :doc:`Configuration ` values. +''' + +snapshots['test_build_all_docs 28'] = '''Multiple Outputs +---------------- + +So far all of our examples have been solids that have a single output. But +solids can have an arbitrary number of outputs. Downstream solids can +depend on any number of these outputs. Additionally, these outputs do +not *necessarily* have to be fired, therefore unlocking the ability for +downstream solids to be invoked conditionally based on something that +happened during the computation. + +``MultipleResults`` Class +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Here we present an example of a solid that has multiple outputs within a pipeline: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/multiple_outputs.py + :linenos: + :caption: multiple_outputs.py + :lines: 26-33, 50-74 + +This can be visualized in dagit: + +.. image:: multiple_results_figure_one.png + + +Notice how ``return_dict_results`` has two outputs. For the first time +we have provided the name argument to an :py:class:`OutputDefinition `. +(The name of an output defaults to ``'result'``, as it does for a +:py:class:`DependencyDefinition `) Output names must be unique +and each result returned by a solid's transform function must have a name that corresponds to +one of these outputs. + +So from ``return_dict_results`` we used :py:class:`MultipleResults ` +to return all outputs from this transform. + +Just as this tutorial gives us the first example of a named +:py:class:`OutputDefinition `, this is also the first time that we've +seen a named :py:class:`DependencyDefinition `. Recall that dependencies +point to a particular **output** of a solid, rather than to the solid itself. + +With this we can run the pipeline (condensed here for brevity): + +.. code-block:: console + + $ dagster pipeline execute -f multiple_outputs.py \\ + -n define_multiple_outputs_step_one_pipeline + + ... log spew + 2019-04-05 22:23:37 - dagster - INFO - + orig_message = "Solid return_dict_results emitted output \\"out_one\\" value 23" + ... + solid_definition = "return_dict_results" + ... + 2019-04-05 22:23:37 - dagster - INFO - + orig_message = "Solid return_dict_results emitted output \\"out_two\\" value 45" + ... + solid_definition = "return_dict_results" + ... more log spew + +Iterator of ``Result`` +^^^^^^^^^^^^^^^^^^^^^^ + +The :py:class:`MultipleResults ` class is not the only way +to return multiple results from a solid transform function. You can also yield +multiple instances of the ``Result`` object. (Note: this is actually the core +specification of the transform function: all other forms are implemented in terms of +the iterator form.) + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/multiple_outputs.py + :linenos: + :caption: multiple_outputs.py + :lines: 15-24 + +Conditional Outputs +^^^^^^^^^^^^^^^^^^^ + +Multiple outputs are the mechanism by which we implement branching or conditional execution. Let's +modify the first solid above to conditionally emit one output or the other based on config +and then execute that pipeline. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/multiple_outputs.py + :linenos: + :caption: multiple_outputs.py + :lines: 36-49,86-96 + +You must create a config file + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/conditional_outputs.yml + :linenos: + :caption: conditional_outputs.yml + +And then run it. + +.. code-block:: console + + $ dagster pipeline execute -f multiple_outputs.py \\ + -n define_multiple_outputs_step_three_pipeline \\ + -e conditional_outputs.yml + + ... log spew + 2019-04-05 22:29:31 - dagster - INFO - + orig_message = "Solid conditional emitted output \\"out_two\\" value 45" + ... + + 2019-04-05 22:29:31 - dagster - INFO - + orig_message = "Solid conditional did not fire outputs {\'out_one\'}" + ... + ... log spew + +Note that we are configuring this solid to *only* emit ``out_two`` which will end up +only triggering ``log_num_squared``. The solid ``log_num`` will never be executed. + +Next, let's look at writing :doc:`Reusable Solids ` so we can avoid duplicating +common data pipeline work. +''' + +snapshots['test_build_all_docs 29'] = '''Pipeline CLI Execution +---------------------- + +Up until now we've been focusing on using the dagit tool for executing pipelines. However, we +also have a CLI utility for use in scripting contexts. It has its own features which are useful in +a production context. + +Just as in the last part of the tutorial, we'll define a pipeline and a repository, and create +a yaml file to tell the CLI tool about the repository. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/pipeline_cli_execution.py + :linenos: + :caption: pipeline_cli_execution.py + +And now the repository file: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/pipeline_execution_repository.yml + :linenos: + :language: YAML + :caption: repository.yml + +Finally, we'll need to define the pipeline config in a yaml file in order to +execute our pipeline from the command line. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/pipeline_execution_env.yml + :linenos: + :language: YAML + :caption: env.yml + +With these elements in place we can now drive execution from the CLI specifying only the pipeline +name. The tool loads the repository using the ``repository.yml`` file and looks up the pipeline by +name. + +.. code-block:: console + + $ dagster pipeline execute demo_pipeline -e env.yml + +Config Splitting +^^^^^^^^^^^^^^^^ + +Suppose that we want to keep some settings (like our context-level logging config) constant across +a bunch of our pipeline executions, and vary only pipeline-specific settings. It'd be tedious to +copy the broadly-applicable settings into each of our config yamls, and error-prone to try to keep +those copies in sync. So the command line tools allow us to specify more than one yaml file to use +for config. + +Let's split up our env.yml into two parts: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/pipeline_execution_env.yml + :lines: 1-4 + :language: YAML + :caption: constant_env.yml + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/pipeline_execution_env.yml + :lines: 6-12 + :language: YAML + :caption: specific_env.yml + +Now we can run our pipeline as follows: + +.. code-block:: console + + $ dagster pipeline execute part_seven -e constant_env.yml -e specific_env.yml + +Order matters when specifying yaml files to use -- values specified in later files will override +values in earlier files, which can be useful. You can also use globs in the CLI arguments to consume +multiple yaml files. + +Next, we'll look at how :doc:`User-Defined Types ` can enrich documentation and type-safety +in pipelines. +''' + +snapshots['test_build_all_docs 30'] = '''Repositories +------------ +Dagster is a not just a programming model for pipelines, it is also a platform for +tool-building. You've already met the dagster and dagit CLI tools, which let you programmatically +run and visualize pipelines. + +In previous examples we have specified a file (``-f``) or a module (``-m``) and named a pipeline definition function +(``-n``) in order to tell the CLI tools how to load a pipeline, e.g.: + +.. code-block:: console + + $ dagit -f hello_world.py -n define_hello_world_pipeline + $ dagster pipeline execute -f hello_world.py \\ + -n define_hello_world_pipeline + +But most of the time, especially when working on long-running projects with other people, we will +want to be able to target many pipelines at once with our tools. + +A **repository** is a collection of pipelines at which dagster tools may be pointed. + +Repostories are declared using a new API, +:py:func:`RepositoryDefinition `: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/repos.py + :linenos: + :caption: repos.py + +Note that the name of the pipeline in the `RepositoryDefinition` must match the name we declared +for it in its `PipelineDefinition`. Don't worry, if these names don't match, you'll see a helpful +error message. + +If you save this file as ``repos.py``, you can then run the command line tools on it. Try running: + +.. code-block:: console + + $ dagit -f repos.py -n define_repo + +Now you can see the list of all pipelines in the repo via the dropdown at the top. + +.. image:: repos_figure_one.png + +Typing the name of the file and function defining the repository gets tiresome and repetitive, so +let's create a declarative config file with this information to make using the command line tools +easier. Save this file as ``repository.yml``. This is the default name for a repository config file, +although you can tell the CLI tools to use any file you like. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/repos_1.yml + :linenos: + :language: YAML + :caption: repository.yml + +Now you should be able to list the pipelines in this repo without all the typing: + +.. code-block:: console + + $ dagit + +In the next part of the tutorial, we'll get to know :doc:`Pipeline Execution ` +a little better, and learn how to execute pipelines in a repository from the command line by name, +with swappable config. +''' + +snapshots['test_build_all_docs 31'] = '''Resources +========= + +We've already learned about logging through the info object. We can also use the info object +to manage pipelines' access to resources like the file system, databases, or cloud services. +In general, interactions with features of the external environment like these should be modeled +as resources. + +Let's imagine that we are using a key value store offered by a cloud service that has a python API. +We are going to record the results of computations in that key value store. + +We are going to model this key value store as a resource. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py + :lines: 1 + :dedent: 2 + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py + :lines: 29-36, 54-64 + +The core of a resource are the definition of its configuration (the ``config_field``) +and then the function that can actually construct the resource. Notice that all of the +configuration specified for a given resource is passed to its constructor under the +``resource_config`` key of the ``init_context`` parameter. + +Let's now attach this resource to a pipeline and use it in a solid. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py + :lines: 68-75, 76-88 + +Resources are attached to pipeline context definitions. A pipeline context +definition is way that a pipeline can declare the different "modes" it can +operate in. For example, a common context definition would be "unittest" +or "production". So, you can swap out implementations of these resources +by altering configuration, while not changing your code. + +In this case we have a single context definition, ``cloud``, and that context definition has a +single resource, the cloud store resource. + +In order to invoke this pipeline, we pass it the following configuration: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py + :lines: 94-103 + :dedent: 8 + +Note how we are telling the configuration to create a cloud context by +using the ``cloud`` key under ``context`` and then parameterizing the store resource +with the appropriate config. As a config, any user-provided configuration for +an artifact (in this case the ``store`` resoource) is placed under the ``config`` key. + +So this works, but imagine we wanted to have a test mode, where we interacted +with an in memory version of that key value store and not develop against the live +public cloud version. + +First, we need a version of the store that implements the same interface as the production key-value +store; this version can be used in testing contexts without touching the public cloud: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py + :lines: 39-45 + +Next we package this up as a resource. + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py + :lines: 48-53 + +And lastly add a new context definition to represent this new operating "mode": + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py + :lines: 78-88 + :emphasize-lines: 6-8 + +Now we can simply change configuration and the "in-memory" version of the +resource will be used instead of the cloud version: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/resources.py + :lines: 106-112 + :emphasize-lines: 4 + :dedent: 4 + +In the next section, we'll see how to declaratively specify :doc:`Repositories ` to +manage collections of multiple dagster pipelines. +''' + +snapshots['test_build_all_docs 32'] = '''Reusable Solids +--------------- + +So far we have been using solids tailor-made for each pipeline they were resident in, and have +only used a single instance of that solid. However, solids are, at their core, a specialized type +of function. And like functions, they should be reusable and not tied to a particular call site. + +Imagine we have some solids that perform generic mathematical computations and we want them to +be reusable. E.g. we want to have a generic ``adder`` solid and use it a couple times within +a pipeline. Using APIs presented so far, that would be impossible: there would be a name collision +if one included two copies of the solid. + +Instead we introduce a new class ``SolidInstance`` that allows the user to create multiple, named instances +of a single solid: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/reusable_solids.py + :linenos: + :caption: reusable_solids.py + +You'll notice that now have two copies of the adder solid. + +You can think of the solids parameter as declaring what solids are "in-scope" for the +purposes of this pipeline, and the dependencies parameter is how they instantiated +and connected together. Within the dependency graph and in config, the alias of the +particular instance is used, rather than the name of the definition. + +If you inspect this in dagit, you'll see those two instances: + +.. image:: reusable_solids_figure_one.png + +You also use the aliases in the environment config. In order to execute this pipeline, use +the following config file: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/reusable_solids.yml + :linenos: + :caption: reusable_solids.yml + + +Load this in dagit and you'll see that the node are the graph are labeled with +their instance name. + +.. code-block:: sh + + $ dagit -f part_thirteen.py -n define_part_thirteen_step_two + +Now these arithmetic operations are not particularly interesting, but one +can imagine reusable solids doing more useful things like uploading files +to cloud storage, unzipping files, etc. +''' + +snapshots['test_build_all_docs 33'] = '''User-Defined Types & Input/Output Schemas +----------------------------------------- + +Throughout the tutorial you have seen the use of builtins such as :py:class:`Int ` +and :py:class:`String ` for types. However you will want to be able to define your +own dagster types to fully utilize the system. We'll go over that here. + +As a pedogogical example, we will go over the code used to the define the ``PandasDataFrame`` type +in the dagster-pandas library, building it step by step along the way. + +Basic Typing +^^^^^^^^^^^^ + +.. literalinclude:: ../../../../../libraries/dagster-pandas/dagster_pandas/data_frame.py + :lines: 1, 84-92, 94 + +What this code doing is annotating/registering an existing type as a dagster type. Now one can +include this type and use it as an input or output of a solid. The system will do a typecheck +to ensure that the object is of type ``pd.DataFrame``. + +Now one can use it to define a solid: + +.. code-block:: py + :emphasize-lines: 2-3 + + @lambda_solid( + inputs=[InputDefinition('num', DataFrame)], + output=OutputDefinition(DataFrame), + ) + def sum_solid(num): + sum_df = num.copy() + sum_df['sum'] = sum_df['num1'] + sum_df['num2'] + return sum_df + +The type metadata now appears in dagit and the system will ensure the input and output to this +solid are indeed data frames. + +Input Schema +^^^^^^^^^^^^ + +This solid as defined is only expressed in terms of an in-memory object; it says nothing about +how this data should be sourced from or materialized to disk. This is where the notion of +input and output schemas come into play. Once the user provides those she is able to use +the configuration language in order to parameterize the computation. + +Let us now add the input schema: + +.. code-block:: py + + @input_schema( + Selector( + { + 'csv': define_csv_dict_field(), + 'parquet': define_path_dict_field(), + 'table': define_path_dict_field(), + } + ) + ) + def dataframe_input_schema(config_value): + file_type, file_options = list(config_value.items())[0] + check.str_param(file_type, 'file_type') + check.dict_param(file_options, 'file_options') + + if file_type == 'csv': + path = file_options['path'] + del file_options['path'] + return pd.read_csv(path, **file_options) + elif file_type == 'parquet': + return pd.read_parquet(file_options['path']) + elif file_type == 'table': + return pd.read_table(file_options['path']) + else: + raise DagsterInvariantViolationError( + 'Unsupported file_type {file_type}'.format( + file_type=file_type + ) + ) + + +Any input schema is define by a decorated function with a single argument. The argument is the +format the input schema takes. In this case it is a `Selector`. Selectors are used when you want +to be able present several different options to the user but force them to select one. In this case, +for example, it would not make much sense to allow them to say that a single input should be sourced +from a csv and a parquet file: They must choose. (In other type systems this might be called an "input +union.") + +Note our selector provides three keys: `csv`, `parquet`, and `table`. Each of these in turn has +their own subfield selections. You'll note that these are `Dict` requiring the user to provide all +required fields, rather than only one. + +The remaining step here is that the user must provide code that takes those validated configurated +files and produces an object of the expected type. In this case that would be the pandas DataFrame +type. The user can assume the value abides by the provided schema and that any and all default +values have been applied. + +Selectors are very commonly used for these type of schemas, so we've also provided an alternative +API that removes some boilerplate around manipulating the config_value dictionary. Instead, the +user-provided function takes the unpacked key and value of config_value directly, since in the +case of a selector, the config_value dictionary has only 1 (key, value) pair. + +.. literalinclude:: ../../../../../libraries/dagster-pandas/dagster_pandas/data_frame.py + :lines: 57-81 + +You'll note that we no longer need to manipulate the ``config_value`` dictionary. It grabs +that key and value for you and calls the provided function. + +Finally insert this into the original declaration: + +.. literalinclude:: ../../../../../libraries/dagster-pandas/dagster_pandas/data_frame.py + :lines: 84-92 + :emphasize-lines: 7 + +Now if you run a pipeline with this solid from dagit you will be able to provide sources for +these inputs via config: + +.. image:: types_figure_one.png + +Output Schema +^^^^^^^^^^^^^ + +We will add output schema now. They are similar to input schema, except that they are responsible +for taking the in-memory object flowed through your computation and materializing it to some +persistent store. Outputs are purely *optional* for any computation, whereas inputs *must* be provided +for a computation to proceed. You will likely want outputs as for a pipeline to be useful it +should produce some materialization that outlives the computation. + +.. literalinclude:: ../../../../../libraries/dagster-pandas/dagster_pandas/data_frame.py + :lines: 31-54 + +This has a similar aesthetic to an input schema but performs a different function. Notice that +it takes a third argument, ``pandas_df`` (it can be named anything), that is the value that was +outputted from the solid in question. It then takes the configuration data as "instructions" as to +how to materialize the value. + +One connects the output schema to the type as follows: + +.. literalinclude:: ../../../../../libraries/dagster-pandas/dagster_pandas/data_frame.py + :lines: 84-92 + :emphasize-lines: 8 + +Now we can provide a list of materializations to a given execution. + +.. image:: types_figure_two.png + +You'll note you can provide an arbitrary number of materializations. You can materialize any +given output any number of times in any number of formats. + +.. image:: types_figure_three.png +''' + +snapshots['test_build_all_docs 34'] = '''Unit-testing Pipelines +---------------------- + +Historically in production data engineering systems, unit testing data pipelines is quite difficult +to implement. As a result, it is frequently omitted from data engineering workflows, and pipelines +are instead tested end-to-end in a dev environment. + +One of the mechanisms included in dagster to enable testing has already been discussed: the +:doc:`Execution Context `. Recall that the context allows us to configure the +pipeline-level execution environment while keeping all of the code in our pipelines unchanged. + +The other important testing mechanism is the ability to execute arbitrary subsets of a DAG. (This +capability is useful for other use cases but we will focus on unit testing for now). + +Let's start where we left off. + +We have the following pipeline: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/unittesting.py + :linenos: + :caption: unittesting.py + :lines: 1-44 + +Let's say we wanted to test *one* of these solids in isolation. + +We want to do is isolate that solid and execute with inputs we +provide, instead of from solids upstream in the dependency graph. + +So let's do that. Follow along in the comments: + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/unittesting.py + :linenos: + :caption: unittesting.py + :lines: 47-52 + +We can also execute entire arbitrary subdags rather than a single solid using +the ``execute_solids`` function + + +.. literalinclude:: ../../../../dagster/tutorials/intro_tutorial/unittesting.py + :linenos: + :caption: unittesting.py + :lines: 55-63 +''' + +snapshots['test_build_all_docs 35'] = '''Reference +--------- +As you get started with Dagster, you'll find that there are a number of important concepts +underpinning the system. Some of these concepts, like `DAGs <#dag>`__, will undoubtably be familiar +if you've previously worked with tools like Airflow. However, Dagster has some important differences +from other workflow systems to facilitate operating at a higher level of abstraction. + +Solid +^^^^^ + +.. image:: solid.png + :scale: 40 % + :align: center + +A solid is a functional unit of computation with defined inputs and outputs. Solids can be strung +together into `pipelines <#pipeline>`__ by defining `dependencies <#dependency-definition>`__ +between their inputs and outputs. Solids are reusable and instances of a solid may appear many +times in a given pipeline, or across many different pipelines. + +Solids often wrap code written in or intended to execute in other systems (e.g., SQL statements, +Jupyter notebooks, or Spark jobs written in Scala), providing a common interface for defining, +orchestrating, and managing data processing applications with heterogeneous components. + +Solids can optionally define the types of their inputs and outputs, and can define a typed schema +so that their inputs can be read from external configuration files. Solids can also enforce +`expectations <#expectation>`__ on their inputs and outputs. + +Solids are defined using the :func:`@lambda_solid ` or +:func:`@solid ` decorators, or using the underlying +:class:`SolidDefinition ` class. These APIs wrap an underlying +`transform function`, making its metadata queryable by higher-level tools. + +Transform Function +^^^^^^^^^^^^^^^^^^ + +.. image:: transform_fn.png + :scale: 40 % + :align: center + +The user-supplied function which forms the heart of a solid definition. The transform functions are +the business logic defined by you as the user; this business logic is what will be executed when the +solid is invoked by the Dagster engine. + + +Result +^^^^^^ + +.. image:: result.png + :scale: 40 % + :align: center + +A result is how a solid's transform function communicates the value of an output, and its +name, to Dagster. + +Solid transform functions are expected to yield a stream of results. Implementers of a solid must +ensure their tranform yields :class:`Result ` objects. + +In the common case where only a single result is yielded, the machinery provides sugar allowing +the user to return a value instead of yielding it, and automatically wrapping the value in the +:class:`Result ` class. + +.. _dependency-definition: + +Dependency Definition +^^^^^^^^^^^^^^^^^^^^^ + +.. image:: dependency.png + :scale: 40 % + :align: center + +Solids are linked together into `pipelines <#pipeline>`__ by defining the dependencies between +their inputs and outputs. Dependencies are data-driven, not workflow-driven -- they define what +data is required for solids to execute, not how or when they execute. + +This reflects an important separation of concerns -- the same pipeline may have very different +execution semantics depending on the environment in which it runs or the way in which it is +scheduled, but these conditions should be expressed separately from its underlying structure. + +Dependencies are defined when constructing pipelines, using the +:class:`DependencyDefinition ` class. + +Intermediates +^^^^^^^^^^^^^ + +.. image:: materialization.png + :scale: 42 % + :align: center + +The intermediate outputs of solids in a pipeline can be materialized. The Dagster engine can +materialize outputs in a number of formats (e.g., json, pickle), and can store materialized +intermediates locally or in object stores such as S3 or GCS. + +Materialized intermediates make it possible to introspect the intermediate state of a pipeline +execution and ask questions like, "Exactly what output did this solid have on this particular run?" +This is useful when auditing or debugging pipelines, and makes it possible to establish the +`provenance` of data artifacts. + +Materialized intermediates also enable `partial re-execution` of pipelines "starting from" a +materialized state of the upstream execution. This is useful when a pipeline fails halfway through, +or in order to explore how new logic in part of a pipeline would have operated on outputs from +previous runs of the pipeline. + +Expectation +^^^^^^^^^^^ + +.. image:: expectation.png + :scale: 40 % + :align: center + +An expectation is a function that determines whether the input or output of a solid passes a +given condition -- for instance, that a value is non-null, or that it is distributed in a certain +way. + +Expectations can be used to enforce runtime data quality and integrity constraints, so that +pipelines fail early -- before any downstream solids execute on bad data. + +Expectations are defined using the :class:`ExpectationDefinition ` +class. We also provide a `thin wrapper `_ +around the `great_expectations `_ library +so you can use its existing repertoire of expectartions with Dagster. + +.. _pipeline: + +Pipeline +^^^^^^^^ + +.. image:: pipeline.png + :scale: 40 % + :align: center + +Data pipelines are directed acyclic graphs (DAGs) of solids -- that is, they are made up of a number +of solids which have data `dependencies <#dependency-definition>`__ on each other (but no circular +dependencies), along with a set of associated pipeline context definitions, which declare the various +environments in which a pipeline can execute. + +Pipelines are defined using the :class:`PipelineDefinition ` class, and +their contexts are defined using :class:`PipelineContextDefinition `. + +When a pipeline is combined with a given config conforming to one of its declared contexts, it can +be compiled by the Dagster engine into an execution plan that can be executed on various compute +substrates. + +Concretely, a pipeline might include context definitions for local testing (where databases and +other resources will be mocked, in-memory, or local) and for running in production (where resources +will require different credentials and expose configuration options). When a pipeline is compiled +with a config corresponding to one of these contexts, it yields an execution plan suitable for the +given environment. + +Resources +^^^^^^^^^ + +.. image:: resource.png + :scale: 40 % + :align: center + +Resources are pipeline-scoped and typically used to expose features of the execution environment +(like database connections) to solids during pipeline execution. Resources can also clean up +after execution resolves. They are typically defined using the :func:`@resource ` +decorator or using the :class:`ResourceDefinition` class directly. + +Repository +^^^^^^^^^^ + +.. image:: repository.png + :scale: 40 % + :align: center + +A repository is a collection of pipelines that can be made available to the Dagit UI and other +higher-level tools. Repositories are defined using the +:class:`RepositoryDefinition ` class, and made available to +higher-level tools with a special ``repository.yml`` file that tells the tools where to look for a +repository definition. + +Dagster Types +^^^^^^^^^^^^^ + +The Dagster type system allows authors of solids and pipelines to optionally and gradually define +the types of the data that flows between solids, and so to introduce compile-time and runtime checks +into their pipelines. + +Types also allow for custom materialization, and are typically defined using the +:func:`@dagster_type ` decorator or the +:func:`as_dagster_type ` API. It is also possible to inherit from +:class:`RuntimeType ` directly. + +Environment Config +^^^^^^^^^^^^^^^^^^ + +Environment config defines the external environment with which a pipeline will interact for a given +execution plan. Environment config can be used to change solid behavior, define pipeline- or +solid-scoped resources and data that will be available during execution, or even shim solid inputs. + +Environment config is complementary to data (solid inputs and outputs) -- think of inputs and +outputs as specifying `what` data a pipeline operates on, and config as specifying `how` it +operates. + +Concretely, imagine a pipeline of solids operating on a data warehouse. The solids might emit and +consume table partition IDs and aggregate statistics as inputs and outputs -- the data on which they +operate. Environment config might specify how to connect to the warehouse (so that the pipeline +could also operate against a local test database), how to log the results of intermediate +computations, or where to put artifacts like plots and summary tables. + +Configuration Schemas +^^^^^^^^^^^^^^^^^^^^^ + +Configuration schemas define how users can config pipelines (using either Python dicts, YAML, +or JSON). They tell the Dagster engine how to type check environment config provided in one of +these formats against the pipeline context and enable many errors to be caught with rich messaging +at compile time. + +Config fields are defined using the :class:`Field ` class. + +DAG +^^^ + +DAG is short for `directed acyclic graph`. In this context, we are concerned with graphs where the +nodes are computations and the edges are dependencies between those computations. The dependencies +are `directed` because the outputs of one computation are the inputs to another. +These graphs are `acyclic` because there are no circular dependencies -- in other words, the graph +has a clear beginning and end, and we can always figure out what order to execute its nodes in. + +Execution Plan +^^^^^^^^^^^^^^ +An execution plan is a concrete plan for executing a DAG of execution steps created by compiling a +pipeline and a config. The execution plan is aware of the topological ordering of the execution +steps, enabling physical execution on one of the available executor engines (e.g., in-process, +multiprocess, using Airflow). + +Users do not directly instantiate or manipulate execution plans. + +Execution Step +^^^^^^^^^^^^^^ + +Execution steps are concrete computations, one or more of which corresponds to a solid in a pipeline +that has been compiled with a config. Some execution steps are generated in order to compute the +core transform functions of solids, but execution steps may also be generated in order to +materialize outputs, check expectations against outputs, etc. + +Users do not directly instantiate or manipulate execution steps. + +Dagster Event +^^^^^^^^^^^^^ + +When a pipeline is executed, a stream of events communicate the progress of its execution. This +includes top level events when the pipeline starts and completes, when execution steps succeed, +fail, or are skipped due to upstream failures, and when outputs are generated and materialized. + +Users do not directly instantiate or manipulate Dagster events, but they are consumed by the GraphQL +interface that supports the Dagit tool. + +InputDefinition +^^^^^^^^^^^^^^^ + +Optionally typed definition of the data that a solid requires in order to execute. Defined inputs +may often also be shimmed through config. Inputs are defined using the +:class:`InputDefinition ` class, usually when defining a solid. + +OutputDefinition +^^^^^^^^^^^^^^^^ + +Optionally typed definition of the result that a solid will produce. Outputs are defined using the +:class:`OutputDefinition ` class, usually when defining a solid. +''' + +snapshots['test_build_all_docs 36'] = '''@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Roboto; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 80%; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 80%; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Roboto; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Roboto; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Roboto; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Roboto; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.8em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + \tdisplay: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + \tmargin-left: 0; + \tmargin-top: 0; + \tmargin-right: 0; + \tmargin-bottom: 0; + } + + div.bodywrapper { + \tmargin-top: 0; + \tmargin-right: 0; + \tmargin-bottom: 0; + \tmargin-left: 0; + } + + ul { + \tmargin-left: 0; + } + +\tli > ul { + /* Matches the 30px from the "ul, ol" selector above */ +\t\tmargin-left: 30px; +\t} + + .document { + \twidth: auto; + } + + .footer { + \twidth: auto; + } + + .bodywrapper { + \tmargin: 0; + } + + .footer { + \twidth: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +}''' + +snapshots['test_build_all_docs 37'] = '''/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: auto; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > p:first-child, +td > p:first-child { + margin-top: 0px; +} + +th > p:last-child, +td > p:last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +li > p:first-child { + margin-top: 0px; +} + +li > p:last-child { + margin-bottom: 0px; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: flex; + flex-wrap: wrap; +} + +dl.field-list > dt { + flex-basis: 20%; + font-weight: bold; + word-break: break-word; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + flex-basis: 70%; + padding-left: 1em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > p:first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +}''' + +snapshots['test_build_all_docs 38'] = '''/* This file intentionally left blank. */ +''' + +snapshots['test_build_all_docs 39'] = '''/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \\/]([\\w.]+)/.exec(ua) || + /(webkit)[ \\/]([\\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) || + /(msie) ([\\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $(\'\\u00B6\'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $(\'\\u00B6\'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $(\'\') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $(\'link[rel="prev"]\').prop(\'href\'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $(\'link[rel="next"]\').prop(\'href\'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); +''' + +snapshots['test_build_all_docs 40'] = '''var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute(\'data-url_root\'), + VERSION: '', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +};''' + +snapshots['test_build_all_docs 41'] = '''/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-03-20T18:59Z + */ +( function( global, factory ) { + +\t"use strict"; + +\tif ( typeof module === "object" && typeof module.exports === "object" ) { + +\t\t// For CommonJS and CommonJS-like environments where a proper `window` +\t\t// is present, execute the factory and get jQuery. +\t\t// For environments that do not have a `window` with a `document` +\t\t// (such as Node.js), expose a factory as module.exports. +\t\t// This accentuates the need for the creation of a real `window`. +\t\t// e.g. var jQuery = require("jquery")(window); +\t\t// See ticket #14549 for more info. +\t\tmodule.exports = global.document ? +\t\t\tfactory( global, true ) : +\t\t\tfunction( w ) { +\t\t\t\tif ( !w.document ) { +\t\t\t\t\tthrow new Error( "jQuery requires a window with a document" ); +\t\t\t\t} +\t\t\t\treturn factory( w ); +\t\t\t}; +\t} else { +\t\tfactory( global ); +\t} + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + +\tfunction DOMEval( code, doc ) { +\t\tdoc = doc || document; + +\t\tvar script = doc.createElement( "script" ); + +\t\tscript.text = code; +\t\tdoc.head.appendChild( script ).parentNode.removeChild( script ); +\t} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var +\tversion = "3.2.1", + +\t// Define a local copy of jQuery +\tjQuery = function( selector, context ) { + +\t\t// The jQuery object is actually just the init constructor 'enhanced' +\t\t// Need init if jQuery is called (just allow error to be thrown if not included) +\t\treturn new jQuery.fn.init( selector, context ); +\t}, + +\t// Support: Android <=4.0 only +\t// Make sure we trim BOM and NBSP +\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, + +\t// Matches dashed string for camelizing +\trmsPrefix = /^-ms-/, +\trdashAlpha = /-([a-z])/g, + +\t// Used by jQuery.camelCase as callback to replace() +\tfcamelCase = function( all, letter ) { +\t\treturn letter.toUpperCase(); +\t}; + +jQuery.fn = jQuery.prototype = { + +\t// The current version of jQuery being used +\tjquery: version, + +\tconstructor: jQuery, + +\t// The default length of a jQuery object is 0 +\tlength: 0, + +\ttoArray: function() { +\t\treturn slice.call( this ); +\t}, + +\t// Get the Nth element in the matched element set OR +\t// Get the whole matched element set as a clean array +\tget: function( num ) { + +\t\t// Return all the elements in a clean array +\t\tif ( num == null ) { +\t\t\treturn slice.call( this ); +\t\t} + +\t\t// Return just the one element from the set +\t\treturn num < 0 ? this[ num + this.length ] : this[ num ]; +\t}, + +\t// Take an array of elements and push it onto the stack +\t// (returning the new matched element set) +\tpushStack: function( elems ) { + +\t\t// Build a new jQuery matched element set +\t\tvar ret = jQuery.merge( this.constructor(), elems ); + +\t\t// Add the old object onto the stack (as a reference) +\t\tret.prevObject = this; + +\t\t// Return the newly-formed element set +\t\treturn ret; +\t}, + +\t// Execute a callback for every element in the matched set. +\teach: function( callback ) { +\t\treturn jQuery.each( this, callback ); +\t}, + +\tmap: function( callback ) { +\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) { +\t\t\treturn callback.call( elem, i, elem ); +\t\t} ) ); +\t}, + +\tslice: function() { +\t\treturn this.pushStack( slice.apply( this, arguments ) ); +\t}, + +\tfirst: function() { +\t\treturn this.eq( 0 ); +\t}, + +\tlast: function() { +\t\treturn this.eq( -1 ); +\t}, + +\teq: function( i ) { +\t\tvar len = this.length, +\t\t\tj = +i + ( i < 0 ? len : 0 ); +\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); +\t}, + +\tend: function() { +\t\treturn this.prevObject || this.constructor(); +\t}, + +\t// For internal use only. +\t// Behaves like an Array's method, not like a jQuery method. +\tpush: push, +\tsort: arr.sort, +\tsplice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { +\tvar options, name, src, copy, copyIsArray, clone, +\t\ttarget = arguments[ 0 ] || {}, +\t\ti = 1, +\t\tlength = arguments.length, +\t\tdeep = false; + +\t// Handle a deep copy situation +\tif ( typeof target === "boolean" ) { +\t\tdeep = target; + +\t\t// Skip the boolean and the target +\t\ttarget = arguments[ i ] || {}; +\t\ti++; +\t} + +\t// Handle case when target is a string or something (possible in deep copy) +\tif ( typeof target !== "object" && !jQuery.isFunction( target ) ) { +\t\ttarget = {}; +\t} + +\t// Extend jQuery itself if only one argument is passed +\tif ( i === length ) { +\t\ttarget = this; +\t\ti--; +\t} + +\tfor ( ; i < length; i++ ) { + +\t\t// Only deal with non-null/undefined values +\t\tif ( ( options = arguments[ i ] ) != null ) { + +\t\t\t// Extend the base object +\t\t\tfor ( name in options ) { +\t\t\t\tsrc = target[ name ]; +\t\t\t\tcopy = options[ name ]; + +\t\t\t\t// Prevent never-ending loop +\t\t\t\tif ( target === copy ) { +\t\t\t\t\tcontinue; +\t\t\t\t} + +\t\t\t\t// Recurse if we're merging plain objects or arrays +\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) || +\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) { + +\t\t\t\t\tif ( copyIsArray ) { +\t\t\t\t\t\tcopyIsArray = false; +\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : []; + +\t\t\t\t\t} else { +\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {}; +\t\t\t\t\t} + +\t\t\t\t\t// Never move original objects, clone them +\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy ); + +\t\t\t\t// Don't bring in undefined values +\t\t\t\t} else if ( copy !== undefined ) { +\t\t\t\t\ttarget[ name ] = copy; +\t\t\t\t} +\t\t\t} +\t\t} +\t} + +\t// Return the modified object +\treturn target; +}; + +jQuery.extend( { + +\t// Unique for each copy of jQuery on the page +\texpando: "jQuery" + ( version + Math.random() ).replace( /\\D/g, "" ), + +\t// Assume jQuery is ready without the ready module +\tisReady: true, + +\terror: function( msg ) { +\t\tthrow new Error( msg ); +\t}, + +\tnoop: function() {}, + +\tisFunction: function( obj ) { +\t\treturn jQuery.type( obj ) === "function"; +\t}, + +\tisWindow: function( obj ) { +\t\treturn obj != null && obj === obj.window; +\t}, + +\tisNumeric: function( obj ) { + +\t\t// As of jQuery 3.0, isNumeric is limited to +\t\t// strings and numbers (primitives or objects) +\t\t// that can be coerced to finite numbers (gh-2662) +\t\tvar type = jQuery.type( obj ); +\t\treturn ( type === "number" || type === "string" ) && + +\t\t\t// parseFloat NaNs numeric-cast false positives ("") +\t\t\t// ...but misinterprets leading-number strings, particularly hex literals ("0x...") +\t\t\t// subtraction forces infinities to NaN +\t\t\t!isNaN( obj - parseFloat( obj ) ); +\t}, + +\tisPlainObject: function( obj ) { +\t\tvar proto, Ctor; + +\t\t// Detect obvious negatives +\t\t// Use toString instead of jQuery.type to catch host objects +\t\tif ( !obj || toString.call( obj ) !== "[object Object]" ) { +\t\t\treturn false; +\t\t} + +\t\tproto = getProto( obj ); + +\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain +\t\tif ( !proto ) { +\t\t\treturn true; +\t\t} + +\t\t// Objects with prototype are plain iff they were constructed by a global Object function +\t\tCtor = hasOwn.call( proto, "constructor" ) && proto.constructor; +\t\treturn typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; +\t}, + +\tisEmptyObject: function( obj ) { + +\t\t/* eslint-disable no-unused-vars */ +\t\t// See https://github.com/eslint/eslint/issues/6125 +\t\tvar name; + +\t\tfor ( name in obj ) { +\t\t\treturn false; +\t\t} +\t\treturn true; +\t}, + +\ttype: function( obj ) { +\t\tif ( obj == null ) { +\t\t\treturn obj + ""; +\t\t} + +\t\t// Support: Android <=2.3 only (functionish RegExp) +\t\treturn typeof obj === "object" || typeof obj === "function" ? +\t\t\tclass2type[ toString.call( obj ) ] || "object" : +\t\t\ttypeof obj; +\t}, + +\t// Evaluates a script in a global context +\tglobalEval: function( code ) { +\t\tDOMEval( code ); +\t}, + +\t// Convert dashed to camelCase; used by the css and data modules +\t// Support: IE <=9 - 11, Edge 12 - 13 +\t// Microsoft forgot to hump their vendor prefix (#9572) +\tcamelCase: function( string ) { +\t\treturn string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +\t}, + +\teach: function( obj, callback ) { +\t\tvar length, i = 0; + +\t\tif ( isArrayLike( obj ) ) { +\t\t\tlength = obj.length; +\t\t\tfor ( ; i < length; i++ ) { +\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { +\t\t\t\t\tbreak; +\t\t\t\t} +\t\t\t} +\t\t} else { +\t\t\tfor ( i in obj ) { +\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { +\t\t\t\t\tbreak; +\t\t\t\t} +\t\t\t} +\t\t} + +\t\treturn obj; +\t}, + +\t// Support: Android <=4.0 only +\ttrim: function( text ) { +\t\treturn text == null ? +\t\t\t"" : +\t\t\t( text + "" ).replace( rtrim, "" ); +\t}, + +\t// results is for internal usage only +\tmakeArray: function( arr, results ) { +\t\tvar ret = results || []; + +\t\tif ( arr != null ) { +\t\t\tif ( isArrayLike( Object( arr ) ) ) { +\t\t\t\tjQuery.merge( ret, +\t\t\t\t\ttypeof arr === "string" ? +\t\t\t\t\t[ arr ] : arr +\t\t\t\t); +\t\t\t} else { +\t\t\t\tpush.call( ret, arr ); +\t\t\t} +\t\t} + +\t\treturn ret; +\t}, + +\tinArray: function( elem, arr, i ) { +\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i ); +\t}, + +\t// Support: Android <=4.0 only, PhantomJS 1 only +\t// push.apply(_, arraylike) throws on ancient WebKit +\tmerge: function( first, second ) { +\t\tvar len = +second.length, +\t\t\tj = 0, +\t\t\ti = first.length; + +\t\tfor ( ; j < len; j++ ) { +\t\t\tfirst[ i++ ] = second[ j ]; +\t\t} + +\t\tfirst.length = i; + +\t\treturn first; +\t}, + +\tgrep: function( elems, callback, invert ) { +\t\tvar callbackInverse, +\t\t\tmatches = [], +\t\t\ti = 0, +\t\t\tlength = elems.length, +\t\t\tcallbackExpect = !invert; + +\t\t// Go through the array, only saving the items +\t\t// that pass the validator function +\t\tfor ( ; i < length; i++ ) { +\t\t\tcallbackInverse = !callback( elems[ i ], i ); +\t\t\tif ( callbackInverse !== callbackExpect ) { +\t\t\t\tmatches.push( elems[ i ] ); +\t\t\t} +\t\t} + +\t\treturn matches; +\t}, + +\t// arg is for internal usage only +\tmap: function( elems, callback, arg ) { +\t\tvar length, value, +\t\t\ti = 0, +\t\t\tret = []; + +\t\t// Go through the array, translating each of the items to their new values +\t\tif ( isArrayLike( elems ) ) { +\t\t\tlength = elems.length; +\t\t\tfor ( ; i < length; i++ ) { +\t\t\t\tvalue = callback( elems[ i ], i, arg ); + +\t\t\t\tif ( value != null ) { +\t\t\t\t\tret.push( value ); +\t\t\t\t} +\t\t\t} + +\t\t// Go through every key on the object, +\t\t} else { +\t\t\tfor ( i in elems ) { +\t\t\t\tvalue = callback( elems[ i ], i, arg ); + +\t\t\t\tif ( value != null ) { +\t\t\t\t\tret.push( value ); +\t\t\t\t} +\t\t\t} +\t\t} + +\t\t// Flatten any nested arrays +\t\treturn concat.apply( [], ret ); +\t}, + +\t// A global GUID counter for objects +\tguid: 1, + +\t// Bind a function to a context, optionally partially applying any +\t// arguments. +\tproxy: function( fn, context ) { +\t\tvar tmp, args, proxy; + +\t\tif ( typeof context === "string" ) { +\t\t\ttmp = fn[ context ]; +\t\t\tcontext = fn; +\t\t\tfn = tmp; +\t\t} + +\t\t// Quick check to determine if target is callable, in the spec +\t\t// this throws a TypeError, but we will just return undefined. +\t\tif ( !jQuery.isFunction( fn ) ) { +\t\t\treturn undefined; +\t\t} + +\t\t// Simulated bind +\t\targs = slice.call( arguments, 2 ); +\t\tproxy = function() { +\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) ); +\t\t}; + +\t\t// Set the guid of unique handler to the same of original handler, so it can be removed +\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++; + +\t\treturn proxy; +\t}, + +\tnow: Date.now, + +\t// jQuery.support is not used in Core but other projects attach their +\t// properties to it so it needs to exist. +\tsupport: support +} ); + +if ( typeof Symbol === "function" ) { +\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { +\tclass2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + +\t// Support: real iOS 8.2 only (not reproducible in simulator) +\t// `in` check used to prevent JIT error (gh-2145) +\t// hasOwn isn't used here due to false negatives +\t// regarding Nodelist length in IE +\tvar length = !!obj && "length" in obj && obj.length, +\t\ttype = jQuery.type( obj ); + +\tif ( type === "function" || jQuery.isWindow( obj ) ) { +\t\treturn false; +\t} + +\treturn type === "array" || length === 0 || +\t\ttypeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, +\tsupport, +\tExpr, +\tgetText, +\tisXML, +\ttokenize, +\tcompile, +\tselect, +\toutermostContext, +\tsortInput, +\thasDuplicate, + +\t// Local document vars +\tsetDocument, +\tdocument, +\tdocElem, +\tdocumentIsHTML, +\trbuggyQSA, +\trbuggyMatches, +\tmatches, +\tcontains, + +\t// Instance-specific data +\texpando = "sizzle" + 1 * new Date(), +\tpreferredDoc = window.document, +\tdirruns = 0, +\tdone = 0, +\tclassCache = createCache(), +\ttokenCache = createCache(), +\tcompilerCache = createCache(), +\tsortOrder = function( a, b ) { +\t\tif ( a === b ) { +\t\t\thasDuplicate = true; +\t\t} +\t\treturn 0; +\t}, + +\t// Instance methods +\thasOwn = ({}).hasOwnProperty, +\tarr = [], +\tpop = arr.pop, +\tpush_native = arr.push, +\tpush = arr.push, +\tslice = arr.slice, +\t// Use a stripped-down indexOf as it's faster than native +\t// https://jsperf.com/thor-indexof-vs-for/5 +\tindexOf = function( list, elem ) { +\t\tvar i = 0, +\t\t\tlen = list.length; +\t\tfor ( ; i < len; i++ ) { +\t\t\tif ( list[i] === elem ) { +\t\t\t\treturn i; +\t\t\t} +\t\t} +\t\treturn -1; +\t}, + +\tbooleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + +\t// Regular expressions + +\t// http://www.w3.org/TR/css3-selectors/#whitespace +\twhitespace = "[\\\\x20\\\\t\\\\r\\\\n\\\\f]", + +\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier +\tidentifier = "(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+", + +\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors +\tattributes = "\\\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + +\t\t// Operator (capture 2) +\t\t"*([*^$|!~]?=)" + whitespace + +\t\t// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" +\t\t"*(?:\'((?:\\\\\\\\.|[^\\\\\\\\\'])*)\'|\\"((?:\\\\\\\\.|[^\\\\\\\\\\"])*)\\"|(" + identifier + "))|)" + whitespace + +\t\t"*\\\\]", + +\tpseudos = ":(" + identifier + ")(?:\\\\((" + +\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: +\t\t// 1. quoted (capture 3; capture 4 or capture 5) +\t\t"(\'((?:\\\\\\\\.|[^\\\\\\\\\'])*)\'|\\"((?:\\\\\\\\.|[^\\\\\\\\\\"])*)\\")|" + +\t\t// 2. simple (capture 6) +\t\t"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|" + attributes + ")*)|" + +\t\t// 3. anything else (capture 2) +\t\t".*" + +\t\t")\\\\)|)", + +\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter +\trwhitespace = new RegExp( whitespace + "+", "g" ), +\trtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)" + whitespace + "+$", "g" ), + +\trcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), +\trcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + +\trattributeQuotes = new RegExp( "=" + whitespace + "*([^\\\\]\'\\"]*?)" + whitespace + "*\\\\]", "g" ), + +\trpseudo = new RegExp( pseudos ), +\tridentifier = new RegExp( "^" + identifier + "$" ), + +\tmatchExpr = { +\t\t"ID": new RegExp( "^#(" + identifier + ")" ), +\t\t"CLASS": new RegExp( "^\\\\.(" + identifier + ")" ), +\t\t"TAG": new RegExp( "^(" + identifier + "|[*])" ), +\t\t"ATTR": new RegExp( "^" + attributes ), +\t\t"PSEUDO": new RegExp( "^" + pseudos ), +\t\t"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(" + whitespace + +\t\t\t"*(even|odd|(([+-]|)(\\\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + +\t\t\t"*(\\\\d+)|))" + whitespace + "*\\\\)|)", "i" ), +\t\t"bool": new RegExp( "^(?:" + booleans + ")$", "i" ), +\t\t// For use in libraries implementing .is() +\t\t// We use this for POS matching in `select` +\t\t"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(" + +\t\t\twhitespace + "*((?:-\\\\d)?\\\\d*)" + whitespace + "*\\\\)|)(?=[^-]|$)", "i" ) +\t}, + +\trinputs = /^(?:input|select|textarea|button)$/i, +\trheader = /^h\\d$/i, + +\trnative = /^[^{]+\\{\\s*\\[native \\w/, + +\t// Easily-parseable/retrievable ID or TAG or CLASS selectors +\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/, + +\trsibling = /[+~]/, + +\t// CSS escapes +\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters +\trunescape = new RegExp( "\\\\\\\\([\\\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), +\tfunescape = function( _, escaped, escapedWhitespace ) { +\t\tvar high = "0x" + escaped - 0x10000; +\t\t// NaN means non-codepoint +\t\t// Support: Firefox<24 +\t\t// Workaround erroneous numeric interpretation of +"0x" +\t\treturn high !== high || escapedWhitespace ? +\t\t\tescaped : +\t\t\thigh < 0 ? +\t\t\t\t// BMP codepoint +\t\t\t\tString.fromCharCode( high + 0x10000 ) : +\t\t\t\t// Supplemental Plane codepoint (surrogate pair) +\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); +\t}, + +\t// CSS string/identifier serialization +\t// https://drafts.csswg.org/cssom/#common-serializing-idioms +\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g, +\tfcssescape = function( ch, asCodePoint ) { +\t\tif ( asCodePoint ) { + +\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER +\t\t\tif ( ch === "\\0" ) { +\t\t\t\treturn "\\uFFFD"; +\t\t\t} + +\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points +\t\t\treturn ch.slice( 0, -1 ) + "\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; +\t\t} + +\t\t// Other potentially-special ASCII characters get backslash-escaped +\t\treturn "\\\\" + ch; +\t}, + +\t// Used for iframes +\t// See setDocument() +\t// Removing the function wrapper causes a "Permission Denied" +\t// error in IE +\tunloadHandler = function() { +\t\tsetDocument(); +\t}, + +\tdisabledAncestor = addCombinator( +\t\tfunction( elem ) { +\t\t\treturn elem.disabled === true && ("form" in elem || "label" in elem); +\t\t}, +\t\t{ dir: "parentNode", next: "legend" } +\t); + +// Optimize for push.apply( _, NodeList ) +try { +\tpush.apply( +\t\t(arr = slice.call( preferredDoc.childNodes )), +\t\tpreferredDoc.childNodes +\t); +\t// Support: Android<4.0 +\t// Detect silently failing push.apply +\tarr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { +\tpush = { apply: arr.length ? + +\t\t// Leverage slice if possible +\t\tfunction( target, els ) { +\t\t\tpush_native.apply( target, slice.call(els) ); +\t\t} : + +\t\t// Support: IE<9 +\t\t// Otherwise append directly +\t\tfunction( target, els ) { +\t\t\tvar j = target.length, +\t\t\t\ti = 0; +\t\t\t// Can't trust NodeList.length +\t\t\twhile ( (target[j++] = els[i++]) ) {} +\t\t\ttarget.length = j - 1; +\t\t} +\t}; +} + +function Sizzle( selector, context, results, seed ) { +\tvar m, i, elem, nid, match, groups, newSelector, +\t\tnewContext = context && context.ownerDocument, + +\t\t// nodeType defaults to 9, since context defaults to document +\t\tnodeType = context ? context.nodeType : 9; + +\tresults = results || []; + +\t// Return early from calls with invalid selector or context +\tif ( typeof selector !== "string" || !selector || +\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + +\t\treturn results; +\t} + +\t// Try to shortcut find operations (as opposed to filters) in HTML documents +\tif ( !seed ) { + +\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { +\t\t\tsetDocument( context ); +\t\t} +\t\tcontext = context || document; + +\t\tif ( documentIsHTML ) { + +\t\t\t// If the selector is sufficiently simple, try using a "get*By*" DOM method +\t\t\t// (excepting DocumentFragment context, where the methods don't exist) +\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + +\t\t\t\t// ID selector +\t\t\t\tif ( (m = match[1]) ) { + +\t\t\t\t\t// Document context +\t\t\t\t\tif ( nodeType === 9 ) { +\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) { + +\t\t\t\t\t\t\t// Support: IE, Opera, Webkit +\t\t\t\t\t\t\t// TODO: identify versions +\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID +\t\t\t\t\t\t\tif ( elem.id === m ) { +\t\t\t\t\t\t\t\tresults.push( elem ); +\t\t\t\t\t\t\t\treturn results; +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} else { +\t\t\t\t\t\t\treturn results; +\t\t\t\t\t\t} + +\t\t\t\t\t// Element context +\t\t\t\t\t} else { + +\t\t\t\t\t\t// Support: IE, Opera, Webkit +\t\t\t\t\t\t// TODO: identify versions +\t\t\t\t\t\t// getElementById can match elements by name instead of ID +\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) && +\t\t\t\t\t\t\tcontains( context, elem ) && +\t\t\t\t\t\t\telem.id === m ) { + +\t\t\t\t\t\t\tresults.push( elem ); +\t\t\t\t\t\t\treturn results; +\t\t\t\t\t\t} +\t\t\t\t\t} + +\t\t\t\t// Type selector +\t\t\t\t} else if ( match[2] ) { +\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) ); +\t\t\t\t\treturn results; + +\t\t\t\t// Class selector +\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && +\t\t\t\t\tcontext.getElementsByClassName ) { + +\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) ); +\t\t\t\t\treturn results; +\t\t\t\t} +\t\t\t} + +\t\t\t// Take advantage of querySelectorAll +\t\t\tif ( support.qsa && +\t\t\t\t!compilerCache[ selector + " " ] && +\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + +\t\t\t\tif ( nodeType !== 1 ) { +\t\t\t\t\tnewContext = context; +\t\t\t\t\tnewSelector = selector; + +\t\t\t\t// qSA looks outside Element context, which is not what we want +\t\t\t\t// Thanks to Andrew Dupont for this workaround technique +\t\t\t\t// Support: IE <=8 +\t\t\t\t// Exclude object elements +\t\t\t\t} else if ( context.nodeName.toLowerCase() !== "object" ) { + +\t\t\t\t\t// Capture the context ID, setting it first if necessary +\t\t\t\t\tif ( (nid = context.getAttribute( "id" )) ) { +\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape ); +\t\t\t\t\t} else { +\t\t\t\t\t\tcontext.setAttribute( "id", (nid = expando) ); +\t\t\t\t\t} + +\t\t\t\t\t// Prefix every selector in the list +\t\t\t\t\tgroups = tokenize( selector ); +\t\t\t\t\ti = groups.length; +\t\t\t\t\twhile ( i-- ) { +\t\t\t\t\t\tgroups[i] = "#" + nid + " " + toSelector( groups[i] ); +\t\t\t\t\t} +\t\t\t\t\tnewSelector = groups.join( "," ); + +\t\t\t\t\t// Expand context for sibling selectors +\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || +\t\t\t\t\t\tcontext; +\t\t\t\t} + +\t\t\t\tif ( newSelector ) { +\t\t\t\t\ttry { +\t\t\t\t\t\tpush.apply( results, +\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector ) +\t\t\t\t\t\t); +\t\t\t\t\t\treturn results; +\t\t\t\t\t} catch ( qsaError ) { +\t\t\t\t\t} finally { +\t\t\t\t\t\tif ( nid === expando ) { +\t\t\t\t\t\t\tcontext.removeAttribute( "id" ); +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} +\t} + +\t// All others +\treturn select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + *\tdeleting the oldest entry + */ +function createCache() { +\tvar keys = []; + +\tfunction cache( key, value ) { +\t\t// Use (key + " ") to avoid collision with native prototype properties (see Issue #157) +\t\tif ( keys.push( key + " " ) > Expr.cacheLength ) { +\t\t\t// Only keep the most recent entries +\t\t\tdelete cache[ keys.shift() ]; +\t\t} +\t\treturn (cache[ key + " " ] = value); +\t} +\treturn cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { +\tfn[ expando ] = true; +\treturn fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { +\tvar el = document.createElement("fieldset"); + +\ttry { +\t\treturn !!fn( el ); +\t} catch (e) { +\t\treturn false; +\t} finally { +\t\t// Remove from its parent by default +\t\tif ( el.parentNode ) { +\t\t\tel.parentNode.removeChild( el ); +\t\t} +\t\t// release memory in IE +\t\tel = null; +\t} +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { +\tvar arr = attrs.split("|"), +\t\ti = arr.length; + +\twhile ( i-- ) { +\t\tExpr.attrHandle[ arr[i] ] = handler; +\t} +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { +\tvar cur = b && a, +\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 && +\t\t\ta.sourceIndex - b.sourceIndex; + +\t// Use IE sourceIndex if available on both nodes +\tif ( diff ) { +\t\treturn diff; +\t} + +\t// Check if b follows a +\tif ( cur ) { +\t\twhile ( (cur = cur.nextSibling) ) { +\t\t\tif ( cur === b ) { +\t\t\t\treturn -1; +\t\t\t} +\t\t} +\t} + +\treturn a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { +\treturn function( elem ) { +\t\tvar name = elem.nodeName.toLowerCase(); +\t\treturn name === "input" && elem.type === type; +\t}; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { +\treturn function( elem ) { +\t\tvar name = elem.nodeName.toLowerCase(); +\t\treturn (name === "input" || name === "button") && elem.type === type; +\t}; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + +\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable +\treturn function( elem ) { + +\t\t// Only certain elements can match :enabled or :disabled +\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled +\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled +\t\tif ( "form" in elem ) { + +\t\t\t// Check for inherited disabledness on relevant non-disabled elements: +\t\t\t// * listed form-associated elements in a disabled fieldset +\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed +\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled +\t\t\t// * option elements in a disabled optgroup +\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled +\t\t\t// All such elements have a "form" property. +\t\t\tif ( elem.parentNode && elem.disabled === false ) { + +\t\t\t\t// Option elements defer to a parent optgroup if present +\t\t\t\tif ( "label" in elem ) { +\t\t\t\t\tif ( "label" in elem.parentNode ) { +\t\t\t\t\t\treturn elem.parentNode.disabled === disabled; +\t\t\t\t\t} else { +\t\t\t\t\t\treturn elem.disabled === disabled; +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\t// Support: IE 6 - 11 +\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors +\t\t\t\treturn elem.isDisabled === disabled || + +\t\t\t\t\t// Where there is no isDisabled, check manually +\t\t\t\t\t/* jshint -W018 */ +\t\t\t\t\telem.isDisabled !== !disabled && +\t\t\t\t\t\tdisabledAncestor( elem ) === disabled; +\t\t\t} + +\t\t\treturn elem.disabled === disabled; + +\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property. +\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't +\t\t// even exist on them, let alone have a boolean value. +\t\t} else if ( "label" in elem ) { +\t\t\treturn elem.disabled === disabled; +\t\t} + +\t\t// Remaining elements are neither :enabled nor :disabled +\t\treturn false; +\t}; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { +\treturn markFunction(function( argument ) { +\t\targument = +argument; +\t\treturn markFunction(function( seed, matches ) { +\t\t\tvar j, +\t\t\t\tmatchIndexes = fn( [], seed.length, argument ), +\t\t\t\ti = matchIndexes.length; + +\t\t\t// Match elements found at the specified indexes +\t\t\twhile ( i-- ) { +\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) { +\t\t\t\t\tseed[j] = !(matches[j] = seed[j]); +\t\t\t\t} +\t\t\t} +\t\t}); +\t}); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { +\treturn context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { +\t// documentElement is verified for cases where it doesn't yet exist +\t// (such as loading iframes in IE - #4833) +\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement; +\treturn documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { +\tvar hasCompare, subWindow, +\t\tdoc = node ? node.ownerDocument || node : preferredDoc; + +\t// Return early if doc is invalid or already selected +\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { +\t\treturn document; +\t} + +\t// Update global variables +\tdocument = doc; +\tdocElem = document.documentElement; +\tdocumentIsHTML = !isXML( document ); + +\t// Support: IE 9-11, Edge +\t// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) +\tif ( preferredDoc !== document && +\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) { + +\t\t// Support: IE 11, Edge +\t\tif ( subWindow.addEventListener ) { +\t\t\tsubWindow.addEventListener( "unload", unloadHandler, false ); + +\t\t// Support: IE 9 - 10 only +\t\t} else if ( subWindow.attachEvent ) { +\t\t\tsubWindow.attachEvent( "onunload", unloadHandler ); +\t\t} +\t} + +\t/* Attributes +\t---------------------------------------------------------------------- */ + +\t// Support: IE<8 +\t// Verify that getAttribute really returns attributes and not properties +\t// (excepting IE8 booleans) +\tsupport.attributes = assert(function( el ) { +\t\tel.className = "i"; +\t\treturn !el.getAttribute("className"); +\t}); + +\t/* getElement(s)By* +\t---------------------------------------------------------------------- */ + +\t// Check if getElementsByTagName("*") returns only elements +\tsupport.getElementsByTagName = assert(function( el ) { +\t\tel.appendChild( document.createComment("") ); +\t\treturn !el.getElementsByTagName("*").length; +\t}); + +\t// Support: IE<9 +\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName ); + +\t// Support: IE<10 +\t// Check if getElementById returns elements by name +\t// The broken getElementById methods don't pick up programmatically-set names, +\t// so use a roundabout getElementsByName test +\tsupport.getById = assert(function( el ) { +\t\tdocElem.appendChild( el ).id = expando; +\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length; +\t}); + +\t// ID filter and find +\tif ( support.getById ) { +\t\tExpr.filter["ID"] = function( id ) { +\t\t\tvar attrId = id.replace( runescape, funescape ); +\t\t\treturn function( elem ) { +\t\t\t\treturn elem.getAttribute("id") === attrId; +\t\t\t}; +\t\t}; +\t\tExpr.find["ID"] = function( id, context ) { +\t\t\tif ( typeof context.getElementById !== "undefined" && documentIsHTML ) { +\t\t\t\tvar elem = context.getElementById( id ); +\t\t\t\treturn elem ? [ elem ] : []; +\t\t\t} +\t\t}; +\t} else { +\t\tExpr.filter["ID"] = function( id ) { +\t\t\tvar attrId = id.replace( runescape, funescape ); +\t\t\treturn function( elem ) { +\t\t\t\tvar node = typeof elem.getAttributeNode !== "undefined" && +\t\t\t\t\telem.getAttributeNode("id"); +\t\t\t\treturn node && node.value === attrId; +\t\t\t}; +\t\t}; + +\t\t// Support: IE 6 - 7 only +\t\t// getElementById is not reliable as a find shortcut +\t\tExpr.find["ID"] = function( id, context ) { +\t\t\tif ( typeof context.getElementById !== "undefined" && documentIsHTML ) { +\t\t\t\tvar node, i, elems, +\t\t\t\t\telem = context.getElementById( id ); + +\t\t\t\tif ( elem ) { + +\t\t\t\t\t// Verify the id attribute +\t\t\t\t\tnode = elem.getAttributeNode("id"); +\t\t\t\t\tif ( node && node.value === id ) { +\t\t\t\t\t\treturn [ elem ]; +\t\t\t\t\t} + +\t\t\t\t\t// Fall back on getElementsByName +\t\t\t\t\telems = context.getElementsByName( id ); +\t\t\t\t\ti = 0; +\t\t\t\t\twhile ( (elem = elems[i++]) ) { +\t\t\t\t\t\tnode = elem.getAttributeNode("id"); +\t\t\t\t\t\tif ( node && node.value === id ) { +\t\t\t\t\t\t\treturn [ elem ]; +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\treturn []; +\t\t\t} +\t\t}; +\t} + +\t// Tag +\tExpr.find["TAG"] = support.getElementsByTagName ? +\t\tfunction( tag, context ) { +\t\t\tif ( typeof context.getElementsByTagName !== "undefined" ) { +\t\t\t\treturn context.getElementsByTagName( tag ); + +\t\t\t// DocumentFragment nodes don't have gEBTN +\t\t\t} else if ( support.qsa ) { +\t\t\t\treturn context.querySelectorAll( tag ); +\t\t\t} +\t\t} : + +\t\tfunction( tag, context ) { +\t\t\tvar elem, +\t\t\t\ttmp = [], +\t\t\t\ti = 0, +\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too +\t\t\t\tresults = context.getElementsByTagName( tag ); + +\t\t\t// Filter out possible comments +\t\t\tif ( tag === "*" ) { +\t\t\t\twhile ( (elem = results[i++]) ) { +\t\t\t\t\tif ( elem.nodeType === 1 ) { +\t\t\t\t\t\ttmp.push( elem ); +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\treturn tmp; +\t\t\t} +\t\t\treturn results; +\t\t}; + +\t// Class +\tExpr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { +\t\tif ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { +\t\t\treturn context.getElementsByClassName( className ); +\t\t} +\t}; + +\t/* QSA/matchesSelector +\t---------------------------------------------------------------------- */ + +\t// QSA and matchesSelector support + +\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5) +\trbuggyMatches = []; + +\t// qSa(:focus) reports false when true (Chrome 21) +\t// We allow this because of a bug in IE8/9 that throws an error +\t// whenever `document.activeElement` is accessed on an iframe +\t// So, we allow :focus to pass through QSA all the time to avoid the IE error +\t// See https://bugs.jquery.com/ticket/13378 +\trbuggyQSA = []; + +\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) { +\t\t// Build QSA regex +\t\t// Regex strategy adopted from Diego Perini +\t\tassert(function( el ) { +\t\t\t// Select is set to empty string on purpose +\t\t\t// This is to test IE's treatment of not explicitly +\t\t\t// setting a boolean content attribute, +\t\t\t// since its presence should be enough +\t\t\t// https://bugs.jquery.com/ticket/12359 +\t\t\tdocElem.appendChild( el ).innerHTML = "" + +\t\t\t\t""; + +\t\t\t// Support: IE8, Opera 11-12.16 +\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *= +\t\t\t// The test attribute must be unknown in Opera but "safe" for WinRT +\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section +\t\t\tif ( el.querySelectorAll("[msallowcapture^=\'\']").length ) { +\t\t\t\trbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\'\'|\\"\\")" ); +\t\t\t} + +\t\t\t// Support: IE8 +\t\t\t// Boolean attributes and "value" are not treated correctly +\t\t\tif ( !el.querySelectorAll("[selected]").length ) { +\t\t\t\trbuggyQSA.push( "\\\\[" + whitespace + "*(?:value|" + booleans + ")" ); +\t\t\t} + +\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ +\t\t\tif ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { +\t\t\t\trbuggyQSA.push("~="); +\t\t\t} + +\t\t\t// Webkit/Opera - :checked should return selected option elements +\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked +\t\t\t// IE8 throws error here and will not see later tests +\t\t\tif ( !el.querySelectorAll(":checked").length ) { +\t\t\t\trbuggyQSA.push(":checked"); +\t\t\t} + +\t\t\t// Support: Safari 8+, iOS 8+ +\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851 +\t\t\t// In-page `selector#id sibling-combinator selector` fails +\t\t\tif ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { +\t\t\t\trbuggyQSA.push(".#.+[+~]"); +\t\t\t} +\t\t}); + +\t\tassert(function( el ) { +\t\t\tel.innerHTML = "" + +\t\t\t\t""; + +\t\t\t// Support: Windows 8 Native Apps +\t\t\t// The type and name attributes are restricted during .innerHTML assignment +\t\t\tvar input = document.createElement("input"); +\t\t\tinput.setAttribute( "type", "hidden" ); +\t\t\tel.appendChild( input ).setAttribute( "name", "D" ); + +\t\t\t// Support: IE8 +\t\t\t// Enforce case-sensitivity of name attribute +\t\t\tif ( el.querySelectorAll("[name=d]").length ) { +\t\t\t\trbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); +\t\t\t} + +\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) +\t\t\t// IE8 throws error here and will not see later tests +\t\t\tif ( el.querySelectorAll(":enabled").length !== 2 ) { +\t\t\t\trbuggyQSA.push( ":enabled", ":disabled" ); +\t\t\t} + +\t\t\t// Support: IE9-11+ +\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets +\t\t\tdocElem.appendChild( el ).disabled = true; +\t\t\tif ( el.querySelectorAll(":disabled").length !== 2 ) { +\t\t\t\trbuggyQSA.push( ":enabled", ":disabled" ); +\t\t\t} + +\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos +\t\t\tel.querySelectorAll("*,:x"); +\t\t\trbuggyQSA.push(",.*:"); +\t\t}); +\t} + +\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches || +\t\tdocElem.webkitMatchesSelector || +\t\tdocElem.mozMatchesSelector || +\t\tdocElem.oMatchesSelector || +\t\tdocElem.msMatchesSelector) )) ) { + +\t\tassert(function( el ) { +\t\t\t// Check to see if it's possible to do matchesSelector +\t\t\t// on a disconnected node (IE 9) +\t\t\tsupport.disconnectedMatch = matches.call( el, "*" ); + +\t\t\t// This should fail with an exception +\t\t\t// Gecko does not error, returns false instead +\t\t\tmatches.call( el, "[s!=\'\']:x" ); +\t\t\trbuggyMatches.push( "!=", pseudos ); +\t\t}); +\t} + +\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); +\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + +\t/* Contains +\t---------------------------------------------------------------------- */ +\thasCompare = rnative.test( docElem.compareDocumentPosition ); + +\t// Element contains another +\t// Purposefully self-exclusive +\t// As in, an element does not contain itself +\tcontains = hasCompare || rnative.test( docElem.contains ) ? +\t\tfunction( a, b ) { +\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a, +\t\t\t\tbup = b && b.parentNode; +\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && ( +\t\t\t\tadown.contains ? +\t\t\t\t\tadown.contains( bup ) : +\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 +\t\t\t)); +\t\t} : +\t\tfunction( a, b ) { +\t\t\tif ( b ) { +\t\t\t\twhile ( (b = b.parentNode) ) { +\t\t\t\t\tif ( b === a ) { +\t\t\t\t\t\treturn true; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t\treturn false; +\t\t}; + +\t/* Sorting +\t---------------------------------------------------------------------- */ + +\t// Document order sorting +\tsortOrder = hasCompare ? +\tfunction( a, b ) { + +\t\t// Flag for duplicate removal +\t\tif ( a === b ) { +\t\t\thasDuplicate = true; +\t\t\treturn 0; +\t\t} + +\t\t// Sort on method existence if only one input has compareDocumentPosition +\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition; +\t\tif ( compare ) { +\t\t\treturn compare; +\t\t} + +\t\t// Calculate position if both inputs belong to the same document +\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? +\t\t\ta.compareDocumentPosition( b ) : + +\t\t\t// Otherwise we know they are disconnected +\t\t\t1; + +\t\t// Disconnected nodes +\t\tif ( compare & 1 || +\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + +\t\t\t// Choose the first element that is related to our preferred document +\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { +\t\t\t\treturn -1; +\t\t\t} +\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { +\t\t\t\treturn 1; +\t\t\t} + +\t\t\t// Maintain original order +\t\t\treturn sortInput ? +\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : +\t\t\t\t0; +\t\t} + +\t\treturn compare & 4 ? -1 : 1; +\t} : +\tfunction( a, b ) { +\t\t// Exit early if the nodes are identical +\t\tif ( a === b ) { +\t\t\thasDuplicate = true; +\t\t\treturn 0; +\t\t} + +\t\tvar cur, +\t\t\ti = 0, +\t\t\taup = a.parentNode, +\t\t\tbup = b.parentNode, +\t\t\tap = [ a ], +\t\t\tbp = [ b ]; + +\t\t// Parentless nodes are either documents or disconnected +\t\tif ( !aup || !bup ) { +\t\t\treturn a === document ? -1 : +\t\t\t\tb === document ? 1 : +\t\t\t\taup ? -1 : +\t\t\t\tbup ? 1 : +\t\t\t\tsortInput ? +\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : +\t\t\t\t0; + +\t\t// If the nodes are siblings, we can do a quick check +\t\t} else if ( aup === bup ) { +\t\t\treturn siblingCheck( a, b ); +\t\t} + +\t\t// Otherwise we need full lists of their ancestors for comparison +\t\tcur = a; +\t\twhile ( (cur = cur.parentNode) ) { +\t\t\tap.unshift( cur ); +\t\t} +\t\tcur = b; +\t\twhile ( (cur = cur.parentNode) ) { +\t\t\tbp.unshift( cur ); +\t\t} + +\t\t// Walk down the tree looking for a discrepancy +\t\twhile ( ap[i] === bp[i] ) { +\t\t\ti++; +\t\t} + +\t\treturn i ? +\t\t\t// Do a sibling check if the nodes have a common ancestor +\t\t\tsiblingCheck( ap[i], bp[i] ) : + +\t\t\t// Otherwise nodes in our document sort first +\t\t\tap[i] === preferredDoc ? -1 : +\t\t\tbp[i] === preferredDoc ? 1 : +\t\t\t0; +\t}; + +\treturn document; +}; + +Sizzle.matches = function( expr, elements ) { +\treturn Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { +\t// Set document vars if needed +\tif ( ( elem.ownerDocument || elem ) !== document ) { +\t\tsetDocument( elem ); +\t} + +\t// Make sure that attribute selectors are quoted +\texpr = expr.replace( rattributeQuotes, "=\'$1\']" ); + +\tif ( support.matchesSelector && documentIsHTML && +\t\t!compilerCache[ expr + " " ] && +\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && +\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + +\t\ttry { +\t\t\tvar ret = matches.call( elem, expr ); + +\t\t\t// IE 9's matchesSelector returns false on disconnected nodes +\t\t\tif ( ret || support.disconnectedMatch || +\t\t\t\t\t// As well, disconnected nodes are said to be in a document +\t\t\t\t\t// fragment in IE 9 +\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) { +\t\t\t\treturn ret; +\t\t\t} +\t\t} catch (e) {} +\t} + +\treturn Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { +\t// Set document vars if needed +\tif ( ( context.ownerDocument || context ) !== document ) { +\t\tsetDocument( context ); +\t} +\treturn contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { +\t// Set document vars if needed +\tif ( ( elem.ownerDocument || elem ) !== document ) { +\t\tsetDocument( elem ); +\t} + +\tvar fn = Expr.attrHandle[ name.toLowerCase() ], +\t\t// Don't get fooled by Object.prototype properties (jQuery #13807) +\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? +\t\t\tfn( elem, name, !documentIsHTML ) : +\t\t\tundefined; + +\treturn val !== undefined ? +\t\tval : +\t\tsupport.attributes || !documentIsHTML ? +\t\t\telem.getAttribute( name ) : +\t\t\t(val = elem.getAttributeNode(name)) && val.specified ? +\t\t\t\tval.value : +\t\t\t\tnull; +}; + +Sizzle.escape = function( sel ) { +\treturn (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { +\tthrow new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { +\tvar elem, +\t\tduplicates = [], +\t\tj = 0, +\t\ti = 0; + +\t// Unless we *know* we can detect duplicates, assume their presence +\thasDuplicate = !support.detectDuplicates; +\tsortInput = !support.sortStable && results.slice( 0 ); +\tresults.sort( sortOrder ); + +\tif ( hasDuplicate ) { +\t\twhile ( (elem = results[i++]) ) { +\t\t\tif ( elem === results[ i ] ) { +\t\t\t\tj = duplicates.push( i ); +\t\t\t} +\t\t} +\t\twhile ( j-- ) { +\t\t\tresults.splice( duplicates[ j ], 1 ); +\t\t} +\t} + +\t// Clear input after sorting to release objects +\t// See https://github.com/jquery/sizzle/pull/225 +\tsortInput = null; + +\treturn results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { +\tvar node, +\t\tret = "", +\t\ti = 0, +\t\tnodeType = elem.nodeType; + +\tif ( !nodeType ) { +\t\t// If no nodeType, this is expected to be an array +\t\twhile ( (node = elem[i++]) ) { +\t\t\t// Do not traverse comment nodes +\t\t\tret += getText( node ); +\t\t} +\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { +\t\t// Use textContent for elements +\t\t// innerText usage removed for consistency of new lines (jQuery #11153) +\t\tif ( typeof elem.textContent === "string" ) { +\t\t\treturn elem.textContent; +\t\t} else { +\t\t\t// Traverse its children +\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { +\t\t\t\tret += getText( elem ); +\t\t\t} +\t\t} +\t} else if ( nodeType === 3 || nodeType === 4 ) { +\t\treturn elem.nodeValue; +\t} +\t// Do not include comment or processing instruction nodes + +\treturn ret; +}; + +Expr = Sizzle.selectors = { + +\t// Can be adjusted by the user +\tcacheLength: 50, + +\tcreatePseudo: markFunction, + +\tmatch: matchExpr, + +\tattrHandle: {}, + +\tfind: {}, + +\trelative: { +\t\t">": { dir: "parentNode", first: true }, +\t\t" ": { dir: "parentNode" }, +\t\t"+": { dir: "previousSibling", first: true }, +\t\t"~": { dir: "previousSibling" } +\t}, + +\tpreFilter: { +\t\t"ATTR": function( match ) { +\t\t\tmatch[1] = match[1].replace( runescape, funescape ); + +\t\t\t// Move the given value to match[3] whether quoted or unquoted +\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + +\t\t\tif ( match[2] === "~=" ) { +\t\t\t\tmatch[3] = " " + match[3] + " "; +\t\t\t} + +\t\t\treturn match.slice( 0, 4 ); +\t\t}, + +\t\t"CHILD": function( match ) { +\t\t\t/* matches from matchExpr["CHILD"] +\t\t\t\t1 type (only|nth|...) +\t\t\t\t2 what (child|of-type) +\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...) +\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|) +\t\t\t\t5 sign of xn-component +\t\t\t\t6 x of xn-component +\t\t\t\t7 sign of y-component +\t\t\t\t8 y of y-component +\t\t\t*/ +\t\t\tmatch[1] = match[1].toLowerCase(); + +\t\t\tif ( match[1].slice( 0, 3 ) === "nth" ) { +\t\t\t\t// nth-* requires argument +\t\t\t\tif ( !match[3] ) { +\t\t\t\t\tSizzle.error( match[0] ); +\t\t\t\t} + +\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD +\t\t\t\t// remember that false/true cast respectively to 0/1 +\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); +\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + +\t\t\t// other types prohibit arguments +\t\t\t} else if ( match[3] ) { +\t\t\t\tSizzle.error( match[0] ); +\t\t\t} + +\t\t\treturn match; +\t\t}, + +\t\t"PSEUDO": function( match ) { +\t\t\tvar excess, +\t\t\t\tunquoted = !match[6] && match[2]; + +\t\t\tif ( matchExpr["CHILD"].test( match[0] ) ) { +\t\t\t\treturn null; +\t\t\t} + +\t\t\t// Accept quoted arguments as-is +\t\t\tif ( match[3] ) { +\t\t\t\tmatch[2] = match[4] || match[5] || ""; + +\t\t\t// Strip excess characters from unquoted arguments +\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) && +\t\t\t\t// Get excess from tokenize (recursively) +\t\t\t\t(excess = tokenize( unquoted, true )) && +\t\t\t\t// advance to the next closing parenthesis +\t\t\t\t(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + +\t\t\t\t// excess is a negative index +\t\t\t\tmatch[0] = match[0].slice( 0, excess ); +\t\t\t\tmatch[2] = unquoted.slice( 0, excess ); +\t\t\t} + +\t\t\t// Return only captures needed by the pseudo filter method (type and argument) +\t\t\treturn match.slice( 0, 3 ); +\t\t} +\t}, + +\tfilter: { + +\t\t"TAG": function( nodeNameSelector ) { +\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); +\t\t\treturn nodeNameSelector === "*" ? +\t\t\t\tfunction() { return true; } : +\t\t\t\tfunction( elem ) { +\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName; +\t\t\t\t}; +\t\t}, + +\t\t"CLASS": function( className ) { +\t\t\tvar pattern = classCache[ className + " " ]; + +\t\t\treturn pattern || +\t\t\t\t(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && +\t\t\t\tclassCache( className, function( elem ) { +\t\t\t\t\treturn pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); +\t\t\t\t}); +\t\t}, + +\t\t"ATTR": function( name, operator, check ) { +\t\t\treturn function( elem ) { +\t\t\t\tvar result = Sizzle.attr( elem, name ); + +\t\t\t\tif ( result == null ) { +\t\t\t\t\treturn operator === "!="; +\t\t\t\t} +\t\t\t\tif ( !operator ) { +\t\t\t\t\treturn true; +\t\t\t\t} + +\t\t\t\tresult += ""; + +\t\t\t\treturn operator === "=" ? result === check : +\t\t\t\t\toperator === "!=" ? result !== check : +\t\t\t\t\toperator === "^=" ? check && result.indexOf( check ) === 0 : +\t\t\t\t\toperator === "*=" ? check && result.indexOf( check ) > -1 : +\t\t\t\t\toperator === "$=" ? check && result.slice( -check.length ) === check : +\t\t\t\t\toperator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : +\t\t\t\t\toperator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : +\t\t\t\t\tfalse; +\t\t\t}; +\t\t}, + +\t\t"CHILD": function( type, what, argument, first, last ) { +\t\t\tvar simple = type.slice( 0, 3 ) !== "nth", +\t\t\t\tforward = type.slice( -4 ) !== "last", +\t\t\t\tofType = what === "of-type"; + +\t\t\treturn first === 1 && last === 0 ? + +\t\t\t\t// Shortcut for :nth-*(n) +\t\t\t\tfunction( elem ) { +\t\t\t\t\treturn !!elem.parentNode; +\t\t\t\t} : + +\t\t\t\tfunction( elem, context, xml ) { +\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start, +\t\t\t\t\t\tdir = simple !== forward ? "nextSibling" : "previousSibling", +\t\t\t\t\t\tparent = elem.parentNode, +\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(), +\t\t\t\t\t\tuseCache = !xml && !ofType, +\t\t\t\t\t\tdiff = false; + +\t\t\t\t\tif ( parent ) { + +\t\t\t\t\t\t// :(first|last|only)-(child|of-type) +\t\t\t\t\t\tif ( simple ) { +\t\t\t\t\t\t\twhile ( dir ) { +\t\t\t\t\t\t\t\tnode = elem; +\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) { +\t\t\t\t\t\t\t\t\tif ( ofType ? +\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name : +\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) { + +\t\t\t\t\t\t\t\t\t\treturn false; +\t\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so) +\t\t\t\t\t\t\t\tstart = dir = type === "only" && !start && "nextSibling"; +\t\t\t\t\t\t\t} +\t\t\t\t\t\t\treturn true; +\t\t\t\t\t\t} + +\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ]; + +\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent` +\t\t\t\t\t\tif ( forward && useCache ) { + +\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index + +\t\t\t\t\t\t\t// ...in a gzip-friendly way +\t\t\t\t\t\t\tnode = parent; +\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {}); + +\t\t\t\t\t\t\t// Support: IE <9 only +\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709) +\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] || +\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {}); + +\t\t\t\t\t\t\tcache = uniqueCache[ type ] || []; +\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; +\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ]; +\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ]; + +\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] || + +\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start +\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) { + +\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break +\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) { +\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; +\t\t\t\t\t\t\t\t\tbreak; +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t} + +\t\t\t\t\t\t} else { +\t\t\t\t\t\t\t// Use previously-cached element index if available +\t\t\t\t\t\t\tif ( useCache ) { +\t\t\t\t\t\t\t\t// ...in a gzip-friendly way +\t\t\t\t\t\t\t\tnode = elem; +\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {}); + +\t\t\t\t\t\t\t\t// Support: IE <9 only +\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709) +\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] || +\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {}); + +\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || []; +\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; +\t\t\t\t\t\t\t\tdiff = nodeIndex; +\t\t\t\t\t\t\t} + +\t\t\t\t\t\t\t// xml :nth-child(...) +\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...) +\t\t\t\t\t\t\tif ( diff === false ) { +\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start +\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] || +\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) { + +\t\t\t\t\t\t\t\t\tif ( ( ofType ? +\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name : +\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) && +\t\t\t\t\t\t\t\t\t\t++diff ) { + +\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element +\t\t\t\t\t\t\t\t\t\tif ( useCache ) { +\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {}); + +\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only +\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709) +\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] || +\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {}); + +\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ]; +\t\t\t\t\t\t\t\t\t\t} + +\t\t\t\t\t\t\t\t\t\tif ( node === elem ) { +\t\t\t\t\t\t\t\t\t\t\tbreak; +\t\t\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} + +\t\t\t\t\t\t// Incorporate the offset, then check against cycle size +\t\t\t\t\t\tdiff -= last; +\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 ); +\t\t\t\t\t} +\t\t\t\t}; +\t\t}, + +\t\t"PSEUDO": function( pseudo, argument ) { +\t\t\t// pseudo-class names are case-insensitive +\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes +\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters +\t\t\t// Remember that setFilters inherits from pseudos +\t\t\tvar args, +\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || +\t\t\t\t\tSizzle.error( "unsupported pseudo: " + pseudo ); + +\t\t\t// The user may use createPseudo to indicate that +\t\t\t// arguments are needed to create the filter function +\t\t\t// just as Sizzle does +\t\t\tif ( fn[ expando ] ) { +\t\t\t\treturn fn( argument ); +\t\t\t} + +\t\t\t// But maintain support for old signatures +\t\t\tif ( fn.length > 1 ) { +\t\t\t\targs = [ pseudo, pseudo, "", argument ]; +\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? +\t\t\t\t\tmarkFunction(function( seed, matches ) { +\t\t\t\t\t\tvar idx, +\t\t\t\t\t\t\tmatched = fn( seed, argument ), +\t\t\t\t\t\t\ti = matched.length; +\t\t\t\t\t\twhile ( i-- ) { +\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] ); +\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] ); +\t\t\t\t\t\t} +\t\t\t\t\t}) : +\t\t\t\t\tfunction( elem ) { +\t\t\t\t\t\treturn fn( elem, 0, args ); +\t\t\t\t\t}; +\t\t\t} + +\t\t\treturn fn; +\t\t} +\t}, + +\tpseudos: { +\t\t// Potentially complex pseudos +\t\t"not": markFunction(function( selector ) { +\t\t\t// Trim the selector passed to compile +\t\t\t// to avoid treating leading and trailing +\t\t\t// spaces as combinators +\t\t\tvar input = [], +\t\t\t\tresults = [], +\t\t\t\tmatcher = compile( selector.replace( rtrim, "$1" ) ); + +\t\t\treturn matcher[ expando ] ? +\t\t\t\tmarkFunction(function( seed, matches, context, xml ) { +\t\t\t\t\tvar elem, +\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ), +\t\t\t\t\t\ti = seed.length; + +\t\t\t\t\t// Match elements unmatched by `matcher` +\t\t\t\t\twhile ( i-- ) { +\t\t\t\t\t\tif ( (elem = unmatched[i]) ) { +\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem); +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t}) : +\t\t\t\tfunction( elem, context, xml ) { +\t\t\t\t\tinput[0] = elem; +\t\t\t\t\tmatcher( input, null, xml, results ); +\t\t\t\t\t// Don't keep the element (issue #299) +\t\t\t\t\tinput[0] = null; +\t\t\t\t\treturn !results.pop(); +\t\t\t\t}; +\t\t}), + +\t\t"has": markFunction(function( selector ) { +\t\t\treturn function( elem ) { +\t\t\t\treturn Sizzle( selector, elem ).length > 0; +\t\t\t}; +\t\t}), + +\t\t"contains": markFunction(function( text ) { +\t\t\ttext = text.replace( runescape, funescape ); +\t\t\treturn function( elem ) { +\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; +\t\t\t}; +\t\t}), + +\t\t// "Whether an element is represented by a :lang() selector +\t\t// is based solely on the element's language value +\t\t// being equal to the identifier C, +\t\t// or beginning with the identifier C immediately followed by "-". +\t\t// The matching of C against the element's language value is performed case-insensitively. +\t\t// The identifier C does not have to be a valid language name." +\t\t// http://www.w3.org/TR/selectors/#lang-pseudo +\t\t"lang": markFunction( function( lang ) { +\t\t\t// lang value must be a valid identifier +\t\t\tif ( !ridentifier.test(lang || "") ) { +\t\t\t\tSizzle.error( "unsupported lang: " + lang ); +\t\t\t} +\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase(); +\t\t\treturn function( elem ) { +\t\t\t\tvar elemLang; +\t\t\t\tdo { +\t\t\t\t\tif ( (elemLang = documentIsHTML ? +\t\t\t\t\t\telem.lang : +\t\t\t\t\t\telem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + +\t\t\t\t\t\telemLang = elemLang.toLowerCase(); +\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; +\t\t\t\t\t} +\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 ); +\t\t\t\treturn false; +\t\t\t}; +\t\t}), + +\t\t// Miscellaneous +\t\t"target": function( elem ) { +\t\t\tvar hash = window.location && window.location.hash; +\t\t\treturn hash && hash.slice( 1 ) === elem.id; +\t\t}, + +\t\t"root": function( elem ) { +\t\t\treturn elem === docElem; +\t\t}, + +\t\t"focus": function( elem ) { +\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); +\t\t}, + +\t\t// Boolean properties +\t\t"enabled": createDisabledPseudo( false ), +\t\t"disabled": createDisabledPseudo( true ), + +\t\t"checked": function( elem ) { +\t\t\t// In CSS3, :checked should return both checked and selected elements +\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked +\t\t\tvar nodeName = elem.nodeName.toLowerCase(); +\t\t\treturn (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); +\t\t}, + +\t\t"selected": function( elem ) { +\t\t\t// Accessing this property makes selected-by-default +\t\t\t// options in Safari work properly +\t\t\tif ( elem.parentNode ) { +\t\t\t\telem.parentNode.selectedIndex; +\t\t\t} + +\t\t\treturn elem.selected === true; +\t\t}, + +\t\t// Contents +\t\t"empty": function( elem ) { +\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo +\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), +\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.) +\t\t\t// nodeType < 6 works because attributes (2) do not appear as children +\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { +\t\t\t\tif ( elem.nodeType < 6 ) { +\t\t\t\t\treturn false; +\t\t\t\t} +\t\t\t} +\t\t\treturn true; +\t\t}, + +\t\t"parent": function( elem ) { +\t\t\treturn !Expr.pseudos["empty"]( elem ); +\t\t}, + +\t\t// Element/input types +\t\t"header": function( elem ) { +\t\t\treturn rheader.test( elem.nodeName ); +\t\t}, + +\t\t"input": function( elem ) { +\t\t\treturn rinputs.test( elem.nodeName ); +\t\t}, + +\t\t"button": function( elem ) { +\t\t\tvar name = elem.nodeName.toLowerCase(); +\t\t\treturn name === "input" && elem.type === "button" || name === "button"; +\t\t}, + +\t\t"text": function( elem ) { +\t\t\tvar attr; +\t\t\treturn elem.nodeName.toLowerCase() === "input" && +\t\t\t\telem.type === "text" && + +\t\t\t\t// Support: IE<8 +\t\t\t\t// New HTML5 attribute values (e.g., "search") appear with elem.type === "text" +\t\t\t\t( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); +\t\t}, + +\t\t// Position-in-collection +\t\t"first": createPositionalPseudo(function() { +\t\t\treturn [ 0 ]; +\t\t}), + +\t\t"last": createPositionalPseudo(function( matchIndexes, length ) { +\t\t\treturn [ length - 1 ]; +\t\t}), + +\t\t"eq": createPositionalPseudo(function( matchIndexes, length, argument ) { +\t\t\treturn [ argument < 0 ? argument + length : argument ]; +\t\t}), + +\t\t"even": createPositionalPseudo(function( matchIndexes, length ) { +\t\t\tvar i = 0; +\t\t\tfor ( ; i < length; i += 2 ) { +\t\t\t\tmatchIndexes.push( i ); +\t\t\t} +\t\t\treturn matchIndexes; +\t\t}), + +\t\t"odd": createPositionalPseudo(function( matchIndexes, length ) { +\t\t\tvar i = 1; +\t\t\tfor ( ; i < length; i += 2 ) { +\t\t\t\tmatchIndexes.push( i ); +\t\t\t} +\t\t\treturn matchIndexes; +\t\t}), + +\t\t"lt": createPositionalPseudo(function( matchIndexes, length, argument ) { +\t\t\tvar i = argument < 0 ? argument + length : argument; +\t\t\tfor ( ; --i >= 0; ) { +\t\t\t\tmatchIndexes.push( i ); +\t\t\t} +\t\t\treturn matchIndexes; +\t\t}), + +\t\t"gt": createPositionalPseudo(function( matchIndexes, length, argument ) { +\t\t\tvar i = argument < 0 ? argument + length : argument; +\t\t\tfor ( ; ++i < length; ) { +\t\t\t\tmatchIndexes.push( i ); +\t\t\t} +\t\t\treturn matchIndexes; +\t\t}) +\t} +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { +\tExpr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { +\tExpr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { +\tvar matched, match, tokens, type, +\t\tsoFar, groups, preFilters, +\t\tcached = tokenCache[ selector + " " ]; + +\tif ( cached ) { +\t\treturn parseOnly ? 0 : cached.slice( 0 ); +\t} + +\tsoFar = selector; +\tgroups = []; +\tpreFilters = Expr.preFilter; + +\twhile ( soFar ) { + +\t\t// Comma and first run +\t\tif ( !matched || (match = rcomma.exec( soFar )) ) { +\t\t\tif ( match ) { +\t\t\t\t// Don't consume trailing commas as valid +\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar; +\t\t\t} +\t\t\tgroups.push( (tokens = []) ); +\t\t} + +\t\tmatched = false; + +\t\t// Combinators +\t\tif ( (match = rcombinators.exec( soFar )) ) { +\t\t\tmatched = match.shift(); +\t\t\ttokens.push({ +\t\t\t\tvalue: matched, +\t\t\t\t// Cast descendant combinators to space +\t\t\t\ttype: match[0].replace( rtrim, " " ) +\t\t\t}); +\t\t\tsoFar = soFar.slice( matched.length ); +\t\t} + +\t\t// Filters +\t\tfor ( type in Expr.filter ) { +\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || +\t\t\t\t(match = preFilters[ type ]( match ))) ) { +\t\t\t\tmatched = match.shift(); +\t\t\t\ttokens.push({ +\t\t\t\t\tvalue: matched, +\t\t\t\t\ttype: type, +\t\t\t\t\tmatches: match +\t\t\t\t}); +\t\t\t\tsoFar = soFar.slice( matched.length ); +\t\t\t} +\t\t} + +\t\tif ( !matched ) { +\t\t\tbreak; +\t\t} +\t} + +\t// Return the length of the invalid excess +\t// if we're just parsing +\t// Otherwise, throw an error or return tokens +\treturn parseOnly ? +\t\tsoFar.length : +\t\tsoFar ? +\t\t\tSizzle.error( selector ) : +\t\t\t// Cache the tokens +\t\t\ttokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { +\tvar i = 0, +\t\tlen = tokens.length, +\t\tselector = ""; +\tfor ( ; i < len; i++ ) { +\t\tselector += tokens[i].value; +\t} +\treturn selector; +} + +function addCombinator( matcher, combinator, base ) { +\tvar dir = combinator.dir, +\t\tskip = combinator.next, +\t\tkey = skip || dir, +\t\tcheckNonElements = base && key === "parentNode", +\t\tdoneName = done++; + +\treturn combinator.first ? +\t\t// Check against closest ancestor/preceding element +\t\tfunction( elem, context, xml ) { +\t\t\twhile ( (elem = elem[ dir ]) ) { +\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) { +\t\t\t\t\treturn matcher( elem, context, xml ); +\t\t\t\t} +\t\t\t} +\t\t\treturn false; +\t\t} : + +\t\t// Check against all ancestor/preceding elements +\t\tfunction( elem, context, xml ) { +\t\t\tvar oldCache, uniqueCache, outerCache, +\t\t\t\tnewCache = [ dirruns, doneName ]; + +\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching +\t\t\tif ( xml ) { +\t\t\t\twhile ( (elem = elem[ dir ]) ) { +\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) { +\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) { +\t\t\t\t\t\t\treturn true; +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} else { +\t\t\t\twhile ( (elem = elem[ dir ]) ) { +\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) { +\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {}); + +\t\t\t\t\t\t// Support: IE <9 only +\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709) +\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + +\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) { +\t\t\t\t\t\t\telem = elem[ dir ] || elem; +\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) && +\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + +\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements +\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]); +\t\t\t\t\t\t} else { +\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements +\t\t\t\t\t\t\tuniqueCache[ key ] = newCache; + +\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking +\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { +\t\t\t\t\t\t\t\treturn true; +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t\treturn false; +\t\t}; +} + +function elementMatcher( matchers ) { +\treturn matchers.length > 1 ? +\t\tfunction( elem, context, xml ) { +\t\t\tvar i = matchers.length; +\t\t\twhile ( i-- ) { +\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) { +\t\t\t\t\treturn false; +\t\t\t\t} +\t\t\t} +\t\t\treturn true; +\t\t} : +\t\tmatchers[0]; +} + +function multipleContexts( selector, contexts, results ) { +\tvar i = 0, +\t\tlen = contexts.length; +\tfor ( ; i < len; i++ ) { +\t\tSizzle( selector, contexts[i], results ); +\t} +\treturn results; +} + +function condense( unmatched, map, filter, context, xml ) { +\tvar elem, +\t\tnewUnmatched = [], +\t\ti = 0, +\t\tlen = unmatched.length, +\t\tmapped = map != null; + +\tfor ( ; i < len; i++ ) { +\t\tif ( (elem = unmatched[i]) ) { +\t\t\tif ( !filter || filter( elem, context, xml ) ) { +\t\t\t\tnewUnmatched.push( elem ); +\t\t\t\tif ( mapped ) { +\t\t\t\t\tmap.push( i ); +\t\t\t\t} +\t\t\t} +\t\t} +\t} + +\treturn newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { +\tif ( postFilter && !postFilter[ expando ] ) { +\t\tpostFilter = setMatcher( postFilter ); +\t} +\tif ( postFinder && !postFinder[ expando ] ) { +\t\tpostFinder = setMatcher( postFinder, postSelector ); +\t} +\treturn markFunction(function( seed, results, context, xml ) { +\t\tvar temp, i, elem, +\t\t\tpreMap = [], +\t\t\tpostMap = [], +\t\t\tpreexisting = results.length, + +\t\t\t// Get initial elements from seed or context +\t\t\telems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + +\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization +\t\t\tmatcherIn = preFilter && ( seed || !selector ) ? +\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) : +\t\t\t\telems, + +\t\t\tmatcherOut = matcher ? +\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, +\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ? + +\t\t\t\t\t// ...intermediate processing is necessary +\t\t\t\t\t[] : + +\t\t\t\t\t// ...otherwise use results directly +\t\t\t\t\tresults : +\t\t\t\tmatcherIn; + +\t\t// Find primary matches +\t\tif ( matcher ) { +\t\t\tmatcher( matcherIn, matcherOut, context, xml ); +\t\t} + +\t\t// Apply postFilter +\t\tif ( postFilter ) { +\t\t\ttemp = condense( matcherOut, postMap ); +\t\t\tpostFilter( temp, [], context, xml ); + +\t\t\t// Un-match failing elements by moving them back to matcherIn +\t\t\ti = temp.length; +\t\t\twhile ( i-- ) { +\t\t\t\tif ( (elem = temp[i]) ) { +\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); +\t\t\t\t} +\t\t\t} +\t\t} + +\t\tif ( seed ) { +\t\t\tif ( postFinder || preFilter ) { +\t\t\t\tif ( postFinder ) { +\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts +\t\t\t\t\ttemp = []; +\t\t\t\t\ti = matcherOut.length; +\t\t\t\t\twhile ( i-- ) { +\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) { +\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match +\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) ); +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml ); +\t\t\t\t} + +\t\t\t\t// Move matched elements from seed to results to keep them synchronized +\t\t\t\ti = matcherOut.length; +\t\t\t\twhile ( i-- ) { +\t\t\t\t\tif ( (elem = matcherOut[i]) && +\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + +\t\t\t\t\t\tseed[temp] = !(results[temp] = elem); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} + +\t\t// Add elements to results, through postFinder if defined +\t\t} else { +\t\t\tmatcherOut = condense( +\t\t\t\tmatcherOut === results ? +\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) : +\t\t\t\t\tmatcherOut +\t\t\t); +\t\t\tif ( postFinder ) { +\t\t\t\tpostFinder( null, results, matcherOut, xml ); +\t\t\t} else { +\t\t\t\tpush.apply( results, matcherOut ); +\t\t\t} +\t\t} +\t}); +} + +function matcherFromTokens( tokens ) { +\tvar checkContext, matcher, j, +\t\tlen = tokens.length, +\t\tleadingRelative = Expr.relative[ tokens[0].type ], +\t\timplicitRelative = leadingRelative || Expr.relative[" "], +\t\ti = leadingRelative ? 1 : 0, + +\t\t// The foundational matcher ensures that elements are reachable from top-level context(s) +\t\tmatchContext = addCombinator( function( elem ) { +\t\t\treturn elem === checkContext; +\t\t}, implicitRelative, true ), +\t\tmatchAnyContext = addCombinator( function( elem ) { +\t\t\treturn indexOf( checkContext, elem ) > -1; +\t\t}, implicitRelative, true ), +\t\tmatchers = [ function( elem, context, xml ) { +\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( +\t\t\t\t(checkContext = context).nodeType ? +\t\t\t\t\tmatchContext( elem, context, xml ) : +\t\t\t\t\tmatchAnyContext( elem, context, xml ) ); +\t\t\t// Avoid hanging onto element (issue #299) +\t\t\tcheckContext = null; +\t\t\treturn ret; +\t\t} ]; + +\tfor ( ; i < len; i++ ) { +\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) { +\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; +\t\t} else { +\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + +\t\t\t// Return special upon seeing a positional matcher +\t\t\tif ( matcher[ expando ] ) { +\t\t\t\t// Find the next relative operator (if any) for proper handling +\t\t\t\tj = ++i; +\t\t\t\tfor ( ; j < len; j++ ) { +\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) { +\t\t\t\t\t\tbreak; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t\treturn setMatcher( +\t\t\t\t\ti > 1 && elementMatcher( matchers ), +\t\t\t\t\ti > 1 && toSelector( +\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*` +\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) +\t\t\t\t\t).replace( rtrim, "$1" ), +\t\t\t\t\tmatcher, +\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ), +\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ), +\t\t\t\t\tj < len && toSelector( tokens ) +\t\t\t\t); +\t\t\t} +\t\t\tmatchers.push( matcher ); +\t\t} +\t} + +\treturn elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { +\tvar bySet = setMatchers.length > 0, +\t\tbyElement = elementMatchers.length > 0, +\t\tsuperMatcher = function( seed, context, xml, results, outermost ) { +\t\t\tvar elem, j, matcher, +\t\t\t\tmatchedCount = 0, +\t\t\t\ti = "0", +\t\t\t\tunmatched = seed && [], +\t\t\t\tsetMatched = [], +\t\t\t\tcontextBackup = outermostContext, +\t\t\t\t// We must always have either seed elements or outermost context +\t\t\t\telems = seed || byElement && Expr.find["TAG"]( "*", outermost ), +\t\t\t\t// Use integer dirruns iff this is the outermost matcher +\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), +\t\t\t\tlen = elems.length; + +\t\t\tif ( outermost ) { +\t\t\t\toutermostContext = context === document || context || outermost; +\t\t\t} + +\t\t\t// Add elements passing elementMatchers directly to results +\t\t\t// Support: IE<9, Safari +\t\t\t// Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id +\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) { +\t\t\t\tif ( byElement && elem ) { +\t\t\t\t\tj = 0; +\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) { +\t\t\t\t\t\tsetDocument( elem ); +\t\t\t\t\t\txml = !documentIsHTML; +\t\t\t\t\t} +\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) { +\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) { +\t\t\t\t\t\t\tresults.push( elem ); +\t\t\t\t\t\t\tbreak; +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t\tif ( outermost ) { +\t\t\t\t\t\tdirruns = dirrunsUnique; +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\t// Track unmatched elements for set filters +\t\t\t\tif ( bySet ) { +\t\t\t\t\t// They will have gone through all possible matchers +\t\t\t\t\tif ( (elem = !matcher && elem) ) { +\t\t\t\t\t\tmatchedCount--; +\t\t\t\t\t} + +\t\t\t\t\t// Lengthen the array for every element, matched or not +\t\t\t\t\tif ( seed ) { +\t\t\t\t\t\tunmatched.push( elem ); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} + +\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount` +\t\t\t// makes the latter nonnegative. +\t\t\tmatchedCount += i; + +\t\t\t// Apply set filters to unmatched elements +\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` +\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have +\t\t\t// no element matchers and no seed. +\t\t\t// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that +\t\t\t// case, which will result in a "00" `matchedCount` that differs from `i` but is also +\t\t\t// numerically zero. +\t\t\tif ( bySet && i !== matchedCount ) { +\t\t\t\tj = 0; +\t\t\t\twhile ( (matcher = setMatchers[j++]) ) { +\t\t\t\t\tmatcher( unmatched, setMatched, context, xml ); +\t\t\t\t} + +\t\t\t\tif ( seed ) { +\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting +\t\t\t\t\tif ( matchedCount > 0 ) { +\t\t\t\t\t\twhile ( i-- ) { +\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) { +\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results ); +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t} + +\t\t\t\t\t// Discard index placeholder values to get only actual matches +\t\t\t\t\tsetMatched = condense( setMatched ); +\t\t\t\t} + +\t\t\t\t// Add matches to results +\t\t\t\tpush.apply( results, setMatched ); + +\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting +\t\t\t\tif ( outermost && !seed && setMatched.length > 0 && +\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) { + +\t\t\t\t\tSizzle.uniqueSort( results ); +\t\t\t\t} +\t\t\t} + +\t\t\t// Override manipulation of globals by nested matchers +\t\t\tif ( outermost ) { +\t\t\t\tdirruns = dirrunsUnique; +\t\t\t\toutermostContext = contextBackup; +\t\t\t} + +\t\t\treturn unmatched; +\t\t}; + +\treturn bySet ? +\t\tmarkFunction( superMatcher ) : +\t\tsuperMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { +\tvar i, +\t\tsetMatchers = [], +\t\telementMatchers = [], +\t\tcached = compilerCache[ selector + " " ]; + +\tif ( !cached ) { +\t\t// Generate a function of recursive functions that can be used to check each element +\t\tif ( !match ) { +\t\t\tmatch = tokenize( selector ); +\t\t} +\t\ti = match.length; +\t\twhile ( i-- ) { +\t\t\tcached = matcherFromTokens( match[i] ); +\t\t\tif ( cached[ expando ] ) { +\t\t\t\tsetMatchers.push( cached ); +\t\t\t} else { +\t\t\t\telementMatchers.push( cached ); +\t\t\t} +\t\t} + +\t\t// Cache the compiled function +\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + +\t\t// Save selector and tokenization +\t\tcached.selector = selector; +\t} +\treturn cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { +\tvar i, tokens, token, type, find, +\t\tcompiled = typeof selector === "function" && selector, +\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) ); + +\tresults = results || []; + +\t// Try to minimize operations if there is only one selector in the list and no seed +\t// (the latter of which guarantees us context) +\tif ( match.length === 1 ) { + +\t\t// Reduce context if the leading compound selector is an ID +\t\ttokens = match[0] = match[0].slice( 0 ); +\t\tif ( tokens.length > 2 && (token = tokens[0]).type === "ID" && +\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + +\t\t\tcontext = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; +\t\t\tif ( !context ) { +\t\t\t\treturn results; + +\t\t\t// Precompiled matchers will still verify ancestry, so step up a level +\t\t\t} else if ( compiled ) { +\t\t\t\tcontext = context.parentNode; +\t\t\t} + +\t\t\tselector = selector.slice( tokens.shift().value.length ); +\t\t} + +\t\t// Fetch a seed set for right-to-left matching +\t\ti = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; +\t\twhile ( i-- ) { +\t\t\ttoken = tokens[i]; + +\t\t\t// Abort if we hit a combinator +\t\t\tif ( Expr.relative[ (type = token.type) ] ) { +\t\t\t\tbreak; +\t\t\t} +\t\t\tif ( (find = Expr.find[ type ]) ) { +\t\t\t\t// Search, expanding context for leading sibling combinators +\t\t\t\tif ( (seed = find( +\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ), +\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context +\t\t\t\t)) ) { + +\t\t\t\t\t// If seed is empty or no tokens remain, we can return early +\t\t\t\t\ttokens.splice( i, 1 ); +\t\t\t\t\tselector = seed.length && toSelector( tokens ); +\t\t\t\t\tif ( !selector ) { +\t\t\t\t\t\tpush.apply( results, seed ); +\t\t\t\t\t\treturn results; +\t\t\t\t\t} + +\t\t\t\t\tbreak; +\t\t\t\t} +\t\t\t} +\t\t} +\t} + +\t// Compile and execute a filtering function if one is not provided +\t// Provide `match` to avoid retokenization if we modified the selector above +\t( compiled || compile( selector, match ) )( +\t\tseed, +\t\tcontext, +\t\t!documentIsHTML, +\t\tresults, +\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context +\t); +\treturn results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { +\t// Should return 1, but returns 4 (following) +\treturn el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { +\tel.innerHTML = ""; +\treturn el.firstChild.getAttribute("href") === "#" ; +}) ) { +\taddHandle( "type|href|height|width", function( elem, name, isXML ) { +\t\tif ( !isXML ) { +\t\t\treturn elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); +\t\t} +\t}); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { +\tel.innerHTML = ""; +\tel.firstChild.setAttribute( "value", "" ); +\treturn el.firstChild.getAttribute( "value" ) === ""; +}) ) { +\taddHandle( "value", function( elem, name, isXML ) { +\t\tif ( !isXML && elem.nodeName.toLowerCase() === "input" ) { +\t\t\treturn elem.defaultValue; +\t\t} +\t}); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { +\treturn el.getAttribute("disabled") == null; +}) ) { +\taddHandle( booleans, function( elem, name, isXML ) { +\t\tvar val; +\t\tif ( !isXML ) { +\t\t\treturn elem[ name ] === true ? name.toLowerCase() : +\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ? +\t\t\t\t\tval.value : +\t\t\t\tnull; +\t\t} +\t}); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { +\tvar matched = [], +\t\ttruncate = until !== undefined; + +\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { +\t\tif ( elem.nodeType === 1 ) { +\t\t\tif ( truncate && jQuery( elem ).is( until ) ) { +\t\t\t\tbreak; +\t\t\t} +\t\t\tmatched.push( elem ); +\t\t} +\t} +\treturn matched; +}; + + +var siblings = function( n, elem ) { +\tvar matched = []; + +\tfor ( ; n; n = n.nextSibling ) { +\t\tif ( n.nodeType === 1 && n !== elem ) { +\t\t\tmatched.push( n ); +\t\t} +\t} + +\treturn matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i ); + + + +var risSimple = /^.[^:#\\[\\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { +\tif ( jQuery.isFunction( qualifier ) ) { +\t\treturn jQuery.grep( elements, function( elem, i ) { +\t\t\treturn !!qualifier.call( elem, i, elem ) !== not; +\t\t} ); +\t} + +\t// Single element +\tif ( qualifier.nodeType ) { +\t\treturn jQuery.grep( elements, function( elem ) { +\t\t\treturn ( elem === qualifier ) !== not; +\t\t} ); +\t} + +\t// Arraylike of elements (jQuery, arguments, Array) +\tif ( typeof qualifier !== "string" ) { +\t\treturn jQuery.grep( elements, function( elem ) { +\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not; +\t\t} ); +\t} + +\t// Simple selector that can be filtered directly, removing non-Elements +\tif ( risSimple.test( qualifier ) ) { +\t\treturn jQuery.filter( qualifier, elements, not ); +\t} + +\t// Complex selector, compare the two sets, removing non-Elements +\tqualifier = jQuery.filter( qualifier, elements ); +\treturn jQuery.grep( elements, function( elem ) { +\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; +\t} ); +} + +jQuery.filter = function( expr, elems, not ) { +\tvar elem = elems[ 0 ]; + +\tif ( not ) { +\t\texpr = ":not(" + expr + ")"; +\t} + +\tif ( elems.length === 1 && elem.nodeType === 1 ) { +\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; +\t} + +\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { +\t\treturn elem.nodeType === 1; +\t} ) ); +}; + +jQuery.fn.extend( { +\tfind: function( selector ) { +\t\tvar i, ret, +\t\t\tlen = this.length, +\t\t\tself = this; + +\t\tif ( typeof selector !== "string" ) { +\t\t\treturn this.pushStack( jQuery( selector ).filter( function() { +\t\t\t\tfor ( i = 0; i < len; i++ ) { +\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) { +\t\t\t\t\t\treturn true; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} ) ); +\t\t} + +\t\tret = this.pushStack( [] ); + +\t\tfor ( i = 0; i < len; i++ ) { +\t\t\tjQuery.find( selector, self[ i ], ret ); +\t\t} + +\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret; +\t}, +\tfilter: function( selector ) { +\t\treturn this.pushStack( winnow( this, selector || [], false ) ); +\t}, +\tnot: function( selector ) { +\t\treturn this.pushStack( winnow( this, selector || [], true ) ); +\t}, +\tis: function( selector ) { +\t\treturn !!winnow( +\t\t\tthis, + +\t\t\t// If this is a positional/relative selector, check membership in the returned set +\t\t\t// so $("p:first").is("p:last") won\'t return true for a doc with two "p". +\t\t\ttypeof selector === "string" && rneedsContext.test( selector ) ? +\t\t\t\tjQuery( selector ) : +\t\t\t\tselector || [], +\t\t\tfalse +\t\t).length; +\t} +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + +\t// A simple way to check for HTML strings +\t// Prioritize #id over to avoid XSS via location.hash (#9521) +\t// Strict HTML recognition (#11290: must start with <) +\t// Shortcut simple #id case for speed +\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/, + +\tinit = jQuery.fn.init = function( selector, context, root ) { +\t\tvar match, elem; + +\t\t// HANDLE: $(""), $(null), $(undefined), $(false) +\t\tif ( !selector ) { +\t\t\treturn this; +\t\t} + +\t\t// Method init() accepts an alternate rootjQuery +\t\t// so migrate can support jQuery.sub (gh-2101) +\t\troot = root || rootjQuery; + +\t\t// Handle HTML strings +\t\tif ( typeof selector === "string" ) { +\t\t\tif ( selector[ 0 ] === "<" && +\t\t\t\tselector[ selector.length - 1 ] === ">" && +\t\t\t\tselector.length >= 3 ) { + +\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check +\t\t\t\tmatch = [ null, selector, null ]; + +\t\t\t} else { +\t\t\t\tmatch = rquickExpr.exec( selector ); +\t\t\t} + +\t\t\t// Match html or make sure no context is specified for #id +\t\t\tif ( match && ( match[ 1 ] || !context ) ) { + +\t\t\t\t// HANDLE: $(html) -> $(array) +\t\t\t\tif ( match[ 1 ] ) { +\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context; + +\t\t\t\t\t// Option to run scripts is true for back-compat +\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present +\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML( +\t\t\t\t\t\tmatch[ 1 ], +\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document, +\t\t\t\t\t\ttrue +\t\t\t\t\t) ); + +\t\t\t\t\t// HANDLE: $(html, props) +\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { +\t\t\t\t\t\tfor ( match in context ) { + +\t\t\t\t\t\t\t// Properties of context are called as methods if possible +\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) { +\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] ); + +\t\t\t\t\t\t\t// ...and otherwise set as attributes +\t\t\t\t\t\t\t} else { +\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] ); +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t} + +\t\t\t\t\treturn this; + +\t\t\t\t// HANDLE: $(#id) +\t\t\t\t} else { +\t\t\t\t\telem = document.getElementById( match[ 2 ] ); + +\t\t\t\t\tif ( elem ) { + +\t\t\t\t\t\t// Inject the element directly into the jQuery object +\t\t\t\t\t\tthis[ 0 ] = elem; +\t\t\t\t\t\tthis.length = 1; +\t\t\t\t\t} +\t\t\t\t\treturn this; +\t\t\t\t} + +\t\t\t// HANDLE: $(expr, $(...)) +\t\t\t} else if ( !context || context.jquery ) { +\t\t\t\treturn ( context || root ).find( selector ); + +\t\t\t// HANDLE: $(expr, context) +\t\t\t// (which is just equivalent to: $(context).find(expr) +\t\t\t} else { +\t\t\t\treturn this.constructor( context ).find( selector ); +\t\t\t} + +\t\t// HANDLE: $(DOMElement) +\t\t} else if ( selector.nodeType ) { +\t\t\tthis[ 0 ] = selector; +\t\t\tthis.length = 1; +\t\t\treturn this; + +\t\t// HANDLE: $(function) +\t\t// Shortcut for document ready +\t\t} else if ( jQuery.isFunction( selector ) ) { +\t\t\treturn root.ready !== undefined ? +\t\t\t\troot.ready( selector ) : + +\t\t\t\t// Execute immediately if ready is not present +\t\t\t\tselector( jQuery ); +\t\t} + +\t\treturn jQuery.makeArray( selector, this ); +\t}; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + +\t// Methods guaranteed to produce a unique set when starting from a unique set +\tguaranteedUnique = { +\t\tchildren: true, +\t\tcontents: true, +\t\tnext: true, +\t\tprev: true +\t}; + +jQuery.fn.extend( { +\thas: function( target ) { +\t\tvar targets = jQuery( target, this ), +\t\t\tl = targets.length; + +\t\treturn this.filter( function() { +\t\t\tvar i = 0; +\t\t\tfor ( ; i < l; i++ ) { +\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) { +\t\t\t\t\treturn true; +\t\t\t\t} +\t\t\t} +\t\t} ); +\t}, + +\tclosest: function( selectors, context ) { +\t\tvar cur, +\t\t\ti = 0, +\t\t\tl = this.length, +\t\t\tmatched = [], +\t\t\ttargets = typeof selectors !== "string" && jQuery( selectors ); + +\t\t// Positional selectors never match, since there's no _selection_ context +\t\tif ( !rneedsContext.test( selectors ) ) { +\t\t\tfor ( ; i < l; i++ ) { +\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + +\t\t\t\t\t// Always skip document fragments +\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ? +\t\t\t\t\t\ttargets.index( cur ) > -1 : + +\t\t\t\t\t\t// Don't pass non-elements to Sizzle +\t\t\t\t\t\tcur.nodeType === 1 && +\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) { + +\t\t\t\t\t\tmatched.push( cur ); +\t\t\t\t\t\tbreak; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} + +\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); +\t}, + +\t// Determine the position of an element within the set +\tindex: function( elem ) { + +\t\t// No argument, return index in parent +\t\tif ( !elem ) { +\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; +\t\t} + +\t\t// Index in selector +\t\tif ( typeof elem === "string" ) { +\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] ); +\t\t} + +\t\t// Locate the position of the desired element +\t\treturn indexOf.call( this, + +\t\t\t// If it receives a jQuery object, the first element is used +\t\t\telem.jquery ? elem[ 0 ] : elem +\t\t); +\t}, + +\tadd: function( selector, context ) { +\t\treturn this.pushStack( +\t\t\tjQuery.uniqueSort( +\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) ) +\t\t\t) +\t\t); +\t}, + +\taddBack: function( selector ) { +\t\treturn this.add( selector == null ? +\t\t\tthis.prevObject : this.prevObject.filter( selector ) +\t\t); +\t} +} ); + +function sibling( cur, dir ) { +\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} +\treturn cur; +} + +jQuery.each( { +\tparent: function( elem ) { +\t\tvar parent = elem.parentNode; +\t\treturn parent && parent.nodeType !== 11 ? parent : null; +\t}, +\tparents: function( elem ) { +\t\treturn dir( elem, "parentNode" ); +\t}, +\tparentsUntil: function( elem, i, until ) { +\t\treturn dir( elem, "parentNode", until ); +\t}, +\tnext: function( elem ) { +\t\treturn sibling( elem, "nextSibling" ); +\t}, +\tprev: function( elem ) { +\t\treturn sibling( elem, "previousSibling" ); +\t}, +\tnextAll: function( elem ) { +\t\treturn dir( elem, "nextSibling" ); +\t}, +\tprevAll: function( elem ) { +\t\treturn dir( elem, "previousSibling" ); +\t}, +\tnextUntil: function( elem, i, until ) { +\t\treturn dir( elem, "nextSibling", until ); +\t}, +\tprevUntil: function( elem, i, until ) { +\t\treturn dir( elem, "previousSibling", until ); +\t}, +\tsiblings: function( elem ) { +\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem ); +\t}, +\tchildren: function( elem ) { +\t\treturn siblings( elem.firstChild ); +\t}, +\tcontents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); +\t} +}, function( name, fn ) { +\tjQuery.fn[ name ] = function( until, selector ) { +\t\tvar matched = jQuery.map( this, fn, until ); + +\t\tif ( name.slice( -5 ) !== "Until" ) { +\t\t\tselector = until; +\t\t} + +\t\tif ( selector && typeof selector === "string" ) { +\t\t\tmatched = jQuery.filter( selector, matched ); +\t\t} + +\t\tif ( this.length > 1 ) { + +\t\t\t// Remove duplicates +\t\t\tif ( !guaranteedUnique[ name ] ) { +\t\t\t\tjQuery.uniqueSort( matched ); +\t\t\t} + +\t\t\t// Reverse order for parents* and prev-derivatives +\t\t\tif ( rparentsprev.test( name ) ) { +\t\t\t\tmatched.reverse(); +\t\t\t} +\t\t} + +\t\treturn this.pushStack( matched ); +\t}; +} ); +var rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { +\tvar object = {}; +\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { +\t\tobject[ flag ] = true; +\t} ); +\treturn object; +} + +/* + * Create a callback list using the following parameters: + * + *\toptions: an optional list of space-separated options that will change how + *\t\t\tthe callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred) + * + *\tmemory:\t\t\twill keep track of previous values and will call any callback added + *\t\t\t\t\tafter the list has been fired right away with the latest "memorized" + *\t\t\t\t\tvalues (like a Deferred) + * + *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list) + * + *\tstopOnFalse:\tinterrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + +\t// Convert options from String-formatted to Object-formatted if needed +\t// (we check in cache first) +\toptions = typeof options === "string" ? +\t\tcreateOptions( options ) : +\t\tjQuery.extend( {}, options ); + +\tvar // Flag to know if list is currently firing +\t\tfiring, + +\t\t// Last fire value for non-forgettable lists +\t\tmemory, + +\t\t// Flag to know if list was already fired +\t\tfired, + +\t\t// Flag to prevent firing +\t\tlocked, + +\t\t// Actual callback list +\t\tlist = [], + +\t\t// Queue of execution data for repeatable lists +\t\tqueue = [], + +\t\t// Index of currently firing callback (modified by add/remove as needed) +\t\tfiringIndex = -1, + +\t\t// Fire callbacks +\t\tfire = function() { + +\t\t\t// Enforce single-firing +\t\t\tlocked = locked || options.once; + +\t\t\t// Execute callbacks for all pending executions, +\t\t\t// respecting firingIndex overrides and runtime changes +\t\t\tfired = firing = true; +\t\t\tfor ( ; queue.length; firingIndex = -1 ) { +\t\t\t\tmemory = queue.shift(); +\t\t\t\twhile ( ++firingIndex < list.length ) { + +\t\t\t\t\t// Run callback and check for early termination +\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && +\t\t\t\t\t\toptions.stopOnFalse ) { + +\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire +\t\t\t\t\t\tfiringIndex = list.length; +\t\t\t\t\t\tmemory = false; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} + +\t\t\t// Forget the data if we're done with it +\t\t\tif ( !options.memory ) { +\t\t\t\tmemory = false; +\t\t\t} + +\t\t\tfiring = false; + +\t\t\t// Clean up if we're done firing for good +\t\t\tif ( locked ) { + +\t\t\t\t// Keep an empty list if we have data for future add calls +\t\t\t\tif ( memory ) { +\t\t\t\t\tlist = []; + +\t\t\t\t// Otherwise, this object is spent +\t\t\t\t} else { +\t\t\t\t\tlist = ""; +\t\t\t\t} +\t\t\t} +\t\t}, + +\t\t// Actual Callbacks object +\t\tself = { + +\t\t\t// Add a callback or a collection of callbacks to the list +\t\t\tadd: function() { +\t\t\t\tif ( list ) { + +\t\t\t\t\t// If we have memory from a past run, we should fire after adding +\t\t\t\t\tif ( memory && !firing ) { +\t\t\t\t\t\tfiringIndex = list.length - 1; +\t\t\t\t\t\tqueue.push( memory ); +\t\t\t\t\t} + +\t\t\t\t\t( function add( args ) { +\t\t\t\t\t\tjQuery.each( args, function( _, arg ) { +\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) { +\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) { +\t\t\t\t\t\t\t\t\tlist.push( arg ); +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + +\t\t\t\t\t\t\t\t// Inspect recursively +\t\t\t\t\t\t\t\tadd( arg ); +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} ); +\t\t\t\t\t} )( arguments ); + +\t\t\t\t\tif ( memory && !firing ) { +\t\t\t\t\t\tfire(); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t\treturn this; +\t\t\t}, + +\t\t\t// Remove a callback from the list +\t\t\tremove: function() { +\t\t\t\tjQuery.each( arguments, function( _, arg ) { +\t\t\t\t\tvar index; +\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { +\t\t\t\t\t\tlist.splice( index, 1 ); + +\t\t\t\t\t\t// Handle firing indexes +\t\t\t\t\t\tif ( index <= firingIndex ) { +\t\t\t\t\t\t\tfiringIndex--; +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} ); +\t\t\t\treturn this; +\t\t\t}, + +\t\t\t// Check if a given callback is in the list. +\t\t\t// If no argument is given, return whether or not list has callbacks attached. +\t\t\thas: function( fn ) { +\t\t\t\treturn fn ? +\t\t\t\t\tjQuery.inArray( fn, list ) > -1 : +\t\t\t\t\tlist.length > 0; +\t\t\t}, + +\t\t\t// Remove all callbacks from the list +\t\t\tempty: function() { +\t\t\t\tif ( list ) { +\t\t\t\t\tlist = []; +\t\t\t\t} +\t\t\t\treturn this; +\t\t\t}, + +\t\t\t// Disable .fire and .add +\t\t\t// Abort any current/pending executions +\t\t\t// Clear all callbacks and values +\t\t\tdisable: function() { +\t\t\t\tlocked = queue = []; +\t\t\t\tlist = memory = ""; +\t\t\t\treturn this; +\t\t\t}, +\t\t\tdisabled: function() { +\t\t\t\treturn !list; +\t\t\t}, + +\t\t\t// Disable .fire +\t\t\t// Also disable .add unless we have memory (since it would have no effect) +\t\t\t// Abort any pending executions +\t\t\tlock: function() { +\t\t\t\tlocked = queue = []; +\t\t\t\tif ( !memory && !firing ) { +\t\t\t\t\tlist = memory = ""; +\t\t\t\t} +\t\t\t\treturn this; +\t\t\t}, +\t\t\tlocked: function() { +\t\t\t\treturn !!locked; +\t\t\t}, + +\t\t\t// Call all callbacks with the given context and arguments +\t\t\tfireWith: function( context, args ) { +\t\t\t\tif ( !locked ) { +\t\t\t\t\targs = args || []; +\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ]; +\t\t\t\t\tqueue.push( args ); +\t\t\t\t\tif ( !firing ) { +\t\t\t\t\t\tfire(); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t\treturn this; +\t\t\t}, + +\t\t\t// Call all the callbacks with the given arguments +\t\t\tfire: function() { +\t\t\t\tself.fireWith( this, arguments ); +\t\t\t\treturn this; +\t\t\t}, + +\t\t\t// To know if the callbacks have already been called at least once +\t\t\tfired: function() { +\t\t\t\treturn !!fired; +\t\t\t} +\t\t}; + +\treturn self; +}; + + +function Identity( v ) { +\treturn v; +} +function Thrower( ex ) { +\tthrow ex; +} + +function adoptValue( value, resolve, reject, noValue ) { +\tvar method; + +\ttry { + +\t\t// Check for promise aspect first to privilege synchronous behavior +\t\tif ( value && jQuery.isFunction( ( method = value.promise ) ) ) { +\t\t\tmethod.call( value ).done( resolve ).fail( reject ); + +\t\t// Other thenables +\t\t} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { +\t\t\tmethod.call( value, resolve, reject ); + +\t\t// Other non-thenables +\t\t} else { + +\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: +\t\t\t// * false: [ value ].slice( 0 ) => resolve( value ) +\t\t\t// * true: [ value ].slice( 1 ) => resolve() +\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) ); +\t\t} + +\t// For Promises/A+, convert exceptions into rejections +\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in +\t// Deferred#then to conditionally suppress rejection. +\t} catch ( value ) { + +\t\t// Support: Android 4.0 only +\t\t// Strict mode functions invoked without .call/.apply get global-object context +\t\treject.apply( undefined, [ value ] ); +\t} +} + +jQuery.extend( { + +\tDeferred: function( func ) { +\t\tvar tuples = [ + +\t\t\t\t// action, add listener, callbacks, +\t\t\t\t// ... .then handlers, argument index, [final state] +\t\t\t\t[ "notify", "progress", jQuery.Callbacks( "memory" ), +\t\t\t\t\tjQuery.Callbacks( "memory" ), 2 ], +\t\t\t\t[ "resolve", "done", jQuery.Callbacks( "once memory" ), +\t\t\t\t\tjQuery.Callbacks( "once memory" ), 0, "resolved" ], +\t\t\t\t[ "reject", "fail", jQuery.Callbacks( "once memory" ), +\t\t\t\t\tjQuery.Callbacks( "once memory" ), 1, "rejected" ] +\t\t\t], +\t\t\tstate = "pending", +\t\t\tpromise = { +\t\t\t\tstate: function() { +\t\t\t\t\treturn state; +\t\t\t\t}, +\t\t\t\talways: function() { +\t\t\t\t\tdeferred.done( arguments ).fail( arguments ); +\t\t\t\t\treturn this; +\t\t\t\t}, +\t\t\t\t"catch": function( fn ) { +\t\t\t\t\treturn promise.then( null, fn ); +\t\t\t\t}, + +\t\t\t\t// Keep pipe for back-compat +\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) { +\t\t\t\t\tvar fns = arguments; + +\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) { +\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) { + +\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress) +\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + +\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify }) +\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve }) +\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject }) +\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() { +\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments ); +\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) { +\t\t\t\t\t\t\t\t\treturned.promise() +\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify ) +\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve ) +\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject ); +\t\t\t\t\t\t\t\t} else { +\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + "With" ]( +\t\t\t\t\t\t\t\t\t\tthis, +\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments +\t\t\t\t\t\t\t\t\t); +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t} ); +\t\t\t\t\t\t} ); +\t\t\t\t\t\tfns = null; +\t\t\t\t\t} ).promise(); +\t\t\t\t}, +\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) { +\t\t\t\t\tvar maxDepth = 0; +\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) { +\t\t\t\t\t\treturn function() { +\t\t\t\t\t\t\tvar that = this, +\t\t\t\t\t\t\t\targs = arguments, +\t\t\t\t\t\t\t\tmightThrow = function() { +\t\t\t\t\t\t\t\t\tvar returned, then; + +\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3 +\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59 +\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts +\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) { +\t\t\t\t\t\t\t\t\t\treturn; +\t\t\t\t\t\t\t\t\t} + +\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args ); + +\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1 +\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48 +\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) { +\t\t\t\t\t\t\t\t\t\tthrow new TypeError( "Thenable self-resolution" ); +\t\t\t\t\t\t\t\t\t} + +\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5 +\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54 +\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75 +\t\t\t\t\t\t\t\t\t// Retrieve `then` only once +\t\t\t\t\t\t\t\t\tthen = returned && + +\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4 +\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64 +\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability +\t\t\t\t\t\t\t\t\t\t( typeof returned === "object" || +\t\t\t\t\t\t\t\t\t\t\ttypeof returned === "function" ) && +\t\t\t\t\t\t\t\t\t\treturned.then; + +\t\t\t\t\t\t\t\t\t// Handle a returned thenable +\t\t\t\t\t\t\t\t\tif ( jQuery.isFunction( then ) ) { + +\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution +\t\t\t\t\t\t\t\t\t\tif ( special ) { +\t\t\t\t\t\t\t\t\t\t\tthen.call( +\t\t\t\t\t\t\t\t\t\t\t\treturned, +\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ), +\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ) +\t\t\t\t\t\t\t\t\t\t\t); + +\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress +\t\t\t\t\t\t\t\t\t\t} else { + +\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values +\t\t\t\t\t\t\t\t\t\t\tmaxDepth++; + +\t\t\t\t\t\t\t\t\t\t\tthen.call( +\t\t\t\t\t\t\t\t\t\t\t\treturned, +\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ), +\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ), +\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, +\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith ) +\t\t\t\t\t\t\t\t\t\t\t); +\t\t\t\t\t\t\t\t\t\t} + +\t\t\t\t\t\t\t\t\t// Handle all other returned values +\t\t\t\t\t\t\t\t\t} else { + +\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context +\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior) +\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) { +\t\t\t\t\t\t\t\t\t\t\tthat = undefined; +\t\t\t\t\t\t\t\t\t\t\targs = [ returned ]; +\t\t\t\t\t\t\t\t\t\t} + +\t\t\t\t\t\t\t\t\t\t// Process the value(s) +\t\t\t\t\t\t\t\t\t\t// Default process is resolve +\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args ); +\t\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\t}, + +\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions +\t\t\t\t\t\t\t\tprocess = special ? +\t\t\t\t\t\t\t\t\tmightThrow : +\t\t\t\t\t\t\t\t\tfunction() { +\t\t\t\t\t\t\t\t\t\ttry { +\t\t\t\t\t\t\t\t\t\t\tmightThrow(); +\t\t\t\t\t\t\t\t\t\t} catch ( e ) { + +\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) { +\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e, +\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace ); +\t\t\t\t\t\t\t\t\t\t\t} + +\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1 +\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61 +\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions +\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) { + +\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context +\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior) +\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) { +\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined; +\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ]; +\t\t\t\t\t\t\t\t\t\t\t\t} + +\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args ); +\t\t\t\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\t\t}; + +\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1 +\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57 +\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from +\t\t\t\t\t\t\t// subsequent errors +\t\t\t\t\t\t\tif ( depth ) { +\t\t\t\t\t\t\t\tprocess(); +\t\t\t\t\t\t\t} else { + +\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception +\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async +\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) { +\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook(); +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\twindow.setTimeout( process ); +\t\t\t\t\t\t\t} +\t\t\t\t\t\t}; +\t\t\t\t\t} + +\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) { + +\t\t\t\t\t\t// progress_handlers.add( ... ) +\t\t\t\t\t\ttuples[ 0 ][ 3 ].add( +\t\t\t\t\t\t\tresolve( +\t\t\t\t\t\t\t\t0, +\t\t\t\t\t\t\t\tnewDefer, +\t\t\t\t\t\t\t\tjQuery.isFunction( onProgress ) ? +\t\t\t\t\t\t\t\t\tonProgress : +\t\t\t\t\t\t\t\t\tIdentity, +\t\t\t\t\t\t\t\tnewDefer.notifyWith +\t\t\t\t\t\t\t) +\t\t\t\t\t\t); + +\t\t\t\t\t\t// fulfilled_handlers.add( ... ) +\t\t\t\t\t\ttuples[ 1 ][ 3 ].add( +\t\t\t\t\t\t\tresolve( +\t\t\t\t\t\t\t\t0, +\t\t\t\t\t\t\t\tnewDefer, +\t\t\t\t\t\t\t\tjQuery.isFunction( onFulfilled ) ? +\t\t\t\t\t\t\t\t\tonFulfilled : +\t\t\t\t\t\t\t\t\tIdentity +\t\t\t\t\t\t\t) +\t\t\t\t\t\t); + +\t\t\t\t\t\t// rejected_handlers.add( ... ) +\t\t\t\t\t\ttuples[ 2 ][ 3 ].add( +\t\t\t\t\t\t\tresolve( +\t\t\t\t\t\t\t\t0, +\t\t\t\t\t\t\t\tnewDefer, +\t\t\t\t\t\t\t\tjQuery.isFunction( onRejected ) ? +\t\t\t\t\t\t\t\t\tonRejected : +\t\t\t\t\t\t\t\t\tThrower +\t\t\t\t\t\t\t) +\t\t\t\t\t\t); +\t\t\t\t\t} ).promise(); +\t\t\t\t}, + +\t\t\t\t// Get a promise for this deferred +\t\t\t\t// If obj is provided, the promise aspect is added to the object +\t\t\t\tpromise: function( obj ) { +\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise; +\t\t\t\t} +\t\t\t}, +\t\t\tdeferred = {}; + +\t\t// Add list-specific methods +\t\tjQuery.each( tuples, function( i, tuple ) { +\t\t\tvar list = tuple[ 2 ], +\t\t\t\tstateString = tuple[ 5 ]; + +\t\t\t// promise.progress = list.add +\t\t\t// promise.done = list.add +\t\t\t// promise.fail = list.add +\t\t\tpromise[ tuple[ 1 ] ] = list.add; + +\t\t\t// Handle state +\t\t\tif ( stateString ) { +\t\t\t\tlist.add( +\t\t\t\t\tfunction() { + +\t\t\t\t\t\t// state = "resolved" (i.e., fulfilled) +\t\t\t\t\t\t// state = "rejected" +\t\t\t\t\t\tstate = stateString; +\t\t\t\t\t}, + +\t\t\t\t\t// rejected_callbacks.disable +\t\t\t\t\t// fulfilled_callbacks.disable +\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable, + +\t\t\t\t\t// progress_callbacks.lock +\t\t\t\t\ttuples[ 0 ][ 2 ].lock +\t\t\t\t); +\t\t\t} + +\t\t\t// progress_handlers.fire +\t\t\t// fulfilled_handlers.fire +\t\t\t// rejected_handlers.fire +\t\t\tlist.add( tuple[ 3 ].fire ); + +\t\t\t// deferred.notify = function() { deferred.notifyWith(...) } +\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) } +\t\t\t// deferred.reject = function() { deferred.rejectWith(...) } +\t\t\tdeferred[ tuple[ 0 ] ] = function() { +\t\t\t\tdeferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); +\t\t\t\treturn this; +\t\t\t}; + +\t\t\t// deferred.notifyWith = list.fireWith +\t\t\t// deferred.resolveWith = list.fireWith +\t\t\t// deferred.rejectWith = list.fireWith +\t\t\tdeferred[ tuple[ 0 ] + "With" ] = list.fireWith; +\t\t} ); + +\t\t// Make the deferred a promise +\t\tpromise.promise( deferred ); + +\t\t// Call given func if any +\t\tif ( func ) { +\t\t\tfunc.call( deferred, deferred ); +\t\t} + +\t\t// All done! +\t\treturn deferred; +\t}, + +\t// Deferred helper +\twhen: function( singleValue ) { +\t\tvar + +\t\t\t// count of uncompleted subordinates +\t\t\tremaining = arguments.length, + +\t\t\t// count of unprocessed arguments +\t\t\ti = remaining, + +\t\t\t// subordinate fulfillment data +\t\t\tresolveContexts = Array( i ), +\t\t\tresolveValues = slice.call( arguments ), + +\t\t\t// the master Deferred +\t\t\tmaster = jQuery.Deferred(), + +\t\t\t// subordinate callback factory +\t\t\tupdateFunc = function( i ) { +\t\t\t\treturn function( value ) { +\t\t\t\t\tresolveContexts[ i ] = this; +\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; +\t\t\t\t\tif ( !( --remaining ) ) { +\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues ); +\t\t\t\t\t} +\t\t\t\t}; +\t\t\t}; + +\t\t// Single- and empty arguments are adopted like Promise.resolve +\t\tif ( remaining <= 1 ) { +\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, +\t\t\t\t!remaining ); + +\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000) +\t\t\tif ( master.state() === "pending" || +\t\t\t\tjQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + +\t\t\t\treturn master.then(); +\t\t\t} +\t\t} + +\t\t// Multiple arguments are aggregated like Promise.all array elements +\t\twhile ( i-- ) { +\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); +\t\t} + +\t\treturn master.promise(); +\t} +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + +\t// Support: IE 8 - 9 only +\t// Console exists when dev tools are open, which can happen at any time +\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { +\t\twindow.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); +\t} +}; + + + + +jQuery.readyException = function( error ) { +\twindow.setTimeout( function() { +\t\tthrow error; +\t} ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + +\treadyList +\t\t.then( fn ) + +\t\t// Wrap jQuery.readyException in a function so that the lookup +\t\t// happens at the time of error handling instead of callback +\t\t// registration. +\t\t.catch( function( error ) { +\t\t\tjQuery.readyException( error ); +\t\t} ); + +\treturn this; +}; + +jQuery.extend( { + +\t// Is the DOM ready to be used? Set to true once it occurs. +\tisReady: false, + +\t// A counter to track how many items to wait for before +\t// the ready event fires. See #6781 +\treadyWait: 1, + +\t// Handle when the DOM is ready +\tready: function( wait ) { + +\t\t// Abort if there are pending holds or we're already ready +\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { +\t\t\treturn; +\t\t} + +\t\t// Remember that the DOM is ready +\t\tjQuery.isReady = true; + +\t\t// If a normal DOM Ready event fired, decrement, and wait if need be +\t\tif ( wait !== true && --jQuery.readyWait > 0 ) { +\t\t\treturn; +\t\t} + +\t\t// If there are functions bound, to execute +\t\treadyList.resolveWith( document, [ jQuery ] ); +\t} +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { +\tdocument.removeEventListener( "DOMContentLoaded", completed ); +\twindow.removeEventListener( "load", completed ); +\tjQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || +\t( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + +\t// Handle it asynchronously to allow scripts the opportunity to delay ready +\twindow.setTimeout( jQuery.ready ); + +} else { + +\t// Use the handy event callback +\tdocument.addEventListener( "DOMContentLoaded", completed ); + +\t// A fallback to window.onload, that will always work +\twindow.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { +\tvar i = 0, +\t\tlen = elems.length, +\t\tbulk = key == null; + +\t// Sets many values +\tif ( jQuery.type( key ) === "object" ) { +\t\tchainable = true; +\t\tfor ( i in key ) { +\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw ); +\t\t} + +\t// Sets one value +\t} else if ( value !== undefined ) { +\t\tchainable = true; + +\t\tif ( !jQuery.isFunction( value ) ) { +\t\t\traw = true; +\t\t} + +\t\tif ( bulk ) { + +\t\t\t// Bulk operations run against the entire set +\t\t\tif ( raw ) { +\t\t\t\tfn.call( elems, value ); +\t\t\t\tfn = null; + +\t\t\t// ...except when executing function values +\t\t\t} else { +\t\t\t\tbulk = fn; +\t\t\t\tfn = function( elem, key, value ) { +\t\t\t\t\treturn bulk.call( jQuery( elem ), value ); +\t\t\t\t}; +\t\t\t} +\t\t} + +\t\tif ( fn ) { +\t\t\tfor ( ; i < len; i++ ) { +\t\t\t\tfn( +\t\t\t\t\telems[ i ], key, raw ? +\t\t\t\t\tvalue : +\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) ) +\t\t\t\t); +\t\t\t} +\t\t} +\t} + +\tif ( chainable ) { +\t\treturn elems; +\t} + +\t// Gets +\tif ( bulk ) { +\t\treturn fn.call( elems ); +\t} + +\treturn len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + +\t// Accepts only: +\t// - Node +\t// - Node.ELEMENT_NODE +\t// - Node.DOCUMENT_NODE +\t// - Object +\t// - Any +\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { +\tthis.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + +\tcache: function( owner ) { + +\t\t// Check if the owner object already has a cache +\t\tvar value = owner[ this.expando ]; + +\t\t// If not, create one +\t\tif ( !value ) { +\t\t\tvalue = {}; + +\t\t\t// We can accept data for non-element nodes in modern browsers, +\t\t\t// but we should not, see #8335. +\t\t\t// Always return an empty object. +\t\t\tif ( acceptData( owner ) ) { + +\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over +\t\t\t\t// use plain assignment +\t\t\t\tif ( owner.nodeType ) { +\t\t\t\t\towner[ this.expando ] = value; + +\t\t\t\t// Otherwise secure it in a non-enumerable property +\t\t\t\t// configurable must be true to allow the property to be +\t\t\t\t// deleted when data is removed +\t\t\t\t} else { +\t\t\t\t\tObject.defineProperty( owner, this.expando, { +\t\t\t\t\t\tvalue: value, +\t\t\t\t\t\tconfigurable: true +\t\t\t\t\t} ); +\t\t\t\t} +\t\t\t} +\t\t} + +\t\treturn value; +\t}, +\tset: function( owner, data, value ) { +\t\tvar prop, +\t\t\tcache = this.cache( owner ); + +\t\t// Handle: [ owner, key, value ] args +\t\t// Always use camelCase key (gh-2257) +\t\tif ( typeof data === "string" ) { +\t\t\tcache[ jQuery.camelCase( data ) ] = value; + +\t\t// Handle: [ owner, { properties } ] args +\t\t} else { + +\t\t\t// Copy the properties one-by-one to the cache object +\t\t\tfor ( prop in data ) { +\t\t\t\tcache[ jQuery.camelCase( prop ) ] = data[ prop ]; +\t\t\t} +\t\t} +\t\treturn cache; +\t}, +\tget: function( owner, key ) { +\t\treturn key === undefined ? +\t\t\tthis.cache( owner ) : + +\t\t\t// Always use camelCase key (gh-2257) +\t\t\towner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; +\t}, +\taccess: function( owner, key, value ) { + +\t\t// In cases where either: +\t\t// +\t\t// 1. No key was specified +\t\t// 2. A string key was specified, but no value provided +\t\t// +\t\t// Take the "read" path and allow the get method to determine +\t\t// which value to return, respectively either: +\t\t// +\t\t// 1. The entire cache object +\t\t// 2. The data stored at the key +\t\t// +\t\tif ( key === undefined || +\t\t\t\t( ( key && typeof key === "string" ) && value === undefined ) ) { + +\t\t\treturn this.get( owner, key ); +\t\t} + +\t\t// When the key is not a string, or both a key and value +\t\t// are specified, set or extend (existing objects) with either: +\t\t// +\t\t// 1. An object of properties +\t\t// 2. A key and value +\t\t// +\t\tthis.set( owner, key, value ); + +\t\t// Since the "set" path can have two possible entry points +\t\t// return the expected data based on which path was taken[*] +\t\treturn value !== undefined ? value : key; +\t}, +\tremove: function( owner, key ) { +\t\tvar i, +\t\t\tcache = owner[ this.expando ]; + +\t\tif ( cache === undefined ) { +\t\t\treturn; +\t\t} + +\t\tif ( key !== undefined ) { + +\t\t\t// Support array or space separated string of keys +\t\t\tif ( Array.isArray( key ) ) { + +\t\t\t\t// If key is an array of keys... +\t\t\t\t// We always set camelCase keys, so remove that. +\t\t\t\tkey = key.map( jQuery.camelCase ); +\t\t\t} else { +\t\t\t\tkey = jQuery.camelCase( key ); + +\t\t\t\t// If a key with the spaces exists, use it. +\t\t\t\t// Otherwise, create an array by matching non-whitespace +\t\t\t\tkey = key in cache ? +\t\t\t\t\t[ key ] : +\t\t\t\t\t( key.match( rnothtmlwhite ) || [] ); +\t\t\t} + +\t\t\ti = key.length; + +\t\t\twhile ( i-- ) { +\t\t\t\tdelete cache[ key[ i ] ]; +\t\t\t} +\t\t} + +\t\t// Remove the expando if there's no more data +\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) { + +\t\t\t// Support: Chrome <=35 - 45 +\t\t\t// Webkit & Blink performance suffers when deleting properties +\t\t\t// from DOM nodes, so set to undefined instead +\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) +\t\t\tif ( owner.nodeType ) { +\t\t\t\towner[ this.expando ] = undefined; +\t\t\t} else { +\t\t\t\tdelete owner[ this.expando ]; +\t\t\t} +\t\t} +\t}, +\thasData: function( owner ) { +\t\tvar cache = owner[ this.expando ]; +\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache ); +\t} +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +//\tImplementation Summary +// +//\t1. Enforce API surface and semantic compatibility with 1.9.x branch +//\t2. Improve the module's maintainability by reducing the storage +//\t\tpaths to a single mechanism. +//\t3. Use the same single mechanism to support "private" and "user" data. +//\t4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +//\t5. Avoid exposing implementation details on user objects (eg. expando properties) +//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/, +\trmultiDash = /[A-Z]/g; + +function getData( data ) { +\tif ( data === "true" ) { +\t\treturn true; +\t} + +\tif ( data === "false" ) { +\t\treturn false; +\t} + +\tif ( data === "null" ) { +\t\treturn null; +\t} + +\t// Only convert to a number if it doesn't change the string +\tif ( data === +data + "" ) { +\t\treturn +data; +\t} + +\tif ( rbrace.test( data ) ) { +\t\treturn JSON.parse( data ); +\t} + +\treturn data; +} + +function dataAttr( elem, key, data ) { +\tvar name; + +\t// If nothing was found internally, try to fetch any +\t// data from the HTML5 data-* attribute +\tif ( data === undefined && elem.nodeType === 1 ) { +\t\tname = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); +\t\tdata = elem.getAttribute( name ); + +\t\tif ( typeof data === "string" ) { +\t\t\ttry { +\t\t\t\tdata = getData( data ); +\t\t\t} catch ( e ) {} + +\t\t\t// Make sure we set the data so it isn't changed later +\t\t\tdataUser.set( elem, key, data ); +\t\t} else { +\t\t\tdata = undefined; +\t\t} +\t} +\treturn data; +} + +jQuery.extend( { +\thasData: function( elem ) { +\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem ); +\t}, + +\tdata: function( elem, name, data ) { +\t\treturn dataUser.access( elem, name, data ); +\t}, + +\tremoveData: function( elem, name ) { +\t\tdataUser.remove( elem, name ); +\t}, + +\t// TODO: Now that all calls to _data and _removeData have been replaced +\t// with direct calls to dataPriv methods, these can be deprecated. +\t_data: function( elem, name, data ) { +\t\treturn dataPriv.access( elem, name, data ); +\t}, + +\t_removeData: function( elem, name ) { +\t\tdataPriv.remove( elem, name ); +\t} +} ); + +jQuery.fn.extend( { +\tdata: function( key, value ) { +\t\tvar i, name, data, +\t\t\telem = this[ 0 ], +\t\t\tattrs = elem && elem.attributes; + +\t\t// Gets all values +\t\tif ( key === undefined ) { +\t\t\tif ( this.length ) { +\t\t\t\tdata = dataUser.get( elem ); + +\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { +\t\t\t\t\ti = attrs.length; +\t\t\t\t\twhile ( i-- ) { + +\t\t\t\t\t\t// Support: IE 11 only +\t\t\t\t\t\t// The attrs elements can be null (#14894) +\t\t\t\t\t\tif ( attrs[ i ] ) { +\t\t\t\t\t\t\tname = attrs[ i ].name; +\t\t\t\t\t\t\tif ( name.indexOf( "data-" ) === 0 ) { +\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) ); +\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] ); +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t\tdataPriv.set( elem, "hasDataAttrs", true ); +\t\t\t\t} +\t\t\t} + +\t\t\treturn data; +\t\t} + +\t\t// Sets multiple values +\t\tif ( typeof key === "object" ) { +\t\t\treturn this.each( function() { +\t\t\t\tdataUser.set( this, key ); +\t\t\t} ); +\t\t} + +\t\treturn access( this, function( value ) { +\t\t\tvar data; + +\t\t\t// The calling jQuery object (element matches) is not empty +\t\t\t// (and therefore has an element appears at this[ 0 ]) and the +\t\t\t// `value` parameter was not undefined. An empty jQuery object +\t\t\t// will result in `undefined` for elem = this[ 0 ] which will +\t\t\t// throw an exception if an attempt to read a data cache is made. +\t\t\tif ( elem && value === undefined ) { + +\t\t\t\t// Attempt to get data from the cache +\t\t\t\t// The key will always be camelCased in Data +\t\t\t\tdata = dataUser.get( elem, key ); +\t\t\t\tif ( data !== undefined ) { +\t\t\t\t\treturn data; +\t\t\t\t} + +\t\t\t\t// Attempt to "discover" the data in +\t\t\t\t// HTML5 custom data-* attrs +\t\t\t\tdata = dataAttr( elem, key ); +\t\t\t\tif ( data !== undefined ) { +\t\t\t\t\treturn data; +\t\t\t\t} + +\t\t\t\t// We tried really hard, but the data doesn't exist. +\t\t\t\treturn; +\t\t\t} + +\t\t\t// Set the data... +\t\t\tthis.each( function() { + +\t\t\t\t// We always store the camelCased key +\t\t\t\tdataUser.set( this, key, value ); +\t\t\t} ); +\t\t}, null, value, arguments.length > 1, null, true ); +\t}, + +\tremoveData: function( key ) { +\t\treturn this.each( function() { +\t\t\tdataUser.remove( this, key ); +\t\t} ); +\t} +} ); + + +jQuery.extend( { +\tqueue: function( elem, type, data ) { +\t\tvar queue; + +\t\tif ( elem ) { +\t\t\ttype = ( type || "fx" ) + "queue"; +\t\t\tqueue = dataPriv.get( elem, type ); + +\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup +\t\t\tif ( data ) { +\t\t\t\tif ( !queue || Array.isArray( data ) ) { +\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); +\t\t\t\t} else { +\t\t\t\t\tqueue.push( data ); +\t\t\t\t} +\t\t\t} +\t\t\treturn queue || []; +\t\t} +\t}, + +\tdequeue: function( elem, type ) { +\t\ttype = type || "fx"; + +\t\tvar queue = jQuery.queue( elem, type ), +\t\t\tstartLength = queue.length, +\t\t\tfn = queue.shift(), +\t\t\thooks = jQuery._queueHooks( elem, type ), +\t\t\tnext = function() { +\t\t\t\tjQuery.dequeue( elem, type ); +\t\t\t}; + +\t\t// If the fx queue is dequeued, always remove the progress sentinel +\t\tif ( fn === "inprogress" ) { +\t\t\tfn = queue.shift(); +\t\t\tstartLength--; +\t\t} + +\t\tif ( fn ) { + +\t\t\t// Add a progress sentinel to prevent the fx queue from being +\t\t\t// automatically dequeued +\t\t\tif ( type === "fx" ) { +\t\t\t\tqueue.unshift( "inprogress" ); +\t\t\t} + +\t\t\t// Clear up the last queue stop function +\t\t\tdelete hooks.stop; +\t\t\tfn.call( elem, next, hooks ); +\t\t} + +\t\tif ( !startLength && hooks ) { +\t\t\thooks.empty.fire(); +\t\t} +\t}, + +\t// Not public - generate a queueHooks object, or return the current one +\t_queueHooks: function( elem, type ) { +\t\tvar key = type + "queueHooks"; +\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, { +\t\t\tempty: jQuery.Callbacks( "once memory" ).add( function() { +\t\t\t\tdataPriv.remove( elem, [ type + "queue", key ] ); +\t\t\t} ) +\t\t} ); +\t} +} ); + +jQuery.fn.extend( { +\tqueue: function( type, data ) { +\t\tvar setter = 2; + +\t\tif ( typeof type !== "string" ) { +\t\t\tdata = type; +\t\t\ttype = "fx"; +\t\t\tsetter--; +\t\t} + +\t\tif ( arguments.length < setter ) { +\t\t\treturn jQuery.queue( this[ 0 ], type ); +\t\t} + +\t\treturn data === undefined ? +\t\t\tthis : +\t\t\tthis.each( function() { +\t\t\t\tvar queue = jQuery.queue( this, type, data ); + +\t\t\t\t// Ensure a hooks for this queue +\t\t\t\tjQuery._queueHooks( this, type ); + +\t\t\t\tif ( type === "fx" && queue[ 0 ] !== "inprogress" ) { +\t\t\t\t\tjQuery.dequeue( this, type ); +\t\t\t\t} +\t\t\t} ); +\t}, +\tdequeue: function( type ) { +\t\treturn this.each( function() { +\t\t\tjQuery.dequeue( this, type ); +\t\t} ); +\t}, +\tclearQueue: function( type ) { +\t\treturn this.queue( type || "fx", [] ); +\t}, + +\t// Get a promise resolved when queues of a certain type +\t// are emptied (fx is the type by default) +\tpromise: function( type, obj ) { +\t\tvar tmp, +\t\t\tcount = 1, +\t\t\tdefer = jQuery.Deferred(), +\t\t\telements = this, +\t\t\ti = this.length, +\t\t\tresolve = function() { +\t\t\t\tif ( !( --count ) ) { +\t\t\t\t\tdefer.resolveWith( elements, [ elements ] ); +\t\t\t\t} +\t\t\t}; + +\t\tif ( typeof type !== "string" ) { +\t\t\tobj = type; +\t\t\ttype = undefined; +\t\t} +\t\ttype = type || "fx"; + +\t\twhile ( i-- ) { +\t\t\ttmp = dataPriv.get( elements[ i ], type + "queueHooks" ); +\t\t\tif ( tmp && tmp.empty ) { +\t\t\t\tcount++; +\t\t\t\ttmp.empty.add( resolve ); +\t\t\t} +\t\t} +\t\tresolve(); +\t\treturn defer.promise( obj ); +\t} +} ); +var pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + +\t\t// isHiddenWithinTree might be called from jQuery#filter function; +\t\t// in that case, element will be second argument +\t\telem = el || elem; + +\t\t// Inline style trumps all +\t\treturn elem.style.display === "none" || +\t\t\telem.style.display === "" && + +\t\t\t// Otherwise, check computed style +\t\t\t// Support: Firefox <=43 - 45 +\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is +\t\t\t// in the document. +\t\t\tjQuery.contains( elem.ownerDocument, elem ) && + +\t\t\tjQuery.css( elem, "display" ) === "none"; +\t}; + +var swap = function( elem, options, callback, args ) { +\tvar ret, name, +\t\told = {}; + +\t// Remember the old values, and insert the new ones +\tfor ( name in options ) { +\t\told[ name ] = elem.style[ name ]; +\t\telem.style[ name ] = options[ name ]; +\t} + +\tret = callback.apply( elem, args || [] ); + +\t// Revert the old values +\tfor ( name in options ) { +\t\telem.style[ name ] = old[ name ]; +\t} + +\treturn ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { +\tvar adjusted, +\t\tscale = 1, +\t\tmaxIterations = 20, +\t\tcurrentValue = tween ? +\t\t\tfunction() { +\t\t\t\treturn tween.cur(); +\t\t\t} : +\t\t\tfunction() { +\t\t\t\treturn jQuery.css( elem, prop, "" ); +\t\t\t}, +\t\tinitial = currentValue(), +\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + +\t\t// Starting value computation is required for potential unit mismatches +\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && +\t\t\trcssNum.exec( jQuery.css( elem, prop ) ); + +\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + +\t\t// Trust units reported by jQuery.css +\t\tunit = unit || initialInUnit[ 3 ]; + +\t\t// Make sure we update the tween properties later on +\t\tvalueParts = valueParts || []; + +\t\t// Iteratively approximate from a nonzero starting point +\t\tinitialInUnit = +initial || 1; + +\t\tdo { + +\t\t\t// If previous iteration zeroed out, double until we get *something*. +\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below +\t\t\tscale = scale || ".5"; + +\t\t\t// Adjust and apply +\t\t\tinitialInUnit = initialInUnit / scale; +\t\t\tjQuery.style( elem, prop, initialInUnit + unit ); + +\t\t// Update scale, tolerating zero or NaN from tween.cur() +\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough. +\t\t} while ( +\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations +\t\t); +\t} + +\tif ( valueParts ) { +\t\tinitialInUnit = +initialInUnit || +initial || 0; + +\t\t// Apply relative offset (+=/-=) if specified +\t\tadjusted = valueParts[ 1 ] ? +\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +\t\t\t+valueParts[ 2 ]; +\t\tif ( tween ) { +\t\t\ttween.unit = unit; +\t\t\ttween.start = initialInUnit; +\t\t\ttween.end = adjusted; +\t\t} +\t} +\treturn adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { +\tvar temp, +\t\tdoc = elem.ownerDocument, +\t\tnodeName = elem.nodeName, +\t\tdisplay = defaultDisplayMap[ nodeName ]; + +\tif ( display ) { +\t\treturn display; +\t} + +\ttemp = doc.body.appendChild( doc.createElement( nodeName ) ); +\tdisplay = jQuery.css( temp, "display" ); + +\ttemp.parentNode.removeChild( temp ); + +\tif ( display === "none" ) { +\t\tdisplay = "block"; +\t} +\tdefaultDisplayMap[ nodeName ] = display; + +\treturn display; +} + +function showHide( elements, show ) { +\tvar display, elem, +\t\tvalues = [], +\t\tindex = 0, +\t\tlength = elements.length; + +\t// Determine new display value for elements that need to change +\tfor ( ; index < length; index++ ) { +\t\telem = elements[ index ]; +\t\tif ( !elem.style ) { +\t\t\tcontinue; +\t\t} + +\t\tdisplay = elem.style.display; +\t\tif ( show ) { + +\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow) +\t\t\t// check is required in this first loop unless we have a nonempty display value (either +\t\t\t// inline or about-to-be-restored) +\t\t\tif ( display === "none" ) { +\t\t\t\tvalues[ index ] = dataPriv.get( elem, "display" ) || null; +\t\t\t\tif ( !values[ index ] ) { +\t\t\t\t\telem.style.display = ""; +\t\t\t\t} +\t\t\t} +\t\t\tif ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { +\t\t\t\tvalues[ index ] = getDefaultDisplay( elem ); +\t\t\t} +\t\t} else { +\t\t\tif ( display !== "none" ) { +\t\t\t\tvalues[ index ] = "none"; + +\t\t\t\t// Remember what we're overwriting +\t\t\t\tdataPriv.set( elem, "display", display ); +\t\t\t} +\t\t} +\t} + +\t// Set the display of the elements in a second loop to avoid constant reflow +\tfor ( index = 0; index < length; index++ ) { +\t\tif ( values[ index ] != null ) { +\t\t\telements[ index ].style.display = values[ index ]; +\t\t} +\t} + +\treturn elements; +} + +jQuery.fn.extend( { +\tshow: function() { +\t\treturn showHide( this, true ); +\t}, +\thide: function() { +\t\treturn showHide( this ); +\t}, +\ttoggle: function( state ) { +\t\tif ( typeof state === "boolean" ) { +\t\t\treturn state ? this.show() : this.hide(); +\t\t} + +\t\treturn this.each( function() { +\t\t\tif ( isHiddenWithinTree( this ) ) { +\t\t\t\tjQuery( this ).show(); +\t\t\t} else { +\t\t\t\tjQuery( this ).hide(); +\t\t\t} +\t\t} ); +\t} +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i ); + +var rscriptType = ( /^$|\\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + +\t// Support: IE <=9 only +\toption: [ 1, "" ], + +\t// XHTML parsers do not magically insert elements in the +\t// same way that tag soup parsers do. So we cannot shorten +\t// this by omitting or other required elements. +\tthead: [ 1, "", "
" ], +\tcol: [ 2, "", "
" ], +\ttr: [ 2, "", "
" ], +\ttd: [ 3, "", "
" ], + +\t_default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + +\t// Support: IE <=9 - 11 only +\t// Use typeof to avoid zero-argument method invocation on host objects (#15151) +\tvar ret; + +\tif ( typeof context.getElementsByTagName !== "undefined" ) { +\t\tret = context.getElementsByTagName( tag || "*" ); + +\t} else if ( typeof context.querySelectorAll !== "undefined" ) { +\t\tret = context.querySelectorAll( tag || "*" ); + +\t} else { +\t\tret = []; +\t} + +\tif ( tag === undefined || tag && nodeName( context, tag ) ) { +\t\treturn jQuery.merge( [ context ], ret ); +\t} + +\treturn ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { +\tvar i = 0, +\t\tl = elems.length; + +\tfor ( ; i < l; i++ ) { +\t\tdataPriv.set( +\t\t\telems[ i ], +\t\t\t"globalEval", +\t\t\t!refElements || dataPriv.get( refElements[ i ], "globalEval" ) +\t\t); +\t} +} + + +var rhtml = /<|&#?\\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { +\tvar elem, tmp, tag, wrap, contains, j, +\t\tfragment = context.createDocumentFragment(), +\t\tnodes = [], +\t\ti = 0, +\t\tl = elems.length; + +\tfor ( ; i < l; i++ ) { +\t\telem = elems[ i ]; + +\t\tif ( elem || elem === 0 ) { + +\t\t\t// Add nodes directly +\t\t\tif ( jQuery.type( elem ) === "object" ) { + +\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only +\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit +\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + +\t\t\t// Convert non-html into a text node +\t\t\t} else if ( !rhtml.test( elem ) ) { +\t\t\t\tnodes.push( context.createTextNode( elem ) ); + +\t\t\t// Convert html into DOM nodes +\t\t\t} else { +\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + +\t\t\t\t// Deserialize a standard representation +\t\t\t\ttag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); +\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default; +\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + +\t\t\t\t// Descend through wrappers to the right content +\t\t\t\tj = wrap[ 0 ]; +\t\t\t\twhile ( j-- ) { +\t\t\t\t\ttmp = tmp.lastChild; +\t\t\t\t} + +\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only +\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit +\t\t\t\tjQuery.merge( nodes, tmp.childNodes ); + +\t\t\t\t// Remember the top-level container +\t\t\t\ttmp = fragment.firstChild; + +\t\t\t\t// Ensure the created nodes are orphaned (#12392) +\t\t\t\ttmp.textContent = ""; +\t\t\t} +\t\t} +\t} + +\t// Remove wrapper from fragment +\tfragment.textContent = ""; + +\ti = 0; +\twhile ( ( elem = nodes[ i++ ] ) ) { + +\t\t// Skip elements already in the context collection (trac-4087) +\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) { +\t\t\tif ( ignored ) { +\t\t\t\tignored.push( elem ); +\t\t\t} +\t\t\tcontinue; +\t\t} + +\t\tcontains = jQuery.contains( elem.ownerDocument, elem ); + +\t\t// Append to fragment +\t\ttmp = getAll( fragment.appendChild( elem ), "script" ); + +\t\t// Preserve script evaluation history +\t\tif ( contains ) { +\t\t\tsetGlobalEval( tmp ); +\t\t} + +\t\t// Capture executables +\t\tif ( scripts ) { +\t\t\tj = 0; +\t\t\twhile ( ( elem = tmp[ j++ ] ) ) { +\t\t\t\tif ( rscriptType.test( elem.type || "" ) ) { +\t\t\t\t\tscripts.push( elem ); +\t\t\t\t} +\t\t\t} +\t\t} +\t} + +\treturn fragment; +} + + +( function() { +\tvar fragment = document.createDocumentFragment(), +\t\tdiv = fragment.appendChild( document.createElement( "div" ) ), +\t\tinput = document.createElement( "input" ); + +\t// Support: Android 4.0 - 4.3 only +\t// Check state lost if the name is set (#11217) +\t// Support: Windows Web Apps (WWA) +\t// `name` and `type` must use .setAttribute for WWA (#14901) +\tinput.setAttribute( "type", "radio" ); +\tinput.setAttribute( "checked", "checked" ); +\tinput.setAttribute( "name", "t" ); + +\tdiv.appendChild( input ); + +\t// Support: Android <=4.1 only +\t// Older WebKit doesn't clone checked state correctly in fragments +\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + +\t// Support: IE <=11 only +\t// Make sure textarea (and checkbox) defaultValue is properly cloned +\tdiv.innerHTML = ""; +\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var +\trkeyEvent = /^key/, +\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, +\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/; + +function returnTrue() { +\treturn true; +} + +function returnFalse() { +\treturn false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { +\ttry { +\t\treturn document.activeElement; +\t} catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { +\tvar origFn, type; + +\t// Types can be a map of types/handlers +\tif ( typeof types === "object" ) { + +\t\t// ( types-Object, selector, data ) +\t\tif ( typeof selector !== "string" ) { + +\t\t\t// ( types-Object, data ) +\t\t\tdata = data || selector; +\t\t\tselector = undefined; +\t\t} +\t\tfor ( type in types ) { +\t\t\ton( elem, type, selector, data, types[ type ], one ); +\t\t} +\t\treturn elem; +\t} + +\tif ( data == null && fn == null ) { + +\t\t// ( types, fn ) +\t\tfn = selector; +\t\tdata = selector = undefined; +\t} else if ( fn == null ) { +\t\tif ( typeof selector === "string" ) { + +\t\t\t// ( types, selector, fn ) +\t\t\tfn = data; +\t\t\tdata = undefined; +\t\t} else { + +\t\t\t// ( types, data, fn ) +\t\t\tfn = data; +\t\t\tdata = selector; +\t\t\tselector = undefined; +\t\t} +\t} +\tif ( fn === false ) { +\t\tfn = returnFalse; +\t} else if ( !fn ) { +\t\treturn elem; +\t} + +\tif ( one === 1 ) { +\t\torigFn = fn; +\t\tfn = function( event ) { + +\t\t\t// Can use an empty set, since event contains the info +\t\t\tjQuery().off( event ); +\t\t\treturn origFn.apply( this, arguments ); +\t\t}; + +\t\t// Use same guid so caller can remove using origFn +\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); +\t} +\treturn elem.each( function() { +\t\tjQuery.event.add( this, types, fn, data, selector ); +\t} ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + +\tglobal: {}, + +\tadd: function( elem, types, handler, data, selector ) { + +\t\tvar handleObjIn, eventHandle, tmp, +\t\t\tevents, t, handleObj, +\t\t\tspecial, handlers, type, namespaces, origType, +\t\t\telemData = dataPriv.get( elem ); + +\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects) +\t\tif ( !elemData ) { +\t\t\treturn; +\t\t} + +\t\t// Caller can pass in an object of custom data in lieu of the handler +\t\tif ( handler.handler ) { +\t\t\thandleObjIn = handler; +\t\t\thandler = handleObjIn.handler; +\t\t\tselector = handleObjIn.selector; +\t\t} + +\t\t// Ensure that invalid selectors throw exceptions at attach time +\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document) +\t\tif ( selector ) { +\t\t\tjQuery.find.matchesSelector( documentElement, selector ); +\t\t} + +\t\t// Make sure that the handler has a unique ID, used to find/remove it later +\t\tif ( !handler.guid ) { +\t\t\thandler.guid = jQuery.guid++; +\t\t} + +\t\t// Init the element's event structure and main handler, if this is the first +\t\tif ( !( events = elemData.events ) ) { +\t\t\tevents = elemData.events = {}; +\t\t} +\t\tif ( !( eventHandle = elemData.handle ) ) { +\t\t\teventHandle = elemData.handle = function( e ) { + +\t\t\t\t// Discard the second event of a jQuery.event.trigger() and +\t\t\t\t// when an event is called after a page has unloaded +\t\t\t\treturn typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? +\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined; +\t\t\t}; +\t\t} + +\t\t// Handle multiple events separated by a space +\t\ttypes = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; +\t\tt = types.length; +\t\twhile ( t-- ) { +\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || []; +\t\t\ttype = origType = tmp[ 1 ]; +\t\t\tnamespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + +\t\t\t// There *must* be a type, no attaching namespace-only handlers +\t\t\tif ( !type ) { +\t\t\t\tcontinue; +\t\t\t} + +\t\t\t// If event changes its type, use the special event handlers for the changed type +\t\t\tspecial = jQuery.event.special[ type ] || {}; + +\t\t\t// If selector defined, determine special event api type, otherwise given type +\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type; + +\t\t\t// Update special based on newly reset type +\t\t\tspecial = jQuery.event.special[ type ] || {}; + +\t\t\t// handleObj is passed to all event handlers +\t\t\thandleObj = jQuery.extend( { +\t\t\t\ttype: type, +\t\t\t\torigType: origType, +\t\t\t\tdata: data, +\t\t\t\thandler: handler, +\t\t\t\tguid: handler.guid, +\t\t\t\tselector: selector, +\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ), +\t\t\t\tnamespace: namespaces.join( "." ) +\t\t\t}, handleObjIn ); + +\t\t\t// Init the event handler queue if we're the first +\t\t\tif ( !( handlers = events[ type ] ) ) { +\t\t\t\thandlers = events[ type ] = []; +\t\t\t\thandlers.delegateCount = 0; + +\t\t\t\t// Only use addEventListener if the special events handler returns false +\t\t\t\tif ( !special.setup || +\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) { + +\t\t\t\t\tif ( elem.addEventListener ) { +\t\t\t\t\t\telem.addEventListener( type, eventHandle ); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} + +\t\t\tif ( special.add ) { +\t\t\t\tspecial.add.call( elem, handleObj ); + +\t\t\t\tif ( !handleObj.handler.guid ) { +\t\t\t\t\thandleObj.handler.guid = handler.guid; +\t\t\t\t} +\t\t\t} + +\t\t\t// Add to the element's handler list, delegates in front +\t\t\tif ( selector ) { +\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj ); +\t\t\t} else { +\t\t\t\thandlers.push( handleObj ); +\t\t\t} + +\t\t\t// Keep track of which events have ever been used, for event optimization +\t\t\tjQuery.event.global[ type ] = true; +\t\t} + +\t}, + +\t// Detach an event or set of events from an element +\tremove: function( elem, types, handler, selector, mappedTypes ) { + +\t\tvar j, origCount, tmp, +\t\t\tevents, t, handleObj, +\t\t\tspecial, handlers, type, namespaces, origType, +\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + +\t\tif ( !elemData || !( events = elemData.events ) ) { +\t\t\treturn; +\t\t} + +\t\t// Once for each type.namespace in types; type may be omitted +\t\ttypes = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; +\t\tt = types.length; +\t\twhile ( t-- ) { +\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || []; +\t\t\ttype = origType = tmp[ 1 ]; +\t\t\tnamespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + +\t\t\t// Unbind all events (on this namespace, if provided) for the element +\t\t\tif ( !type ) { +\t\t\t\tfor ( type in events ) { +\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true ); +\t\t\t\t} +\t\t\t\tcontinue; +\t\t\t} + +\t\t\tspecial = jQuery.event.special[ type ] || {}; +\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type; +\t\t\thandlers = events[ type ] || []; +\t\t\ttmp = tmp[ 2 ] && +\t\t\t\tnew RegExp( "(^|\\\\.)" + namespaces.join( "\\\\.(?:.*\\\\.|)" ) + "(\\\\.|$)" ); + +\t\t\t// Remove matching events +\t\t\torigCount = j = handlers.length; +\t\t\twhile ( j-- ) { +\t\t\t\thandleObj = handlers[ j ]; + +\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) && +\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) && +\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) && +\t\t\t\t\t( !selector || selector === handleObj.selector || +\t\t\t\t\t\tselector === "**" && handleObj.selector ) ) { +\t\t\t\t\thandlers.splice( j, 1 ); + +\t\t\t\t\tif ( handleObj.selector ) { +\t\t\t\t\t\thandlers.delegateCount--; +\t\t\t\t\t} +\t\t\t\t\tif ( special.remove ) { +\t\t\t\t\t\tspecial.remove.call( elem, handleObj ); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} + +\t\t\t// Remove generic event handler if we removed something and no more handlers exist +\t\t\t// (avoids potential for endless recursion during removal of special event handlers) +\t\t\tif ( origCount && !handlers.length ) { +\t\t\t\tif ( !special.teardown || +\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) { + +\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle ); +\t\t\t\t} + +\t\t\t\tdelete events[ type ]; +\t\t\t} +\t\t} + +\t\t// Remove data and the expando if it's no longer used +\t\tif ( jQuery.isEmptyObject( events ) ) { +\t\t\tdataPriv.remove( elem, "handle events" ); +\t\t} +\t}, + +\tdispatch: function( nativeEvent ) { + +\t\t// Make a writable jQuery.Event from the native event object +\t\tvar event = jQuery.event.fix( nativeEvent ); + +\t\tvar i, j, ret, matched, handleObj, handlerQueue, +\t\t\targs = new Array( arguments.length ), +\t\t\thandlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], +\t\t\tspecial = jQuery.event.special[ event.type ] || {}; + +\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event +\t\targs[ 0 ] = event; + +\t\tfor ( i = 1; i < arguments.length; i++ ) { +\t\t\targs[ i ] = arguments[ i ]; +\t\t} + +\t\tevent.delegateTarget = this; + +\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired +\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { +\t\t\treturn; +\t\t} + +\t\t// Determine handlers +\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers ); + +\t\t// Run delegates first; they may want to stop propagation beneath us +\t\ti = 0; +\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { +\t\t\tevent.currentTarget = matched.elem; + +\t\t\tj = 0; +\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) && +\t\t\t\t!event.isImmediatePropagationStopped() ) { + +\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s) +\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace). +\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + +\t\t\t\t\tevent.handleObj = handleObj; +\t\t\t\t\tevent.data = handleObj.data; + +\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || +\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args ); + +\t\t\t\t\tif ( ret !== undefined ) { +\t\t\t\t\t\tif ( ( event.result = ret ) === false ) { +\t\t\t\t\t\t\tevent.preventDefault(); +\t\t\t\t\t\t\tevent.stopPropagation(); +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} + +\t\t// Call the postDispatch hook for the mapped type +\t\tif ( special.postDispatch ) { +\t\t\tspecial.postDispatch.call( this, event ); +\t\t} + +\t\treturn event.result; +\t}, + +\thandlers: function( event, handlers ) { +\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors, +\t\t\thandlerQueue = [], +\t\t\tdelegateCount = handlers.delegateCount, +\t\t\tcur = event.target; + +\t\t// Find delegate handlers +\t\tif ( delegateCount && + +\t\t\t// Support: IE <=9 +\t\t\t// Black-hole SVG instance trees (trac-13180) +\t\t\tcur.nodeType && + +\t\t\t// Support: Firefox <=42 +\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) +\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click +\t\t\t// Support: IE 11 only +\t\t\t// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) +\t\t\t!( event.type === "click" && event.button >= 1 ) ) { + +\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) { + +\t\t\t\t// Don't check non-elements (#13208) +\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) +\t\t\t\tif ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { +\t\t\t\t\tmatchedHandlers = []; +\t\t\t\t\tmatchedSelectors = {}; +\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) { +\t\t\t\t\t\thandleObj = handlers[ i ]; + +\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203) +\t\t\t\t\t\tsel = handleObj.selector + " "; + +\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) { +\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ? +\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 : +\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length; +\t\t\t\t\t\t} +\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) { +\t\t\t\t\t\t\tmatchedHandlers.push( handleObj ); +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t\tif ( matchedHandlers.length ) { +\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } ); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} + +\t\t// Add the remaining (directly-bound) handlers +\t\tcur = this; +\t\tif ( delegateCount < handlers.length ) { +\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); +\t\t} + +\t\treturn handlerQueue; +\t}, + +\taddProp: function( name, hook ) { +\t\tObject.defineProperty( jQuery.Event.prototype, name, { +\t\t\tenumerable: true, +\t\t\tconfigurable: true, + +\t\t\tget: jQuery.isFunction( hook ) ? +\t\t\t\tfunction() { +\t\t\t\t\tif ( this.originalEvent ) { +\t\t\t\t\t\t\treturn hook( this.originalEvent ); +\t\t\t\t\t} +\t\t\t\t} : +\t\t\t\tfunction() { +\t\t\t\t\tif ( this.originalEvent ) { +\t\t\t\t\t\t\treturn this.originalEvent[ name ]; +\t\t\t\t\t} +\t\t\t\t}, + +\t\t\tset: function( value ) { +\t\t\t\tObject.defineProperty( this, name, { +\t\t\t\t\tenumerable: true, +\t\t\t\t\tconfigurable: true, +\t\t\t\t\twritable: true, +\t\t\t\t\tvalue: value +\t\t\t\t} ); +\t\t\t} +\t\t} ); +\t}, + +\tfix: function( originalEvent ) { +\t\treturn originalEvent[ jQuery.expando ] ? +\t\t\toriginalEvent : +\t\t\tnew jQuery.Event( originalEvent ); +\t}, + +\tspecial: { +\t\tload: { + +\t\t\t// Prevent triggered image.load events from bubbling to window.load +\t\t\tnoBubble: true +\t\t}, +\t\tfocus: { + +\t\t\t// Fire native event if possible so blur/focus sequence is correct +\t\t\ttrigger: function() { +\t\t\t\tif ( this !== safeActiveElement() && this.focus ) { +\t\t\t\t\tthis.focus(); +\t\t\t\t\treturn false; +\t\t\t\t} +\t\t\t}, +\t\t\tdelegateType: "focusin" +\t\t}, +\t\tblur: { +\t\t\ttrigger: function() { +\t\t\t\tif ( this === safeActiveElement() && this.blur ) { +\t\t\t\t\tthis.blur(); +\t\t\t\t\treturn false; +\t\t\t\t} +\t\t\t}, +\t\t\tdelegateType: "focusout" +\t\t}, +\t\tclick: { + +\t\t\t// For checkbox, fire native event so checked state will be right +\t\t\ttrigger: function() { +\t\t\t\tif ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { +\t\t\t\t\tthis.click(); +\t\t\t\t\treturn false; +\t\t\t\t} +\t\t\t}, + +\t\t\t// For cross-browser consistency, don't fire native .click() on links +\t\t\t_default: function( event ) { +\t\t\t\treturn nodeName( event.target, "a" ); +\t\t\t} +\t\t}, + +\t\tbeforeunload: { +\t\t\tpostDispatch: function( event ) { + +\t\t\t\t// Support: Firefox 20+ +\t\t\t\t// Firefox doesn't alert if the returnValue field is not set. +\t\t\t\tif ( event.result !== undefined && event.originalEvent ) { +\t\t\t\t\tevent.originalEvent.returnValue = event.result; +\t\t\t\t} +\t\t\t} +\t\t} +\t} +}; + +jQuery.removeEvent = function( elem, type, handle ) { + +\t// This "if" is needed for plain objects +\tif ( elem.removeEventListener ) { +\t\telem.removeEventListener( type, handle ); +\t} +}; + +jQuery.Event = function( src, props ) { + +\t// Allow instantiation without the 'new' keyword +\tif ( !( this instanceof jQuery.Event ) ) { +\t\treturn new jQuery.Event( src, props ); +\t} + +\t// Event object +\tif ( src && src.type ) { +\t\tthis.originalEvent = src; +\t\tthis.type = src.type; + +\t\t// Events bubbling up the document may have been marked as prevented +\t\t// by a handler lower down the tree; reflect the correct value. +\t\tthis.isDefaultPrevented = src.defaultPrevented || +\t\t\t\tsrc.defaultPrevented === undefined && + +\t\t\t\t// Support: Android <=2.3 only +\t\t\t\tsrc.returnValue === false ? +\t\t\treturnTrue : +\t\t\treturnFalse; + +\t\t// Create target properties +\t\t// Support: Safari <=6 - 7 only +\t\t// Target should not be a text node (#504, #13143) +\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ? +\t\t\tsrc.target.parentNode : +\t\t\tsrc.target; + +\t\tthis.currentTarget = src.currentTarget; +\t\tthis.relatedTarget = src.relatedTarget; + +\t// Event type +\t} else { +\t\tthis.type = src; +\t} + +\t// Put explicitly provided properties onto the event object +\tif ( props ) { +\t\tjQuery.extend( this, props ); +\t} + +\t// Create a timestamp if incoming event doesn't have one +\tthis.timeStamp = src && src.timeStamp || jQuery.now(); + +\t// Mark it as fixed +\tthis[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { +\tconstructor: jQuery.Event, +\tisDefaultPrevented: returnFalse, +\tisPropagationStopped: returnFalse, +\tisImmediatePropagationStopped: returnFalse, +\tisSimulated: false, + +\tpreventDefault: function() { +\t\tvar e = this.originalEvent; + +\t\tthis.isDefaultPrevented = returnTrue; + +\t\tif ( e && !this.isSimulated ) { +\t\t\te.preventDefault(); +\t\t} +\t}, +\tstopPropagation: function() { +\t\tvar e = this.originalEvent; + +\t\tthis.isPropagationStopped = returnTrue; + +\t\tif ( e && !this.isSimulated ) { +\t\t\te.stopPropagation(); +\t\t} +\t}, +\tstopImmediatePropagation: function() { +\t\tvar e = this.originalEvent; + +\t\tthis.isImmediatePropagationStopped = returnTrue; + +\t\tif ( e && !this.isSimulated ) { +\t\t\te.stopImmediatePropagation(); +\t\t} + +\t\tthis.stopPropagation(); +\t} +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { +\taltKey: true, +\tbubbles: true, +\tcancelable: true, +\tchangedTouches: true, +\tctrlKey: true, +\tdetail: true, +\teventPhase: true, +\tmetaKey: true, +\tpageX: true, +\tpageY: true, +\tshiftKey: true, +\tview: true, +\t"char": true, +\tcharCode: true, +\tkey: true, +\tkeyCode: true, +\tbutton: true, +\tbuttons: true, +\tclientX: true, +\tclientY: true, +\toffsetX: true, +\toffsetY: true, +\tpointerId: true, +\tpointerType: true, +\tscreenX: true, +\tscreenY: true, +\ttargetTouches: true, +\ttoElement: true, +\ttouches: true, + +\twhich: function( event ) { +\t\tvar button = event.button; + +\t\t// Add which for key events +\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) { +\t\t\treturn event.charCode != null ? event.charCode : event.keyCode; +\t\t} + +\t\t// Add which for click: 1 === left; 2 === middle; 3 === right +\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { +\t\t\tif ( button & 1 ) { +\t\t\t\treturn 1; +\t\t\t} + +\t\t\tif ( button & 2 ) { +\t\t\t\treturn 3; +\t\t\t} + +\t\t\tif ( button & 4 ) { +\t\t\t\treturn 2; +\t\t\t} + +\t\t\treturn 0; +\t\t} + +\t\treturn event.which; +\t} +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { +\tmouseenter: "mouseover", +\tmouseleave: "mouseout", +\tpointerenter: "pointerover", +\tpointerleave: "pointerout" +}, function( orig, fix ) { +\tjQuery.event.special[ orig ] = { +\t\tdelegateType: fix, +\t\tbindType: fix, + +\t\thandle: function( event ) { +\t\t\tvar ret, +\t\t\t\ttarget = this, +\t\t\t\trelated = event.relatedTarget, +\t\t\t\thandleObj = event.handleObj; + +\t\t\t// For mouseenter/leave call the handler if related is outside the target. +\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window +\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { +\t\t\t\tevent.type = handleObj.origType; +\t\t\t\tret = handleObj.handler.apply( this, arguments ); +\t\t\t\tevent.type = fix; +\t\t\t} +\t\t\treturn ret; +\t\t} +\t}; +} ); + +jQuery.fn.extend( { + +\ton: function( types, selector, data, fn ) { +\t\treturn on( this, types, selector, data, fn ); +\t}, +\tone: function( types, selector, data, fn ) { +\t\treturn on( this, types, selector, data, fn, 1 ); +\t}, +\toff: function( types, selector, fn ) { +\t\tvar handleObj, type; +\t\tif ( types && types.preventDefault && types.handleObj ) { + +\t\t\t// ( event ) dispatched jQuery.Event +\t\t\thandleObj = types.handleObj; +\t\t\tjQuery( types.delegateTarget ).off( +\t\t\t\thandleObj.namespace ? +\t\t\t\t\thandleObj.origType + "." + handleObj.namespace : +\t\t\t\t\thandleObj.origType, +\t\t\t\thandleObj.selector, +\t\t\t\thandleObj.handler +\t\t\t); +\t\t\treturn this; +\t\t} +\t\tif ( typeof types === "object" ) { + +\t\t\t// ( types-object [, selector] ) +\t\t\tfor ( type in types ) { +\t\t\t\tthis.off( type, selector, types[ type ] ); +\t\t\t} +\t\t\treturn this; +\t\t} +\t\tif ( selector === false || typeof selector === "function" ) { + +\t\t\t// ( types [, fn] ) +\t\t\tfn = selector; +\t\t\tselector = undefined; +\t\t} +\t\tif ( fn === false ) { +\t\t\tfn = returnFalse; +\t\t} +\t\treturn this.each( function() { +\t\t\tjQuery.event.remove( this, types, fn, selector ); +\t\t} ); +\t} +} ); + + +var + +\t/* eslint-disable max-len */ + +\t// See https://github.com/eslint/eslint/issues/3229 +\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi, + +\t/* eslint-enable */ + +\t// Support: IE <=10 - 11, Edge 12 - 13 +\t// In IE/Edge using regex groups here causes severe slowdowns. +\t// See https://connect.microsoft.com/IE/feedback/details/1736512/ +\trnoInnerhtml = /\\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { +\tif ( nodeName( elem, "table" ) && +\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + +\t\treturn jQuery( ">tbody", elem )[ 0 ] || elem; +\t} + +\treturn elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { +\telem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; +\treturn elem; +} +function restoreScript( elem ) { +\tvar match = rscriptTypeMasked.exec( elem.type ); + +\tif ( match ) { +\t\telem.type = match[ 1 ]; +\t} else { +\t\telem.removeAttribute( "type" ); +\t} + +\treturn elem; +} + +function cloneCopyEvent( src, dest ) { +\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + +\tif ( dest.nodeType !== 1 ) { +\t\treturn; +\t} + +\t// 1. Copy private data: events, handlers, etc. +\tif ( dataPriv.hasData( src ) ) { +\t\tpdataOld = dataPriv.access( src ); +\t\tpdataCur = dataPriv.set( dest, pdataOld ); +\t\tevents = pdataOld.events; + +\t\tif ( events ) { +\t\t\tdelete pdataCur.handle; +\t\t\tpdataCur.events = {}; + +\t\t\tfor ( type in events ) { +\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) { +\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] ); +\t\t\t\t} +\t\t\t} +\t\t} +\t} + +\t// 2. Copy user data +\tif ( dataUser.hasData( src ) ) { +\t\tudataOld = dataUser.access( src ); +\t\tudataCur = jQuery.extend( {}, udataOld ); + +\t\tdataUser.set( dest, udataCur ); +\t} +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { +\tvar nodeName = dest.nodeName.toLowerCase(); + +\t// Fails to persist the checked state of a cloned checkbox or radio button. +\tif ( nodeName === "input" && rcheckableType.test( src.type ) ) { +\t\tdest.checked = src.checked; + +\t// Fails to return the selected option to the default selected state when cloning options +\t} else if ( nodeName === "input" || nodeName === "textarea" ) { +\t\tdest.defaultValue = src.defaultValue; +\t} +} + +function domManip( collection, args, callback, ignored ) { + +\t// Flatten any nested arrays +\targs = concat.apply( [], args ); + +\tvar fragment, first, scripts, hasScripts, node, doc, +\t\ti = 0, +\t\tl = collection.length, +\t\tiNoClone = l - 1, +\t\tvalue = args[ 0 ], +\t\tisFunction = jQuery.isFunction( value ); + +\t// We can't cloneNode fragments that contain checked, in WebKit +\tif ( isFunction || +\t\t\t( l > 1 && typeof value === "string" && +\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) { +\t\treturn collection.each( function( index ) { +\t\t\tvar self = collection.eq( index ); +\t\t\tif ( isFunction ) { +\t\t\t\targs[ 0 ] = value.call( this, index, self.html() ); +\t\t\t} +\t\t\tdomManip( self, args, callback, ignored ); +\t\t} ); +\t} + +\tif ( l ) { +\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); +\t\tfirst = fragment.firstChild; + +\t\tif ( fragment.childNodes.length === 1 ) { +\t\t\tfragment = first; +\t\t} + +\t\t// Require either new content or an interest in ignored elements to invoke the callback +\t\tif ( first || ignored ) { +\t\t\tscripts = jQuery.map( getAll( fragment, "script" ), disableScript ); +\t\t\thasScripts = scripts.length; + +\t\t\t// Use the original fragment for the last item +\t\t\t// instead of the first because it can end up +\t\t\t// being emptied incorrectly in certain situations (#8070). +\t\t\tfor ( ; i < l; i++ ) { +\t\t\t\tnode = fragment; + +\t\t\t\tif ( i !== iNoClone ) { +\t\t\t\t\tnode = jQuery.clone( node, true, true ); + +\t\t\t\t\t// Keep references to cloned scripts for later restoration +\t\t\t\t\tif ( hasScripts ) { + +\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only +\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit +\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, "script" ) ); +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\tcallback.call( collection[ i ], node, i ); +\t\t\t} + +\t\t\tif ( hasScripts ) { +\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument; + +\t\t\t\t// Reenable scripts +\t\t\t\tjQuery.map( scripts, restoreScript ); + +\t\t\t\t// Evaluate executable scripts on first document insertion +\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) { +\t\t\t\t\tnode = scripts[ i ]; +\t\t\t\t\tif ( rscriptType.test( node.type || "" ) && +\t\t\t\t\t\t!dataPriv.access( node, "globalEval" ) && +\t\t\t\t\t\tjQuery.contains( doc, node ) ) { + +\t\t\t\t\t\tif ( node.src ) { + +\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present +\t\t\t\t\t\t\tif ( jQuery._evalUrl ) { +\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src ); +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} else { +\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, "" ), doc ); +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} +\t} + +\treturn collection; +} + +function remove( elem, selector, keepData ) { +\tvar node, +\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem, +\t\ti = 0; + +\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) { +\t\tif ( !keepData && node.nodeType === 1 ) { +\t\t\tjQuery.cleanData( getAll( node ) ); +\t\t} + +\t\tif ( node.parentNode ) { +\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) { +\t\t\t\tsetGlobalEval( getAll( node, "script" ) ); +\t\t\t} +\t\t\tnode.parentNode.removeChild( node ); +\t\t} +\t} + +\treturn elem; +} + +jQuery.extend( { +\thtmlPrefilter: function( html ) { +\t\treturn html.replace( rxhtmlTag, "<$1>" ); +\t}, + +\tclone: function( elem, dataAndEvents, deepDataAndEvents ) { +\t\tvar i, l, srcElements, destElements, +\t\t\tclone = elem.cloneNode( true ), +\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem ); + +\t\t// Fix IE cloning issues +\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && +\t\t\t\t!jQuery.isXMLDoc( elem ) ) { + +\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 +\t\t\tdestElements = getAll( clone ); +\t\t\tsrcElements = getAll( elem ); + +\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) { +\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] ); +\t\t\t} +\t\t} + +\t\t// Copy the events from the original to the clone +\t\tif ( dataAndEvents ) { +\t\t\tif ( deepDataAndEvents ) { +\t\t\t\tsrcElements = srcElements || getAll( elem ); +\t\t\t\tdestElements = destElements || getAll( clone ); + +\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) { +\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] ); +\t\t\t\t} +\t\t\t} else { +\t\t\t\tcloneCopyEvent( elem, clone ); +\t\t\t} +\t\t} + +\t\t// Preserve script evaluation history +\t\tdestElements = getAll( clone, "script" ); +\t\tif ( destElements.length > 0 ) { +\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); +\t\t} + +\t\t// Return the cloned set +\t\treturn clone; +\t}, + +\tcleanData: function( elems ) { +\t\tvar data, elem, type, +\t\t\tspecial = jQuery.event.special, +\t\t\ti = 0; + +\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { +\t\t\tif ( acceptData( elem ) ) { +\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) { +\t\t\t\t\tif ( data.events ) { +\t\t\t\t\t\tfor ( type in data.events ) { +\t\t\t\t\t\t\tif ( special[ type ] ) { +\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type ); + +\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead +\t\t\t\t\t\t\t} else { +\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle ); +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t} + +\t\t\t\t\t// Support: Chrome <=35 - 45+ +\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove +\t\t\t\t\telem[ dataPriv.expando ] = undefined; +\t\t\t\t} +\t\t\t\tif ( elem[ dataUser.expando ] ) { + +\t\t\t\t\t// Support: Chrome <=35 - 45+ +\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove +\t\t\t\t\telem[ dataUser.expando ] = undefined; +\t\t\t\t} +\t\t\t} +\t\t} +\t} +} ); + +jQuery.fn.extend( { +\tdetach: function( selector ) { +\t\treturn remove( this, selector, true ); +\t}, + +\tremove: function( selector ) { +\t\treturn remove( this, selector ); +\t}, + +\ttext: function( value ) { +\t\treturn access( this, function( value ) { +\t\t\treturn value === undefined ? +\t\t\t\tjQuery.text( this ) : +\t\t\t\tthis.empty().each( function() { +\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { +\t\t\t\t\t\tthis.textContent = value; +\t\t\t\t\t} +\t\t\t\t} ); +\t\t}, null, value, arguments.length ); +\t}, + +\tappend: function() { +\t\treturn domManip( this, arguments, function( elem ) { +\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { +\t\t\t\tvar target = manipulationTarget( this, elem ); +\t\t\t\ttarget.appendChild( elem ); +\t\t\t} +\t\t} ); +\t}, + +\tprepend: function() { +\t\treturn domManip( this, arguments, function( elem ) { +\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { +\t\t\t\tvar target = manipulationTarget( this, elem ); +\t\t\t\ttarget.insertBefore( elem, target.firstChild ); +\t\t\t} +\t\t} ); +\t}, + +\tbefore: function() { +\t\treturn domManip( this, arguments, function( elem ) { +\t\t\tif ( this.parentNode ) { +\t\t\t\tthis.parentNode.insertBefore( elem, this ); +\t\t\t} +\t\t} ); +\t}, + +\tafter: function() { +\t\treturn domManip( this, arguments, function( elem ) { +\t\t\tif ( this.parentNode ) { +\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling ); +\t\t\t} +\t\t} ); +\t}, + +\tempty: function() { +\t\tvar elem, +\t\t\ti = 0; + +\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) { +\t\t\tif ( elem.nodeType === 1 ) { + +\t\t\t\t// Prevent memory leaks +\t\t\t\tjQuery.cleanData( getAll( elem, false ) ); + +\t\t\t\t// Remove any remaining nodes +\t\t\t\telem.textContent = ""; +\t\t\t} +\t\t} + +\t\treturn this; +\t}, + +\tclone: function( dataAndEvents, deepDataAndEvents ) { +\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents; +\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + +\t\treturn this.map( function() { +\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents ); +\t\t} ); +\t}, + +\thtml: function( value ) { +\t\treturn access( this, function( value ) { +\t\t\tvar elem = this[ 0 ] || {}, +\t\t\t\ti = 0, +\t\t\t\tl = this.length; + +\t\t\tif ( value === undefined && elem.nodeType === 1 ) { +\t\t\t\treturn elem.innerHTML; +\t\t\t} + +\t\t\t// See if we can take a shortcut and just use innerHTML +\t\t\tif ( typeof value === "string" && !rnoInnerhtml.test( value ) && +\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + +\t\t\t\tvalue = jQuery.htmlPrefilter( value ); + +\t\t\t\ttry { +\t\t\t\t\tfor ( ; i < l; i++ ) { +\t\t\t\t\t\telem = this[ i ] || {}; + +\t\t\t\t\t\t// Remove element nodes and prevent memory leaks +\t\t\t\t\t\tif ( elem.nodeType === 1 ) { +\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) ); +\t\t\t\t\t\t\telem.innerHTML = value; +\t\t\t\t\t\t} +\t\t\t\t\t} + +\t\t\t\t\telem = 0; + +\t\t\t\t// If using innerHTML throws an exception, use the fallback method +\t\t\t\t} catch ( e ) {} +\t\t\t} + +\t\t\tif ( elem ) { +\t\t\t\tthis.empty().append( value ); +\t\t\t} +\t\t}, null, value, arguments.length ); +\t}, + +\treplaceWith: function() { +\t\tvar ignored = []; + +\t\t// Make the changes, replacing each non-ignored context element with the new content +\t\treturn domManip( this, arguments, function( elem ) { +\t\t\tvar parent = this.parentNode; + +\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) { +\t\t\t\tjQuery.cleanData( getAll( this ) ); +\t\t\t\tif ( parent ) { +\t\t\t\t\tparent.replaceChild( elem, this ); +\t\t\t\t} +\t\t\t} + +\t\t// Force callback invocation +\t\t}, ignored ); +\t} +} ); + +jQuery.each( { +\tappendTo: "append", +\tprependTo: "prepend", +\tinsertBefore: "before", +\tinsertAfter: "after", +\treplaceAll: "replaceWith" +}, function( name, original ) { +\tjQuery.fn[ name ] = function( selector ) { +\t\tvar elems, +\t\t\tret = [], +\t\t\tinsert = jQuery( selector ), +\t\t\tlast = insert.length - 1, +\t\t\ti = 0; + +\t\tfor ( ; i <= last; i++ ) { +\t\t\telems = i === last ? this : this.clone( true ); +\t\t\tjQuery( insert[ i ] )[ original ]( elems ); + +\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only +\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit +\t\t\tpush.apply( ret, elems.get() ); +\t\t} + +\t\treturn this.pushStack( ret ); +\t}; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + +\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150) +\t\t// IE throws on elements created in popups +\t\t// FF meanwhile throws on frame elements through "defaultView.getComputedStyle" +\t\tvar view = elem.ownerDocument.defaultView; + +\t\tif ( !view || !view.opener ) { +\t\t\tview = window; +\t\t} + +\t\treturn view.getComputedStyle( elem ); +\t}; + + + +( function() { + +\t// Executing both pixelPosition & boxSizingReliable tests require only one layout +\t// so they're executed at the same time to save the second computation. +\tfunction computeStyleTests() { + +\t\t// This is a singleton, we need to execute it only once +\t\tif ( !div ) { +\t\t\treturn; +\t\t} + +\t\tdiv.style.cssText = +\t\t\t"box-sizing:border-box;" + +\t\t\t"position:relative;display:block;" + +\t\t\t"margin:auto;border:1px;padding:1px;" + +\t\t\t"top:1%;width:50%"; +\t\tdiv.innerHTML = ""; +\t\tdocumentElement.appendChild( container ); + +\t\tvar divStyle = window.getComputedStyle( div ); +\t\tpixelPositionVal = divStyle.top !== "1%"; + +\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 +\t\treliableMarginLeftVal = divStyle.marginLeft === "2px"; +\t\tboxSizingReliableVal = divStyle.width === "4px"; + +\t\t// Support: Android 4.0 - 4.3 only +\t\t// Some styles come back with percentage values, even though they shouldn't +\t\tdiv.style.marginRight = "50%"; +\t\tpixelMarginRightVal = divStyle.marginRight === "4px"; + +\t\tdocumentElement.removeChild( container ); + +\t\t// Nullify the div so it wouldn't be stored in the memory and +\t\t// it will also be a sign that checks already performed +\t\tdiv = null; +\t} + +\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, +\t\tcontainer = document.createElement( "div" ), +\t\tdiv = document.createElement( "div" ); + +\t// Finish early in limited (non-browser) environments +\tif ( !div.style ) { +\t\treturn; +\t} + +\t// Support: IE <=9 - 11 only +\t// Style of cloned element affects source element cloned (#8908) +\tdiv.style.backgroundClip = "content-box"; +\tdiv.cloneNode( true ).style.backgroundClip = ""; +\tsupport.clearCloneStyle = div.style.backgroundClip === "content-box"; + +\tcontainer.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + +\t\t"padding:0;margin-top:1px;position:absolute"; +\tcontainer.appendChild( div ); + +\tjQuery.extend( support, { +\t\tpixelPosition: function() { +\t\t\tcomputeStyleTests(); +\t\t\treturn pixelPositionVal; +\t\t}, +\t\tboxSizingReliable: function() { +\t\t\tcomputeStyleTests(); +\t\t\treturn boxSizingReliableVal; +\t\t}, +\t\tpixelMarginRight: function() { +\t\t\tcomputeStyleTests(); +\t\t\treturn pixelMarginRightVal; +\t\t}, +\t\treliableMarginLeft: function() { +\t\t\tcomputeStyleTests(); +\t\t\treturn reliableMarginLeftVal; +\t\t} +\t} ); +} )(); + + +function curCSS( elem, name, computed ) { +\tvar width, minWidth, maxWidth, ret, + +\t\t// Support: Firefox 51+ +\t\t// Retrieving style before computed somehow +\t\t// fixes an issue with getting wrong values +\t\t// on detached elements +\t\tstyle = elem.style; + +\tcomputed = computed || getStyles( elem ); + +\t// getPropertyValue is needed for: +\t// .css('filter') (IE 9 only, #12537) +\t// .css('--customProperty) (#3144) +\tif ( computed ) { +\t\tret = computed.getPropertyValue( name ) || computed[ name ]; + +\t\tif ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { +\t\t\tret = jQuery.style( elem, name ); +\t\t} + +\t\t// A tribute to the "awesome hack by Dean Edwards" +\t\t// Android Browser returns percentage for some values, +\t\t// but width seems to be reliably pixels. +\t\t// This is against the CSSOM draft spec: +\t\t// https://drafts.csswg.org/cssom/#resolved-values +\t\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + +\t\t\t// Remember the original values +\t\t\twidth = style.width; +\t\t\tminWidth = style.minWidth; +\t\t\tmaxWidth = style.maxWidth; + +\t\t\t// Put in the new values to get a computed value out +\t\t\tstyle.minWidth = style.maxWidth = style.width = ret; +\t\t\tret = computed.width; + +\t\t\t// Revert the changed values +\t\t\tstyle.width = width; +\t\t\tstyle.minWidth = minWidth; +\t\t\tstyle.maxWidth = maxWidth; +\t\t} +\t} + +\treturn ret !== undefined ? + +\t\t// Support: IE <=9 - 11 only +\t\t// IE returns zIndex value as an integer. +\t\tret + "" : +\t\tret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + +\t// Define the hook, we'll check on the first run if it's really needed. +\treturn { +\t\tget: function() { +\t\t\tif ( conditionFn() ) { + +\t\t\t\t// Hook not needed (or it's not possible to use it due +\t\t\t\t// to missing dependency), remove it. +\t\t\t\tdelete this.get; +\t\t\t\treturn; +\t\t\t} + +\t\t\t// Hook needed; redefine it so that the support test is not executed again. +\t\t\treturn ( this.get = hookFn ).apply( this, arguments ); +\t\t} +\t}; +} + + +var + +\t// Swappable if display is none or starts with table +\t// except "table", "table-cell", or "table-caption" +\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display +\trdisplayswap = /^(none|table(?!-c[ea]).+)/, +\trcustomProp = /^--/, +\tcssShow = { position: "absolute", visibility: "hidden", display: "block" }, +\tcssNormalTransform = { +\t\tletterSpacing: "0", +\t\tfontWeight: "400" +\t}, + +\tcssPrefixes = [ "Webkit", "Moz", "ms" ], +\temptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + +\t// Shortcut for names that are not vendor prefixed +\tif ( name in emptyStyle ) { +\t\treturn name; +\t} + +\t// Check for vendor prefixed names +\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ), +\t\ti = cssPrefixes.length; + +\twhile ( i-- ) { +\t\tname = cssPrefixes[ i ] + capName; +\t\tif ( name in emptyStyle ) { +\t\t\treturn name; +\t\t} +\t} +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { +\tvar ret = jQuery.cssProps[ name ]; +\tif ( !ret ) { +\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; +\t} +\treturn ret; +} + +function setPositiveNumber( elem, value, subtract ) { + +\t// Any relative (+/-) values have already been +\t// normalized at this point +\tvar matches = rcssNum.exec( value ); +\treturn matches ? + +\t\t// Guard against undefined "subtract", e.g., when used as in cssHooks +\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : +\t\tvalue; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { +\tvar i, +\t\tval = 0; + +\t// If we already have the right measurement, avoid augmentation +\tif ( extra === ( isBorderBox ? "border" : "content" ) ) { +\t\ti = 4; + +\t// Otherwise initialize for horizontal or vertical properties +\t} else { +\t\ti = name === "width" ? 1 : 0; +\t} + +\tfor ( ; i < 4; i += 2 ) { + +\t\t// Both box models exclude margin, so add it if we want it +\t\tif ( extra === "margin" ) { +\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); +\t\t} + +\t\tif ( isBorderBox ) { + +\t\t\t// border-box includes padding, so remove it if we want content +\t\t\tif ( extra === "content" ) { +\t\t\t\tval -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); +\t\t\t} + +\t\t\t// At this point, extra isn't border nor margin, so remove border +\t\t\tif ( extra !== "margin" ) { +\t\t\t\tval -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); +\t\t\t} +\t\t} else { + +\t\t\t// At this point, extra isn't content, so add padding +\t\t\tval += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + +\t\t\t// At this point, extra isn't content nor padding, so add border +\t\t\tif ( extra !== "padding" ) { +\t\t\t\tval += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); +\t\t\t} +\t\t} +\t} + +\treturn val; +} + +function getWidthOrHeight( elem, name, extra ) { + +\t// Start with computed style +\tvar valueIsBorderBox, +\t\tstyles = getStyles( elem ), +\t\tval = curCSS( elem, name, styles ), +\t\tisBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + +\t// Computed unit is not pixels. Stop here and return. +\tif ( rnumnonpx.test( val ) ) { +\t\treturn val; +\t} + +\t// Check for style in case a browser which returns unreliable values +\t// for getComputedStyle silently falls back to the reliable elem.style +\tvalueIsBorderBox = isBorderBox && +\t\t( support.boxSizingReliable() || val === elem.style[ name ] ); + +\t// Fall back to offsetWidth/Height when value is "auto" +\t// This happens for inline elements with no explicit setting (gh-3571) +\tif ( val === "auto" ) { +\t\tval = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; +\t} + +\t// Normalize "", auto, and prepare for extra +\tval = parseFloat( val ) || 0; + +\t// Use the active box-sizing model to add/subtract irrelevant styles +\treturn ( val + +\t\taugmentWidthOrHeight( +\t\t\telem, +\t\t\tname, +\t\t\textra || ( isBorderBox ? "border" : "content" ), +\t\t\tvalueIsBorderBox, +\t\t\tstyles +\t\t) +\t) + "px"; +} + +jQuery.extend( { + +\t// Add in style property hooks for overriding the default +\t// behavior of getting and setting a style property +\tcssHooks: { +\t\topacity: { +\t\t\tget: function( elem, computed ) { +\t\t\t\tif ( computed ) { + +\t\t\t\t\t// We should always get a number back from opacity +\t\t\t\t\tvar ret = curCSS( elem, "opacity" ); +\t\t\t\t\treturn ret === "" ? "1" : ret; +\t\t\t\t} +\t\t\t} +\t\t} +\t}, + +\t// Don\'t automatically add "px" to these possibly-unitless properties +\tcssNumber: { +\t\t"animationIterationCount": true, +\t\t"columnCount": true, +\t\t"fillOpacity": true, +\t\t"flexGrow": true, +\t\t"flexShrink": true, +\t\t"fontWeight": true, +\t\t"lineHeight": true, +\t\t"opacity": true, +\t\t"order": true, +\t\t"orphans": true, +\t\t"widows": true, +\t\t"zIndex": true, +\t\t"zoom": true +\t}, + +\t// Add in properties whose names you wish to fix before +\t// setting or getting the value +\tcssProps: { +\t\t"float": "cssFloat" +\t}, + +\t// Get and set the style property on a DOM Node +\tstyle: function( elem, name, value, extra ) { + +\t\t// Don't set styles on text and comment nodes +\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { +\t\t\treturn; +\t\t} + +\t\t// Make sure that we're working with the right name +\t\tvar ret, type, hooks, +\t\t\torigName = jQuery.camelCase( name ), +\t\t\tisCustomProp = rcustomProp.test( name ), +\t\t\tstyle = elem.style; + +\t\t// Make sure that we're working with the right name. We don't +\t\t// want to query the value if it is a CSS custom property +\t\t// since they are user-defined. +\t\tif ( !isCustomProp ) { +\t\t\tname = finalPropName( origName ); +\t\t} + +\t\t// Gets hook for the prefixed version, then unprefixed version +\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + +\t\t// Check if we're setting a value +\t\tif ( value !== undefined ) { +\t\t\ttype = typeof value; + +\t\t\t// Convert "+=" or "-=" to relative numbers (#7345) +\t\t\tif ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { +\t\t\t\tvalue = adjustCSS( elem, name, ret ); + +\t\t\t\t// Fixes bug #9237 +\t\t\t\ttype = "number"; +\t\t\t} + +\t\t\t// Make sure that null and NaN values aren't set (#7116) +\t\t\tif ( value == null || value !== value ) { +\t\t\t\treturn; +\t\t\t} + +\t\t\t// If a number was passed in, add the unit (except for certain CSS properties) +\t\t\tif ( type === "number" ) { +\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); +\t\t\t} + +\t\t\t// background-* props affect original clone's values +\t\t\tif ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { +\t\t\t\tstyle[ name ] = "inherit"; +\t\t\t} + +\t\t\t// If a hook was provided, use that value, otherwise just set the specified value +\t\t\tif ( !hooks || !( "set" in hooks ) || +\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) { + +\t\t\t\tif ( isCustomProp ) { +\t\t\t\t\tstyle.setProperty( name, value ); +\t\t\t\t} else { +\t\t\t\t\tstyle[ name ] = value; +\t\t\t\t} +\t\t\t} + +\t\t} else { + +\t\t\t// If a hook was provided get the non-computed value from there +\t\t\tif ( hooks && "get" in hooks && +\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + +\t\t\t\treturn ret; +\t\t\t} + +\t\t\t// Otherwise just get the value from the style object +\t\t\treturn style[ name ]; +\t\t} +\t}, + +\tcss: function( elem, name, extra, styles ) { +\t\tvar val, num, hooks, +\t\t\torigName = jQuery.camelCase( name ), +\t\t\tisCustomProp = rcustomProp.test( name ); + +\t\t// Make sure that we're working with the right name. We don't +\t\t// want to modify the value if it is a CSS custom property +\t\t// since they are user-defined. +\t\tif ( !isCustomProp ) { +\t\t\tname = finalPropName( origName ); +\t\t} + +\t\t// Try prefixed name followed by the unprefixed name +\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + +\t\t// If a hook was provided get the computed value from there +\t\tif ( hooks && "get" in hooks ) { +\t\t\tval = hooks.get( elem, true, extra ); +\t\t} + +\t\t// Otherwise, if a way to get the computed value exists, use that +\t\tif ( val === undefined ) { +\t\t\tval = curCSS( elem, name, styles ); +\t\t} + +\t\t// Convert "normal" to computed value +\t\tif ( val === "normal" && name in cssNormalTransform ) { +\t\t\tval = cssNormalTransform[ name ]; +\t\t} + +\t\t// Make numeric if forced or a qualifier was provided and val looks numeric +\t\tif ( extra === "" || extra ) { +\t\t\tnum = parseFloat( val ); +\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val; +\t\t} + +\t\treturn val; +\t} +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { +\tjQuery.cssHooks[ name ] = { +\t\tget: function( elem, computed, extra ) { +\t\t\tif ( computed ) { + +\t\t\t\t// Certain elements can have dimension info if we invisibly show them +\t\t\t\t// but it must have a current display style that would benefit +\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, "display" ) ) && + +\t\t\t\t\t// Support: Safari 8+ +\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero +\t\t\t\t\t// getBoundingClientRect().width unless display is changed. +\t\t\t\t\t// Support: IE <=11 only +\t\t\t\t\t// Running getBoundingClientRect on a disconnected node +\t\t\t\t\t// in IE throws an error. +\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? +\t\t\t\t\t\tswap( elem, cssShow, function() { +\t\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra ); +\t\t\t\t\t\t} ) : +\t\t\t\t\t\tgetWidthOrHeight( elem, name, extra ); +\t\t\t} +\t\t}, + +\t\tset: function( elem, value, extra ) { +\t\t\tvar matches, +\t\t\t\tstyles = extra && getStyles( elem ), +\t\t\t\tsubtract = extra && augmentWidthOrHeight( +\t\t\t\t\telem, +\t\t\t\t\tname, +\t\t\t\t\textra, +\t\t\t\t\tjQuery.css( elem, "boxSizing", false, styles ) === "border-box", +\t\t\t\t\tstyles +\t\t\t\t); + +\t\t\t// Convert to pixels if value adjustment is needed +\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) && +\t\t\t\t( matches[ 3 ] || "px" ) !== "px" ) { + +\t\t\t\telem.style[ name ] = value; +\t\t\t\tvalue = jQuery.css( elem, name ); +\t\t\t} + +\t\t\treturn setPositiveNumber( elem, value, subtract ); +\t\t} +\t}; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, +\tfunction( elem, computed ) { +\t\tif ( computed ) { +\t\t\treturn ( parseFloat( curCSS( elem, "marginLeft" ) ) || +\t\t\t\telem.getBoundingClientRect().left - +\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() { +\t\t\t\t\t\treturn elem.getBoundingClientRect().left; +\t\t\t\t\t} ) +\t\t\t\t) + "px"; +\t\t} +\t} +); + +// These hooks are used by animate to expand properties +jQuery.each( { +\tmargin: "", +\tpadding: "", +\tborder: "Width" +}, function( prefix, suffix ) { +\tjQuery.cssHooks[ prefix + suffix ] = { +\t\texpand: function( value ) { +\t\t\tvar i = 0, +\t\t\t\texpanded = {}, + +\t\t\t\t// Assumes a single number if not a string +\t\t\t\tparts = typeof value === "string" ? value.split( " " ) : [ value ]; + +\t\t\tfor ( ; i < 4; i++ ) { +\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] = +\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ]; +\t\t\t} + +\t\t\treturn expanded; +\t\t} +\t}; + +\tif ( !rmargin.test( prefix ) ) { +\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; +\t} +} ); + +jQuery.fn.extend( { +\tcss: function( name, value ) { +\t\treturn access( this, function( elem, name, value ) { +\t\t\tvar styles, len, +\t\t\t\tmap = {}, +\t\t\t\ti = 0; + +\t\t\tif ( Array.isArray( name ) ) { +\t\t\t\tstyles = getStyles( elem ); +\t\t\t\tlen = name.length; + +\t\t\t\tfor ( ; i < len; i++ ) { +\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); +\t\t\t\t} + +\t\t\t\treturn map; +\t\t\t} + +\t\t\treturn value !== undefined ? +\t\t\t\tjQuery.style( elem, name, value ) : +\t\t\t\tjQuery.css( elem, name ); +\t\t}, name, value, arguments.length > 1 ); +\t} +} ); + + +function Tween( elem, options, prop, end, easing ) { +\treturn new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { +\tconstructor: Tween, +\tinit: function( elem, options, prop, end, easing, unit ) { +\t\tthis.elem = elem; +\t\tthis.prop = prop; +\t\tthis.easing = easing || jQuery.easing._default; +\t\tthis.options = options; +\t\tthis.start = this.now = this.cur(); +\t\tthis.end = end; +\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); +\t}, +\tcur: function() { +\t\tvar hooks = Tween.propHooks[ this.prop ]; + +\t\treturn hooks && hooks.get ? +\t\t\thooks.get( this ) : +\t\t\tTween.propHooks._default.get( this ); +\t}, +\trun: function( percent ) { +\t\tvar eased, +\t\t\thooks = Tween.propHooks[ this.prop ]; + +\t\tif ( this.options.duration ) { +\t\t\tthis.pos = eased = jQuery.easing[ this.easing ]( +\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration +\t\t\t); +\t\t} else { +\t\t\tthis.pos = eased = percent; +\t\t} +\t\tthis.now = ( this.end - this.start ) * eased + this.start; + +\t\tif ( this.options.step ) { +\t\t\tthis.options.step.call( this.elem, this.now, this ); +\t\t} + +\t\tif ( hooks && hooks.set ) { +\t\t\thooks.set( this ); +\t\t} else { +\t\t\tTween.propHooks._default.set( this ); +\t\t} +\t\treturn this; +\t} +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { +\t_default: { +\t\tget: function( tween ) { +\t\t\tvar result; + +\t\t\t// Use a property on the element directly when it is not a DOM element, +\t\t\t// or when there is no matching style property that exists. +\t\t\tif ( tween.elem.nodeType !== 1 || +\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { +\t\t\t\treturn tween.elem[ tween.prop ]; +\t\t\t} + +\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically +\t\t\t// attempt a parseFloat and fallback to a string if the parse fails. +\t\t\t// Simple values such as "10px" are parsed to Float; +\t\t\t// complex values such as "rotate(1rad)" are returned as-is. +\t\t\tresult = jQuery.css( tween.elem, tween.prop, "" ); + +\t\t\t// Empty strings, null, undefined and "auto" are converted to 0. +\t\t\treturn !result || result === "auto" ? 0 : result; +\t\t}, +\t\tset: function( tween ) { + +\t\t\t// Use step hook for back compat. +\t\t\t// Use cssHook if its there. +\t\t\t// Use .style if available and use plain properties where available. +\t\t\tif ( jQuery.fx.step[ tween.prop ] ) { +\t\t\t\tjQuery.fx.step[ tween.prop ]( tween ); +\t\t\t} else if ( tween.elem.nodeType === 1 && +\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || +\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) { +\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); +\t\t\t} else { +\t\t\t\ttween.elem[ tween.prop ] = tween.now; +\t\t\t} +\t\t} +\t} +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { +\tset: function( tween ) { +\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) { +\t\t\ttween.elem[ tween.prop ] = tween.now; +\t\t} +\t} +}; + +jQuery.easing = { +\tlinear: function( p ) { +\t\treturn p; +\t}, +\tswing: function( p ) { +\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2; +\t}, +\t_default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var +\tfxNow, inProgress, +\trfxtypes = /^(?:toggle|show|hide)$/, +\trrun = /queueHooks$/; + +function schedule() { +\tif ( inProgress ) { +\t\tif ( document.hidden === false && window.requestAnimationFrame ) { +\t\t\twindow.requestAnimationFrame( schedule ); +\t\t} else { +\t\t\twindow.setTimeout( schedule, jQuery.fx.interval ); +\t\t} + +\t\tjQuery.fx.tick(); +\t} +} + +// Animations created synchronously will run synchronously +function createFxNow() { +\twindow.setTimeout( function() { +\t\tfxNow = undefined; +\t} ); +\treturn ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { +\tvar which, +\t\ti = 0, +\t\tattrs = { height: type }; + +\t// If we include width, step value is 1 to do all cssExpand values, +\t// otherwise step value is 2 to skip over Left and Right +\tincludeWidth = includeWidth ? 1 : 0; +\tfor ( ; i < 4; i += 2 - includeWidth ) { +\t\twhich = cssExpand[ i ]; +\t\tattrs[ "margin" + which ] = attrs[ "padding" + which ] = type; +\t} + +\tif ( includeWidth ) { +\t\tattrs.opacity = attrs.width = type; +\t} + +\treturn attrs; +} + +function createTween( value, prop, animation ) { +\tvar tween, +\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), +\t\tindex = 0, +\t\tlength = collection.length; +\tfor ( ; index < length; index++ ) { +\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + +\t\t\t// We're done with this property +\t\t\treturn tween; +\t\t} +\t} +} + +function defaultPrefilter( elem, props, opts ) { +\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, +\t\tisBox = "width" in props || "height" in props, +\t\tanim = this, +\t\torig = {}, +\t\tstyle = elem.style, +\t\thidden = elem.nodeType && isHiddenWithinTree( elem ), +\t\tdataShow = dataPriv.get( elem, "fxshow" ); + +\t// Queue-skipping animations hijack the fx hooks +\tif ( !opts.queue ) { +\t\thooks = jQuery._queueHooks( elem, "fx" ); +\t\tif ( hooks.unqueued == null ) { +\t\t\thooks.unqueued = 0; +\t\t\toldfire = hooks.empty.fire; +\t\t\thooks.empty.fire = function() { +\t\t\t\tif ( !hooks.unqueued ) { +\t\t\t\t\toldfire(); +\t\t\t\t} +\t\t\t}; +\t\t} +\t\thooks.unqueued++; + +\t\tanim.always( function() { + +\t\t\t// Ensure the complete handler is called before this completes +\t\t\tanim.always( function() { +\t\t\t\thooks.unqueued--; +\t\t\t\tif ( !jQuery.queue( elem, "fx" ).length ) { +\t\t\t\t\thooks.empty.fire(); +\t\t\t\t} +\t\t\t} ); +\t\t} ); +\t} + +\t// Detect show/hide animations +\tfor ( prop in props ) { +\t\tvalue = props[ prop ]; +\t\tif ( rfxtypes.test( value ) ) { +\t\t\tdelete props[ prop ]; +\t\t\ttoggle = toggle || value === "toggle"; +\t\t\tif ( value === ( hidden ? "hide" : "show" ) ) { + +\t\t\t\t// Pretend to be hidden if this is a "show" and +\t\t\t\t// there is still data from a stopped show/hide +\t\t\t\tif ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { +\t\t\t\t\thidden = true; + +\t\t\t\t// Ignore all other no-op show/hide data +\t\t\t\t} else { +\t\t\t\t\tcontinue; +\t\t\t\t} +\t\t\t} +\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); +\t\t} +\t} + +\t// Bail out if this is a no-op like .hide().hide() +\tpropTween = !jQuery.isEmptyObject( props ); +\tif ( !propTween && jQuery.isEmptyObject( orig ) ) { +\t\treturn; +\t} + +\t// Restrict "overflow" and "display" styles during box animations +\tif ( isBox && elem.nodeType === 1 ) { + +\t\t// Support: IE <=9 - 11, Edge 12 - 13 +\t\t// Record all 3 overflow attributes because IE does not infer the shorthand +\t\t// from identically-valued overflowX and overflowY +\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + +\t\t// Identify a display type, preferring old show/hide data over the CSS cascade +\t\trestoreDisplay = dataShow && dataShow.display; +\t\tif ( restoreDisplay == null ) { +\t\t\trestoreDisplay = dataPriv.get( elem, "display" ); +\t\t} +\t\tdisplay = jQuery.css( elem, "display" ); +\t\tif ( display === "none" ) { +\t\t\tif ( restoreDisplay ) { +\t\t\t\tdisplay = restoreDisplay; +\t\t\t} else { + +\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility +\t\t\t\tshowHide( [ elem ], true ); +\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay; +\t\t\t\tdisplay = jQuery.css( elem, "display" ); +\t\t\t\tshowHide( [ elem ] ); +\t\t\t} +\t\t} + +\t\t// Animate inline elements as inline-block +\t\tif ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { +\t\t\tif ( jQuery.css( elem, "float" ) === "none" ) { + +\t\t\t\t// Restore the original display value at the end of pure show/hide animations +\t\t\t\tif ( !propTween ) { +\t\t\t\t\tanim.done( function() { +\t\t\t\t\t\tstyle.display = restoreDisplay; +\t\t\t\t\t} ); +\t\t\t\t\tif ( restoreDisplay == null ) { +\t\t\t\t\t\tdisplay = style.display; +\t\t\t\t\t\trestoreDisplay = display === "none" ? "" : display; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t\tstyle.display = "inline-block"; +\t\t\t} +\t\t} +\t} + +\tif ( opts.overflow ) { +\t\tstyle.overflow = "hidden"; +\t\tanim.always( function() { +\t\t\tstyle.overflow = opts.overflow[ 0 ]; +\t\t\tstyle.overflowX = opts.overflow[ 1 ]; +\t\t\tstyle.overflowY = opts.overflow[ 2 ]; +\t\t} ); +\t} + +\t// Implement show/hide animations +\tpropTween = false; +\tfor ( prop in orig ) { + +\t\t// General show/hide setup for this element animation +\t\tif ( !propTween ) { +\t\t\tif ( dataShow ) { +\t\t\t\tif ( "hidden" in dataShow ) { +\t\t\t\t\thidden = dataShow.hidden; +\t\t\t\t} +\t\t\t} else { +\t\t\t\tdataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); +\t\t\t} + +\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` "reverses" +\t\t\tif ( toggle ) { +\t\t\t\tdataShow.hidden = !hidden; +\t\t\t} + +\t\t\t// Show elements before animating them +\t\t\tif ( hidden ) { +\t\t\t\tshowHide( [ elem ], true ); +\t\t\t} + +\t\t\t/* eslint-disable no-loop-func */ + +\t\t\tanim.done( function() { + +\t\t\t/* eslint-enable no-loop-func */ + +\t\t\t\t// The final step of a "hide" animation is actually hiding the element +\t\t\t\tif ( !hidden ) { +\t\t\t\t\tshowHide( [ elem ] ); +\t\t\t\t} +\t\t\t\tdataPriv.remove( elem, "fxshow" ); +\t\t\t\tfor ( prop in orig ) { +\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] ); +\t\t\t\t} +\t\t\t} ); +\t\t} + +\t\t// Per-property setup +\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); +\t\tif ( !( prop in dataShow ) ) { +\t\t\tdataShow[ prop ] = propTween.start; +\t\t\tif ( hidden ) { +\t\t\t\tpropTween.end = propTween.start; +\t\t\t\tpropTween.start = 0; +\t\t\t} +\t\t} +\t} +} + +function propFilter( props, specialEasing ) { +\tvar index, name, easing, value, hooks; + +\t// camelCase, specialEasing and expand cssHook pass +\tfor ( index in props ) { +\t\tname = jQuery.camelCase( index ); +\t\teasing = specialEasing[ name ]; +\t\tvalue = props[ index ]; +\t\tif ( Array.isArray( value ) ) { +\t\t\teasing = value[ 1 ]; +\t\t\tvalue = props[ index ] = value[ 0 ]; +\t\t} + +\t\tif ( index !== name ) { +\t\t\tprops[ name ] = value; +\t\t\tdelete props[ index ]; +\t\t} + +\t\thooks = jQuery.cssHooks[ name ]; +\t\tif ( hooks && "expand" in hooks ) { +\t\t\tvalue = hooks.expand( value ); +\t\t\tdelete props[ name ]; + +\t\t\t// Not quite $.extend, this won't overwrite existing keys. +\t\t\t// Reusing \'index\' because we have the correct "name" +\t\t\tfor ( index in value ) { +\t\t\t\tif ( !( index in props ) ) { +\t\t\t\t\tprops[ index ] = value[ index ]; +\t\t\t\t\tspecialEasing[ index ] = easing; +\t\t\t\t} +\t\t\t} +\t\t} else { +\t\t\tspecialEasing[ name ] = easing; +\t\t} +\t} +} + +function Animation( elem, properties, options ) { +\tvar result, +\t\tstopped, +\t\tindex = 0, +\t\tlength = Animation.prefilters.length, +\t\tdeferred = jQuery.Deferred().always( function() { + +\t\t\t// Don't match elem in the :animated selector +\t\t\tdelete tick.elem; +\t\t} ), +\t\ttick = function() { +\t\t\tif ( stopped ) { +\t\t\t\treturn false; +\t\t\t} +\t\t\tvar currentTime = fxNow || createFxNow(), +\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + +\t\t\t\t// Support: Android 2.3 only +\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) +\t\t\t\ttemp = remaining / animation.duration || 0, +\t\t\t\tpercent = 1 - temp, +\t\t\t\tindex = 0, +\t\t\t\tlength = animation.tweens.length; + +\t\t\tfor ( ; index < length; index++ ) { +\t\t\t\tanimation.tweens[ index ].run( percent ); +\t\t\t} + +\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] ); + +\t\t\t// If there's more to do, yield +\t\t\tif ( percent < 1 && length ) { +\t\t\t\treturn remaining; +\t\t\t} + +\t\t\t// If this was an empty animation, synthesize a final progress notification +\t\t\tif ( !length ) { +\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] ); +\t\t\t} + +\t\t\t// Resolve the animation and report its conclusion +\t\t\tdeferred.resolveWith( elem, [ animation ] ); +\t\t\treturn false; +\t\t}, +\t\tanimation = deferred.promise( { +\t\t\telem: elem, +\t\t\tprops: jQuery.extend( {}, properties ), +\t\t\topts: jQuery.extend( true, { +\t\t\t\tspecialEasing: {}, +\t\t\t\teasing: jQuery.easing._default +\t\t\t}, options ), +\t\t\toriginalProperties: properties, +\t\t\toriginalOptions: options, +\t\t\tstartTime: fxNow || createFxNow(), +\t\t\tduration: options.duration, +\t\t\ttweens: [], +\t\t\tcreateTween: function( prop, end ) { +\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end, +\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing ); +\t\t\t\tanimation.tweens.push( tween ); +\t\t\t\treturn tween; +\t\t\t}, +\t\t\tstop: function( gotoEnd ) { +\t\t\t\tvar index = 0, + +\t\t\t\t\t// If we are going to the end, we want to run all the tweens +\t\t\t\t\t// otherwise we skip this part +\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0; +\t\t\t\tif ( stopped ) { +\t\t\t\t\treturn this; +\t\t\t\t} +\t\t\t\tstopped = true; +\t\t\t\tfor ( ; index < length; index++ ) { +\t\t\t\t\tanimation.tweens[ index ].run( 1 ); +\t\t\t\t} + +\t\t\t\t// Resolve when we played the last frame; otherwise, reject +\t\t\t\tif ( gotoEnd ) { +\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] ); +\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] ); +\t\t\t\t} else { +\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] ); +\t\t\t\t} +\t\t\t\treturn this; +\t\t\t} +\t\t} ), +\t\tprops = animation.props; + +\tpropFilter( props, animation.opts.specialEasing ); + +\tfor ( ; index < length; index++ ) { +\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); +\t\tif ( result ) { +\t\t\tif ( jQuery.isFunction( result.stop ) ) { +\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop = +\t\t\t\t\tjQuery.proxy( result.stop, result ); +\t\t\t} +\t\t\treturn result; +\t\t} +\t} + +\tjQuery.map( props, createTween, animation ); + +\tif ( jQuery.isFunction( animation.opts.start ) ) { +\t\tanimation.opts.start.call( elem, animation ); +\t} + +\t// Attach callbacks from options +\tanimation +\t\t.progress( animation.opts.progress ) +\t\t.done( animation.opts.done, animation.opts.complete ) +\t\t.fail( animation.opts.fail ) +\t\t.always( animation.opts.always ); + +\tjQuery.fx.timer( +\t\tjQuery.extend( tick, { +\t\t\telem: elem, +\t\t\tanim: animation, +\t\t\tqueue: animation.opts.queue +\t\t} ) +\t); + +\treturn animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + +\ttweeners: { +\t\t"*": [ function( prop, value ) { +\t\t\tvar tween = this.createTween( prop, value ); +\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); +\t\t\treturn tween; +\t\t} ] +\t}, + +\ttweener: function( props, callback ) { +\t\tif ( jQuery.isFunction( props ) ) { +\t\t\tcallback = props; +\t\t\tprops = [ "*" ]; +\t\t} else { +\t\t\tprops = props.match( rnothtmlwhite ); +\t\t} + +\t\tvar prop, +\t\t\tindex = 0, +\t\t\tlength = props.length; + +\t\tfor ( ; index < length; index++ ) { +\t\t\tprop = props[ index ]; +\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; +\t\t\tAnimation.tweeners[ prop ].unshift( callback ); +\t\t} +\t}, + +\tprefilters: [ defaultPrefilter ], + +\tprefilter: function( callback, prepend ) { +\t\tif ( prepend ) { +\t\t\tAnimation.prefilters.unshift( callback ); +\t\t} else { +\t\t\tAnimation.prefilters.push( callback ); +\t\t} +\t} +} ); + +jQuery.speed = function( speed, easing, fn ) { +\tvar opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { +\t\tcomplete: fn || !fn && easing || +\t\t\tjQuery.isFunction( speed ) && speed, +\t\tduration: speed, +\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing +\t}; + +\t// Go to the end state if fx are off +\tif ( jQuery.fx.off ) { +\t\topt.duration = 0; + +\t} else { +\t\tif ( typeof opt.duration !== "number" ) { +\t\t\tif ( opt.duration in jQuery.fx.speeds ) { +\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ]; + +\t\t\t} else { +\t\t\t\topt.duration = jQuery.fx.speeds._default; +\t\t\t} +\t\t} +\t} + +\t// Normalize opt.queue - true/undefined/null -> "fx" +\tif ( opt.queue == null || opt.queue === true ) { +\t\topt.queue = "fx"; +\t} + +\t// Queueing +\topt.old = opt.complete; + +\topt.complete = function() { +\t\tif ( jQuery.isFunction( opt.old ) ) { +\t\t\topt.old.call( this ); +\t\t} + +\t\tif ( opt.queue ) { +\t\t\tjQuery.dequeue( this, opt.queue ); +\t\t} +\t}; + +\treturn opt; +}; + +jQuery.fn.extend( { +\tfadeTo: function( speed, to, easing, callback ) { + +\t\t// Show any hidden elements after setting opacity to 0 +\t\treturn this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + +\t\t\t// Animate to the value specified +\t\t\t.end().animate( { opacity: to }, speed, easing, callback ); +\t}, +\tanimate: function( prop, speed, easing, callback ) { +\t\tvar empty = jQuery.isEmptyObject( prop ), +\t\t\toptall = jQuery.speed( speed, easing, callback ), +\t\t\tdoAnimation = function() { + +\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost +\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall ); + +\t\t\t\t// Empty animations, or finishing resolves immediately +\t\t\t\tif ( empty || dataPriv.get( this, "finish" ) ) { +\t\t\t\t\tanim.stop( true ); +\t\t\t\t} +\t\t\t}; +\t\t\tdoAnimation.finish = doAnimation; + +\t\treturn empty || optall.queue === false ? +\t\t\tthis.each( doAnimation ) : +\t\t\tthis.queue( optall.queue, doAnimation ); +\t}, +\tstop: function( type, clearQueue, gotoEnd ) { +\t\tvar stopQueue = function( hooks ) { +\t\t\tvar stop = hooks.stop; +\t\t\tdelete hooks.stop; +\t\t\tstop( gotoEnd ); +\t\t}; + +\t\tif ( typeof type !== "string" ) { +\t\t\tgotoEnd = clearQueue; +\t\t\tclearQueue = type; +\t\t\ttype = undefined; +\t\t} +\t\tif ( clearQueue && type !== false ) { +\t\t\tthis.queue( type || "fx", [] ); +\t\t} + +\t\treturn this.each( function() { +\t\t\tvar dequeue = true, +\t\t\t\tindex = type != null && type + "queueHooks", +\t\t\t\ttimers = jQuery.timers, +\t\t\t\tdata = dataPriv.get( this ); + +\t\t\tif ( index ) { +\t\t\t\tif ( data[ index ] && data[ index ].stop ) { +\t\t\t\t\tstopQueue( data[ index ] ); +\t\t\t\t} +\t\t\t} else { +\t\t\t\tfor ( index in data ) { +\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { +\t\t\t\t\t\tstopQueue( data[ index ] ); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} + +\t\t\tfor ( index = timers.length; index--; ) { +\t\t\t\tif ( timers[ index ].elem === this && +\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) { + +\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd ); +\t\t\t\t\tdequeue = false; +\t\t\t\t\ttimers.splice( index, 1 ); +\t\t\t\t} +\t\t\t} + +\t\t\t// Start the next in the queue if the last step wasn't forced. +\t\t\t// Timers currently will call their complete callbacks, which +\t\t\t// will dequeue but only if they were gotoEnd. +\t\t\tif ( dequeue || !gotoEnd ) { +\t\t\t\tjQuery.dequeue( this, type ); +\t\t\t} +\t\t} ); +\t}, +\tfinish: function( type ) { +\t\tif ( type !== false ) { +\t\t\ttype = type || "fx"; +\t\t} +\t\treturn this.each( function() { +\t\t\tvar index, +\t\t\t\tdata = dataPriv.get( this ), +\t\t\t\tqueue = data[ type + "queue" ], +\t\t\t\thooks = data[ type + "queueHooks" ], +\t\t\t\ttimers = jQuery.timers, +\t\t\t\tlength = queue ? queue.length : 0; + +\t\t\t// Enable finishing flag on private data +\t\t\tdata.finish = true; + +\t\t\t// Empty the queue first +\t\t\tjQuery.queue( this, type, [] ); + +\t\t\tif ( hooks && hooks.stop ) { +\t\t\t\thooks.stop.call( this, true ); +\t\t\t} + +\t\t\t// Look for any active animations, and finish them +\t\t\tfor ( index = timers.length; index--; ) { +\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) { +\t\t\t\t\ttimers[ index ].anim.stop( true ); +\t\t\t\t\ttimers.splice( index, 1 ); +\t\t\t\t} +\t\t\t} + +\t\t\t// Look for any animations in the old queue and finish them +\t\t\tfor ( index = 0; index < length; index++ ) { +\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) { +\t\t\t\t\tqueue[ index ].finish.call( this ); +\t\t\t\t} +\t\t\t} + +\t\t\t// Turn off finishing flag +\t\t\tdelete data.finish; +\t\t} ); +\t} +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { +\tvar cssFn = jQuery.fn[ name ]; +\tjQuery.fn[ name ] = function( speed, easing, callback ) { +\t\treturn speed == null || typeof speed === "boolean" ? +\t\t\tcssFn.apply( this, arguments ) : +\t\t\tthis.animate( genFx( name, true ), speed, easing, callback ); +\t}; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { +\tslideDown: genFx( "show" ), +\tslideUp: genFx( "hide" ), +\tslideToggle: genFx( "toggle" ), +\tfadeIn: { opacity: "show" }, +\tfadeOut: { opacity: "hide" }, +\tfadeToggle: { opacity: "toggle" } +}, function( name, props ) { +\tjQuery.fn[ name ] = function( speed, easing, callback ) { +\t\treturn this.animate( props, speed, easing, callback ); +\t}; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { +\tvar timer, +\t\ti = 0, +\t\ttimers = jQuery.timers; + +\tfxNow = jQuery.now(); + +\tfor ( ; i < timers.length; i++ ) { +\t\ttimer = timers[ i ]; + +\t\t// Run the timer and safely remove it when done (allowing for external removal) +\t\tif ( !timer() && timers[ i ] === timer ) { +\t\t\ttimers.splice( i--, 1 ); +\t\t} +\t} + +\tif ( !timers.length ) { +\t\tjQuery.fx.stop(); +\t} +\tfxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { +\tjQuery.timers.push( timer ); +\tjQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { +\tif ( inProgress ) { +\t\treturn; +\t} + +\tinProgress = true; +\tschedule(); +}; + +jQuery.fx.stop = function() { +\tinProgress = null; +}; + +jQuery.fx.speeds = { +\tslow: 600, +\tfast: 200, + +\t// Default speed +\t_default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { +\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; +\ttype = type || "fx"; + +\treturn this.queue( type, function( next, hooks ) { +\t\tvar timeout = window.setTimeout( next, time ); +\t\thooks.stop = function() { +\t\t\twindow.clearTimeout( timeout ); +\t\t}; +\t} ); +}; + + +( function() { +\tvar input = document.createElement( "input" ), +\t\tselect = document.createElement( "select" ), +\t\topt = select.appendChild( document.createElement( "option" ) ); + +\tinput.type = "checkbox"; + +\t// Support: Android <=4.3 only +\t// Default value for a checkbox should be "on" +\tsupport.checkOn = input.value !== ""; + +\t// Support: IE <=11 only +\t// Must access selectedIndex to make default options select +\tsupport.optSelected = opt.selected; + +\t// Support: IE <=11 only +\t// An input loses its value after becoming a radio +\tinput = document.createElement( "input" ); +\tinput.value = "t"; +\tinput.type = "radio"; +\tsupport.radioValue = input.value === "t"; +} )(); + + +var boolHook, +\tattrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { +\tattr: function( name, value ) { +\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 ); +\t}, + +\tremoveAttr: function( name ) { +\t\treturn this.each( function() { +\t\t\tjQuery.removeAttr( this, name ); +\t\t} ); +\t} +} ); + +jQuery.extend( { +\tattr: function( elem, name, value ) { +\t\tvar ret, hooks, +\t\t\tnType = elem.nodeType; + +\t\t// Don't get/set attributes on text, comment and attribute nodes +\t\tif ( nType === 3 || nType === 8 || nType === 2 ) { +\t\t\treturn; +\t\t} + +\t\t// Fallback to prop when attributes are not supported +\t\tif ( typeof elem.getAttribute === "undefined" ) { +\t\t\treturn jQuery.prop( elem, name, value ); +\t\t} + +\t\t// Attribute hooks are determined by the lowercase version +\t\t// Grab necessary hook if one is defined +\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { +\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] || +\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); +\t\t} + +\t\tif ( value !== undefined ) { +\t\t\tif ( value === null ) { +\t\t\t\tjQuery.removeAttr( elem, name ); +\t\t\t\treturn; +\t\t\t} + +\t\t\tif ( hooks && "set" in hooks && +\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) { +\t\t\t\treturn ret; +\t\t\t} + +\t\t\telem.setAttribute( name, value + "" ); +\t\t\treturn value; +\t\t} + +\t\tif ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { +\t\t\treturn ret; +\t\t} + +\t\tret = jQuery.find.attr( elem, name ); + +\t\t// Non-existent attributes return null, we normalize to undefined +\t\treturn ret == null ? undefined : ret; +\t}, + +\tattrHooks: { +\t\ttype: { +\t\t\tset: function( elem, value ) { +\t\t\t\tif ( !support.radioValue && value === "radio" && +\t\t\t\t\tnodeName( elem, "input" ) ) { +\t\t\t\t\tvar val = elem.value; +\t\t\t\t\telem.setAttribute( "type", value ); +\t\t\t\t\tif ( val ) { +\t\t\t\t\t\telem.value = val; +\t\t\t\t\t} +\t\t\t\t\treturn value; +\t\t\t\t} +\t\t\t} +\t\t} +\t}, + +\tremoveAttr: function( elem, value ) { +\t\tvar name, +\t\t\ti = 0, + +\t\t\t// Attribute names can contain non-HTML whitespace characters +\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 +\t\t\tattrNames = value && value.match( rnothtmlwhite ); + +\t\tif ( attrNames && elem.nodeType === 1 ) { +\t\t\twhile ( ( name = attrNames[ i++ ] ) ) { +\t\t\t\telem.removeAttribute( name ); +\t\t\t} +\t\t} +\t} +} ); + +// Hooks for boolean attributes +boolHook = { +\tset: function( elem, value, name ) { +\t\tif ( value === false ) { + +\t\t\t// Remove boolean attributes when set to false +\t\t\tjQuery.removeAttr( elem, name ); +\t\t} else { +\t\t\telem.setAttribute( name, name ); +\t\t} +\t\treturn name; +\t} +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) { +\tvar getter = attrHandle[ name ] || jQuery.find.attr; + +\tattrHandle[ name ] = function( elem, name, isXML ) { +\t\tvar ret, handle, +\t\t\tlowercaseName = name.toLowerCase(); + +\t\tif ( !isXML ) { + +\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter +\t\t\thandle = attrHandle[ lowercaseName ]; +\t\t\tattrHandle[ lowercaseName ] = ret; +\t\t\tret = getter( elem, name, isXML ) != null ? +\t\t\t\tlowercaseName : +\t\t\t\tnull; +\t\t\tattrHandle[ lowercaseName ] = handle; +\t\t} +\t\treturn ret; +\t}; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, +\trclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { +\tprop: function( name, value ) { +\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 ); +\t}, + +\tremoveProp: function( name ) { +\t\treturn this.each( function() { +\t\t\tdelete this[ jQuery.propFix[ name ] || name ]; +\t\t} ); +\t} +} ); + +jQuery.extend( { +\tprop: function( elem, name, value ) { +\t\tvar ret, hooks, +\t\t\tnType = elem.nodeType; + +\t\t// Don't get/set properties on text, comment and attribute nodes +\t\tif ( nType === 3 || nType === 8 || nType === 2 ) { +\t\t\treturn; +\t\t} + +\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + +\t\t\t// Fix name and attach hooks +\t\t\tname = jQuery.propFix[ name ] || name; +\t\t\thooks = jQuery.propHooks[ name ]; +\t\t} + +\t\tif ( value !== undefined ) { +\t\t\tif ( hooks && "set" in hooks && +\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) { +\t\t\t\treturn ret; +\t\t\t} + +\t\t\treturn ( elem[ name ] = value ); +\t\t} + +\t\tif ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { +\t\t\treturn ret; +\t\t} + +\t\treturn elem[ name ]; +\t}, + +\tpropHooks: { +\t\ttabIndex: { +\t\t\tget: function( elem ) { + +\t\t\t\t// Support: IE <=9 - 11 only +\t\t\t\t// elem.tabIndex doesn't always return the +\t\t\t\t// correct value when it hasn't been explicitly set +\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ +\t\t\t\t// Use proper attribute retrieval(#12072) +\t\t\t\tvar tabindex = jQuery.find.attr( elem, "tabindex" ); + +\t\t\t\tif ( tabindex ) { +\t\t\t\t\treturn parseInt( tabindex, 10 ); +\t\t\t\t} + +\t\t\t\tif ( +\t\t\t\t\trfocusable.test( elem.nodeName ) || +\t\t\t\t\trclickable.test( elem.nodeName ) && +\t\t\t\t\telem.href +\t\t\t\t) { +\t\t\t\t\treturn 0; +\t\t\t\t} + +\t\t\t\treturn -1; +\t\t\t} +\t\t} +\t}, + +\tpropFix: { +\t\t"for": "htmlFor", +\t\t"class": "className" +\t} +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { +\tjQuery.propHooks.selected = { +\t\tget: function( elem ) { + +\t\t\t/* eslint no-unused-expressions: "off" */ + +\t\t\tvar parent = elem.parentNode; +\t\t\tif ( parent && parent.parentNode ) { +\t\t\t\tparent.parentNode.selectedIndex; +\t\t\t} +\t\t\treturn null; +\t\t}, +\t\tset: function( elem ) { + +\t\t\t/* eslint no-unused-expressions: "off" */ + +\t\t\tvar parent = elem.parentNode; +\t\t\tif ( parent ) { +\t\t\t\tparent.selectedIndex; + +\t\t\t\tif ( parent.parentNode ) { +\t\t\t\t\tparent.parentNode.selectedIndex; +\t\t\t\t} +\t\t\t} +\t\t} +\t}; +} + +jQuery.each( [ +\t"tabIndex", +\t"readOnly", +\t"maxLength", +\t"cellSpacing", +\t"cellPadding", +\t"rowSpan", +\t"colSpan", +\t"useMap", +\t"frameBorder", +\t"contentEditable" +], function() { +\tjQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + +\t// Strip and collapse whitespace according to HTML spec +\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace +\tfunction stripAndCollapse( value ) { +\t\tvar tokens = value.match( rnothtmlwhite ) || []; +\t\treturn tokens.join( " " ); +\t} + + +function getClass( elem ) { +\treturn elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { +\taddClass: function( value ) { +\t\tvar classes, elem, cur, curValue, clazz, j, finalValue, +\t\t\ti = 0; + +\t\tif ( jQuery.isFunction( value ) ) { +\t\t\treturn this.each( function( j ) { +\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); +\t\t\t} ); +\t\t} + +\t\tif ( typeof value === "string" && value ) { +\t\t\tclasses = value.match( rnothtmlwhite ) || []; + +\t\t\twhile ( ( elem = this[ i++ ] ) ) { +\t\t\t\tcurValue = getClass( elem ); +\t\t\t\tcur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + +\t\t\t\tif ( cur ) { +\t\t\t\t\tj = 0; +\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) { +\t\t\t\t\t\tif ( cur.indexOf( " " + clazz + " " ) < 0 ) { +\t\t\t\t\t\t\tcur += clazz + " "; +\t\t\t\t\t\t} +\t\t\t\t\t} + +\t\t\t\t\t// Only assign if different to avoid unneeded rendering. +\t\t\t\t\tfinalValue = stripAndCollapse( cur ); +\t\t\t\t\tif ( curValue !== finalValue ) { +\t\t\t\t\t\telem.setAttribute( "class", finalValue ); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} + +\t\treturn this; +\t}, + +\tremoveClass: function( value ) { +\t\tvar classes, elem, cur, curValue, clazz, j, finalValue, +\t\t\ti = 0; + +\t\tif ( jQuery.isFunction( value ) ) { +\t\t\treturn this.each( function( j ) { +\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); +\t\t\t} ); +\t\t} + +\t\tif ( !arguments.length ) { +\t\t\treturn this.attr( "class", "" ); +\t\t} + +\t\tif ( typeof value === "string" && value ) { +\t\t\tclasses = value.match( rnothtmlwhite ) || []; + +\t\t\twhile ( ( elem = this[ i++ ] ) ) { +\t\t\t\tcurValue = getClass( elem ); + +\t\t\t\t// This expression is here for better compressibility (see addClass) +\t\t\t\tcur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + +\t\t\t\tif ( cur ) { +\t\t\t\t\tj = 0; +\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) { + +\t\t\t\t\t\t// Remove *all* instances +\t\t\t\t\t\twhile ( cur.indexOf( " " + clazz + " " ) > -1 ) { +\t\t\t\t\t\t\tcur = cur.replace( " " + clazz + " ", " " ); +\t\t\t\t\t\t} +\t\t\t\t\t} + +\t\t\t\t\t// Only assign if different to avoid unneeded rendering. +\t\t\t\t\tfinalValue = stripAndCollapse( cur ); +\t\t\t\t\tif ( curValue !== finalValue ) { +\t\t\t\t\t\telem.setAttribute( "class", finalValue ); +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} + +\t\treturn this; +\t}, + +\ttoggleClass: function( value, stateVal ) { +\t\tvar type = typeof value; + +\t\tif ( typeof stateVal === "boolean" && type === "string" ) { +\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value ); +\t\t} + +\t\tif ( jQuery.isFunction( value ) ) { +\t\t\treturn this.each( function( i ) { +\t\t\t\tjQuery( this ).toggleClass( +\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ), +\t\t\t\t\tstateVal +\t\t\t\t); +\t\t\t} ); +\t\t} + +\t\treturn this.each( function() { +\t\t\tvar className, i, self, classNames; + +\t\t\tif ( type === "string" ) { + +\t\t\t\t// Toggle individual class names +\t\t\t\ti = 0; +\t\t\t\tself = jQuery( this ); +\t\t\t\tclassNames = value.match( rnothtmlwhite ) || []; + +\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) { + +\t\t\t\t\t// Check each className given, space separated list +\t\t\t\t\tif ( self.hasClass( className ) ) { +\t\t\t\t\t\tself.removeClass( className ); +\t\t\t\t\t} else { +\t\t\t\t\t\tself.addClass( className ); +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t// Toggle whole class name +\t\t\t} else if ( value === undefined || type === "boolean" ) { +\t\t\t\tclassName = getClass( this ); +\t\t\t\tif ( className ) { + +\t\t\t\t\t// Store className if set +\t\t\t\t\tdataPriv.set( this, "__className__", className ); +\t\t\t\t} + +\t\t\t\t// If the element has a class name or if we're passed `false`, +\t\t\t\t// then remove the whole classname (if there was one, the above saved it). +\t\t\t\t// Otherwise bring back whatever was previously saved (if anything), +\t\t\t\t// falling back to the empty string if nothing was stored. +\t\t\t\tif ( this.setAttribute ) { +\t\t\t\t\tthis.setAttribute( "class", +\t\t\t\t\t\tclassName || value === false ? +\t\t\t\t\t\t"" : +\t\t\t\t\t\tdataPriv.get( this, "__className__" ) || "" +\t\t\t\t\t); +\t\t\t\t} +\t\t\t} +\t\t} ); +\t}, + +\thasClass: function( selector ) { +\t\tvar className, elem, +\t\t\ti = 0; + +\t\tclassName = " " + selector + " "; +\t\twhile ( ( elem = this[ i++ ] ) ) { +\t\t\tif ( elem.nodeType === 1 && +\t\t\t\t( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { +\t\t\t\t\treturn true; +\t\t\t} +\t\t} + +\t\treturn false; +\t} +} ); + + + + +var rreturn = /\\r/g; + +jQuery.fn.extend( { +\tval: function( value ) { +\t\tvar hooks, ret, isFunction, +\t\t\telem = this[ 0 ]; + +\t\tif ( !arguments.length ) { +\t\t\tif ( elem ) { +\t\t\t\thooks = jQuery.valHooks[ elem.type ] || +\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ]; + +\t\t\t\tif ( hooks && +\t\t\t\t\t"get" in hooks && +\t\t\t\t\t( ret = hooks.get( elem, "value" ) ) !== undefined +\t\t\t\t) { +\t\t\t\t\treturn ret; +\t\t\t\t} + +\t\t\t\tret = elem.value; + +\t\t\t\t// Handle most common string cases +\t\t\t\tif ( typeof ret === "string" ) { +\t\t\t\t\treturn ret.replace( rreturn, "" ); +\t\t\t\t} + +\t\t\t\t// Handle cases where value is null/undef or number +\t\t\t\treturn ret == null ? "" : ret; +\t\t\t} + +\t\t\treturn; +\t\t} + +\t\tisFunction = jQuery.isFunction( value ); + +\t\treturn this.each( function( i ) { +\t\t\tvar val; + +\t\t\tif ( this.nodeType !== 1 ) { +\t\t\t\treturn; +\t\t\t} + +\t\t\tif ( isFunction ) { +\t\t\t\tval = value.call( this, i, jQuery( this ).val() ); +\t\t\t} else { +\t\t\t\tval = value; +\t\t\t} + +\t\t\t// Treat null/undefined as ""; convert numbers to string +\t\t\tif ( val == null ) { +\t\t\t\tval = ""; + +\t\t\t} else if ( typeof val === "number" ) { +\t\t\t\tval += ""; + +\t\t\t} else if ( Array.isArray( val ) ) { +\t\t\t\tval = jQuery.map( val, function( value ) { +\t\t\t\t\treturn value == null ? "" : value + ""; +\t\t\t\t} ); +\t\t\t} + +\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + +\t\t\t// If set returns undefined, fall back to normal setting +\t\t\tif ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { +\t\t\t\tthis.value = val; +\t\t\t} +\t\t} ); +\t} +} ); + +jQuery.extend( { +\tvalHooks: { +\t\toption: { +\t\t\tget: function( elem ) { + +\t\t\t\tvar val = jQuery.find.attr( elem, "value" ); +\t\t\t\treturn val != null ? +\t\t\t\t\tval : + +\t\t\t\t\t// Support: IE <=10 - 11 only +\t\t\t\t\t// option.text throws exceptions (#14686, #14858) +\t\t\t\t\t// Strip and collapse whitespace +\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace +\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) ); +\t\t\t} +\t\t}, +\t\tselect: { +\t\t\tget: function( elem ) { +\t\t\t\tvar value, option, i, +\t\t\t\t\toptions = elem.options, +\t\t\t\t\tindex = elem.selectedIndex, +\t\t\t\t\tone = elem.type === "select-one", +\t\t\t\t\tvalues = one ? null : [], +\t\t\t\t\tmax = one ? index + 1 : options.length; + +\t\t\t\tif ( index < 0 ) { +\t\t\t\t\ti = max; + +\t\t\t\t} else { +\t\t\t\t\ti = one ? index : 0; +\t\t\t\t} + +\t\t\t\t// Loop through all the selected options +\t\t\t\tfor ( ; i < max; i++ ) { +\t\t\t\t\toption = options[ i ]; + +\t\t\t\t\t// Support: IE <=9 only +\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551) +\t\t\t\t\tif ( ( option.selected || i === index ) && + +\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup +\t\t\t\t\t\t\t!option.disabled && +\t\t\t\t\t\t\t( !option.parentNode.disabled || +\t\t\t\t\t\t\t\t!nodeName( option.parentNode, "optgroup" ) ) ) { + +\t\t\t\t\t\t// Get the specific value for the option +\t\t\t\t\t\tvalue = jQuery( option ).val(); + +\t\t\t\t\t\t// We don't need an array for one selects +\t\t\t\t\t\tif ( one ) { +\t\t\t\t\t\t\treturn value; +\t\t\t\t\t\t} + +\t\t\t\t\t\t// Multi-Selects return an array +\t\t\t\t\t\tvalues.push( value ); +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\treturn values; +\t\t\t}, + +\t\t\tset: function( elem, value ) { +\t\t\t\tvar optionSet, option, +\t\t\t\t\toptions = elem.options, +\t\t\t\t\tvalues = jQuery.makeArray( value ), +\t\t\t\t\ti = options.length; + +\t\t\t\twhile ( i-- ) { +\t\t\t\t\toption = options[ i ]; + +\t\t\t\t\t/* eslint-disable no-cond-assign */ + +\t\t\t\t\tif ( option.selected = +\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 +\t\t\t\t\t) { +\t\t\t\t\t\toptionSet = true; +\t\t\t\t\t} + +\t\t\t\t\t/* eslint-enable no-cond-assign */ +\t\t\t\t} + +\t\t\t\t// Force browsers to behave consistently when non-matching value is set +\t\t\t\tif ( !optionSet ) { +\t\t\t\t\telem.selectedIndex = -1; +\t\t\t\t} +\t\t\t\treturn values; +\t\t\t} +\t\t} +\t} +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { +\tjQuery.valHooks[ this ] = { +\t\tset: function( elem, value ) { +\t\t\tif ( Array.isArray( value ) ) { +\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); +\t\t\t} +\t\t} +\t}; +\tif ( !support.checkOn ) { +\t\tjQuery.valHooks[ this ].get = function( elem ) { +\t\t\treturn elem.getAttribute( "value" ) === null ? "on" : elem.value; +\t\t}; +\t} +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + +\ttrigger: function( event, data, elem, onlyHandlers ) { + +\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, +\t\t\teventPath = [ elem || document ], +\t\t\ttype = hasOwn.call( event, "type" ) ? event.type : event, +\t\t\tnamespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + +\t\tcur = tmp = elem = elem || document; + +\t\t// Don't do events on text and comment nodes +\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) { +\t\t\treturn; +\t\t} + +\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now +\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) { +\t\t\treturn; +\t\t} + +\t\tif ( type.indexOf( "." ) > -1 ) { + +\t\t\t// Namespaced trigger; create a regexp to match event type in handle() +\t\t\tnamespaces = type.split( "." ); +\t\t\ttype = namespaces.shift(); +\t\t\tnamespaces.sort(); +\t\t} +\t\tontype = type.indexOf( ":" ) < 0 && "on" + type; + +\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string +\t\tevent = event[ jQuery.expando ] ? +\t\t\tevent : +\t\t\tnew jQuery.Event( type, typeof event === "object" && event ); + +\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) +\t\tevent.isTrigger = onlyHandlers ? 2 : 3; +\t\tevent.namespace = namespaces.join( "." ); +\t\tevent.rnamespace = event.namespace ? +\t\t\tnew RegExp( "(^|\\\\.)" + namespaces.join( "\\\\.(?:.*\\\\.|)" ) + "(\\\\.|$)" ) : +\t\t\tnull; + +\t\t// Clean up the event in case it is being reused +\t\tevent.result = undefined; +\t\tif ( !event.target ) { +\t\t\tevent.target = elem; +\t\t} + +\t\t// Clone any incoming data and prepend the event, creating the handler arg list +\t\tdata = data == null ? +\t\t\t[ event ] : +\t\t\tjQuery.makeArray( data, [ event ] ); + +\t\t// Allow special events to draw outside the lines +\t\tspecial = jQuery.event.special[ type ] || {}; +\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { +\t\t\treturn; +\t\t} + +\t\t// Determine event propagation path in advance, per W3C events spec (#9951) +\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724) +\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + +\t\t\tbubbleType = special.delegateType || type; +\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) { +\t\t\t\tcur = cur.parentNode; +\t\t\t} +\t\t\tfor ( ; cur; cur = cur.parentNode ) { +\t\t\t\teventPath.push( cur ); +\t\t\t\ttmp = cur; +\t\t\t} + +\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM) +\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) { +\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window ); +\t\t\t} +\t\t} + +\t\t// Fire handlers on the event path +\t\ti = 0; +\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + +\t\t\tevent.type = i > 1 ? +\t\t\t\tbubbleType : +\t\t\t\tspecial.bindType || type; + +\t\t\t// jQuery handler +\t\t\thandle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && +\t\t\t\tdataPriv.get( cur, "handle" ); +\t\t\tif ( handle ) { +\t\t\t\thandle.apply( cur, data ); +\t\t\t} + +\t\t\t// Native handler +\t\t\thandle = ontype && cur[ ontype ]; +\t\t\tif ( handle && handle.apply && acceptData( cur ) ) { +\t\t\t\tevent.result = handle.apply( cur, data ); +\t\t\t\tif ( event.result === false ) { +\t\t\t\t\tevent.preventDefault(); +\t\t\t\t} +\t\t\t} +\t\t} +\t\tevent.type = type; + +\t\t// If nobody prevented the default action, do it now +\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) { + +\t\t\tif ( ( !special._default || +\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) && +\t\t\t\tacceptData( elem ) ) { + +\t\t\t\t// Call a native DOM method on the target with the same name as the event. +\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170) +\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + +\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method +\t\t\t\t\ttmp = elem[ ontype ]; + +\t\t\t\t\tif ( tmp ) { +\t\t\t\t\t\telem[ ontype ] = null; +\t\t\t\t\t} + +\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above +\t\t\t\t\tjQuery.event.triggered = type; +\t\t\t\t\telem[ type ](); +\t\t\t\t\tjQuery.event.triggered = undefined; + +\t\t\t\t\tif ( tmp ) { +\t\t\t\t\t\telem[ ontype ] = tmp; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} + +\t\treturn event.result; +\t}, + +\t// Piggyback on a donor event to simulate a different one +\t// Used only for `focus(in | out)` events +\tsimulate: function( type, elem, event ) { +\t\tvar e = jQuery.extend( +\t\t\tnew jQuery.Event(), +\t\t\tevent, +\t\t\t{ +\t\t\t\ttype: type, +\t\t\t\tisSimulated: true +\t\t\t} +\t\t); + +\t\tjQuery.event.trigger( e, null, elem ); +\t} + +} ); + +jQuery.fn.extend( { + +\ttrigger: function( type, data ) { +\t\treturn this.each( function() { +\t\t\tjQuery.event.trigger( type, data, this ); +\t\t} ); +\t}, +\ttriggerHandler: function( type, data ) { +\t\tvar elem = this[ 0 ]; +\t\tif ( elem ) { +\t\t\treturn jQuery.event.trigger( type, data, elem, true ); +\t\t} +\t} +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + +\t"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + +\t"change select submit keydown keypress keyup contextmenu" ).split( " " ), +\tfunction( i, name ) { + +\t// Handle event binding +\tjQuery.fn[ name ] = function( data, fn ) { +\t\treturn arguments.length > 0 ? +\t\t\tthis.on( name, null, data, fn ) : +\t\t\tthis.trigger( name ); +\t}; +} ); + +jQuery.fn.extend( { +\thover: function( fnOver, fnOut ) { +\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); +\t} +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { +\tjQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + +\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout +\t\tvar handler = function( event ) { +\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); +\t\t}; + +\t\tjQuery.event.special[ fix ] = { +\t\t\tsetup: function() { +\t\t\t\tvar doc = this.ownerDocument || this, +\t\t\t\t\tattaches = dataPriv.access( doc, fix ); + +\t\t\t\tif ( !attaches ) { +\t\t\t\t\tdoc.addEventListener( orig, handler, true ); +\t\t\t\t} +\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); +\t\t\t}, +\t\t\tteardown: function() { +\t\t\t\tvar doc = this.ownerDocument || this, +\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1; + +\t\t\t\tif ( !attaches ) { +\t\t\t\t\tdoc.removeEventListener( orig, handler, true ); +\t\t\t\t\tdataPriv.remove( doc, fix ); + +\t\t\t\t} else { +\t\t\t\t\tdataPriv.access( doc, fix, attaches ); +\t\t\t\t} +\t\t\t} +\t\t}; +\t} ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { +\tvar xml; +\tif ( !data || typeof data !== "string" ) { +\t\treturn null; +\t} + +\t// Support: IE 9 - 11 only +\t// IE throws on parseFromString with invalid input. +\ttry { +\t\txml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); +\t} catch ( e ) { +\t\txml = undefined; +\t} + +\tif ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { +\t\tjQuery.error( "Invalid XML: " + data ); +\t} +\treturn xml; +}; + + +var +\trbracket = /\\[\\]$/, +\trCRLF = /\\r?\\n/g, +\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, +\trsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { +\tvar name; + +\tif ( Array.isArray( obj ) ) { + +\t\t// Serialize array item. +\t\tjQuery.each( obj, function( i, v ) { +\t\t\tif ( traditional || rbracket.test( prefix ) ) { + +\t\t\t\t// Treat each array item as a scalar. +\t\t\t\tadd( prefix, v ); + +\t\t\t} else { + +\t\t\t\t// Item is non-scalar (array or object), encode its numeric index. +\t\t\t\tbuildParams( +\t\t\t\t\tprefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", +\t\t\t\t\tv, +\t\t\t\t\ttraditional, +\t\t\t\t\tadd +\t\t\t\t); +\t\t\t} +\t\t} ); + +\t} else if ( !traditional && jQuery.type( obj ) === "object" ) { + +\t\t// Serialize object item. +\t\tfor ( name in obj ) { +\t\t\tbuildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); +\t\t} + +\t} else { + +\t\t// Serialize scalar item. +\t\tadd( prefix, obj ); +\t} +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { +\tvar prefix, +\t\ts = [], +\t\tadd = function( key, valueOrFunction ) { + +\t\t\t// If value is a function, invoke it and use its return value +\t\t\tvar value = jQuery.isFunction( valueOrFunction ) ? +\t\t\t\tvalueOrFunction() : +\t\t\t\tvalueOrFunction; + +\t\t\ts[ s.length ] = encodeURIComponent( key ) + "=" + +\t\t\t\tencodeURIComponent( value == null ? "" : value ); +\t\t}; + +\t// If an array was passed in, assume that it is an array of form elements. +\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + +\t\t// Serialize the form elements +\t\tjQuery.each( a, function() { +\t\t\tadd( this.name, this.value ); +\t\t} ); + +\t} else { + +\t\t// If traditional, encode the "old" way (the way 1.3.2 or older +\t\t// did it), otherwise encode params recursively. +\t\tfor ( prefix in a ) { +\t\t\tbuildParams( prefix, a[ prefix ], traditional, add ); +\t\t} +\t} + +\t// Return the resulting serialization +\treturn s.join( "&" ); +}; + +jQuery.fn.extend( { +\tserialize: function() { +\t\treturn jQuery.param( this.serializeArray() ); +\t}, +\tserializeArray: function() { +\t\treturn this.map( function() { + +\t\t\t// Can add propHook for "elements" to filter or add form elements +\t\t\tvar elements = jQuery.prop( this, "elements" ); +\t\t\treturn elements ? jQuery.makeArray( elements ) : this; +\t\t} ) +\t\t.filter( function() { +\t\t\tvar type = this.type; + +\t\t\t// Use .is( ":disabled" ) so that fieldset[disabled] works +\t\t\treturn this.name && !jQuery( this ).is( ":disabled" ) && +\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && +\t\t\t\t( this.checked || !rcheckableType.test( type ) ); +\t\t} ) +\t\t.map( function( i, elem ) { +\t\t\tvar val = jQuery( this ).val(); + +\t\t\tif ( val == null ) { +\t\t\t\treturn null; +\t\t\t} + +\t\t\tif ( Array.isArray( val ) ) { +\t\t\t\treturn jQuery.map( val, function( val ) { +\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, "\\r\\n" ) }; +\t\t\t\t} ); +\t\t\t} + +\t\t\treturn { name: elem.name, value: val.replace( rCRLF, "\\r\\n" ) }; +\t\t} ).get(); +\t} +} ); + + +var +\tr20 = /%20/g, +\trhash = /#.*$/, +\trantiCache = /([?&])_=[^&]*/, +\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg, + +\t// #7653, #8125, #8152: local protocol detection +\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, +\trnoContent = /^(?:GET|HEAD)$/, +\trprotocol = /^\\/\\//, + +\t/* Prefilters +\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) +\t * 2) These are called: +\t * - BEFORE asking for a transport +\t * - AFTER param serialization (s.data is a string if s.processData is true) +\t * 3) key is the dataType +\t * 4) the catchall symbol "*" can be used +\t * 5) execution will start with transport dataType and THEN continue down to "*" if needed +\t */ +\tprefilters = {}, + +\t/* Transports bindings +\t * 1) key is the dataType +\t * 2) the catchall symbol "*" can be used +\t * 3) selection will start with transport dataType and THEN go to "*" if needed +\t */ +\ttransports = {}, + +\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression +\tallTypes = "*/".concat( "*" ), + +\t// Anchor tag for parsing the document origin +\toriginAnchor = document.createElement( "a" ); +\toriginAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + +\t// dataTypeExpression is optional and defaults to "*" +\treturn function( dataTypeExpression, func ) { + +\t\tif ( typeof dataTypeExpression !== "string" ) { +\t\t\tfunc = dataTypeExpression; +\t\t\tdataTypeExpression = "*"; +\t\t} + +\t\tvar dataType, +\t\t\ti = 0, +\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + +\t\tif ( jQuery.isFunction( func ) ) { + +\t\t\t// For each dataType in the dataTypeExpression +\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) { + +\t\t\t\t// Prepend if requested +\t\t\t\tif ( dataType[ 0 ] === "+" ) { +\t\t\t\t\tdataType = dataType.slice( 1 ) || "*"; +\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + +\t\t\t\t// Otherwise append +\t\t\t\t} else { +\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); +\t\t\t\t} +\t\t\t} +\t\t} +\t}; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + +\tvar inspected = {}, +\t\tseekingTransport = ( structure === transports ); + +\tfunction inspect( dataType ) { +\t\tvar selected; +\t\tinspected[ dataType ] = true; +\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { +\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); +\t\t\tif ( typeof dataTypeOrTransport === "string" && +\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) { + +\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport ); +\t\t\t\tinspect( dataTypeOrTransport ); +\t\t\t\treturn false; +\t\t\t} else if ( seekingTransport ) { +\t\t\t\treturn !( selected = dataTypeOrTransport ); +\t\t\t} +\t\t} ); +\t\treturn selected; +\t} + +\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { +\tvar key, deep, +\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {}; + +\tfor ( key in src ) { +\t\tif ( src[ key ] !== undefined ) { +\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; +\t\t} +\t} +\tif ( deep ) { +\t\tjQuery.extend( true, target, deep ); +\t} + +\treturn target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + +\tvar ct, type, finalDataType, firstDataType, +\t\tcontents = s.contents, +\t\tdataTypes = s.dataTypes; + +\t// Remove auto dataType and get content-type in the process +\twhile ( dataTypes[ 0 ] === "*" ) { +\t\tdataTypes.shift(); +\t\tif ( ct === undefined ) { +\t\t\tct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); +\t\t} +\t} + +\t// Check if we're dealing with a known content-type +\tif ( ct ) { +\t\tfor ( type in contents ) { +\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) { +\t\t\t\tdataTypes.unshift( type ); +\t\t\t\tbreak; +\t\t\t} +\t\t} +\t} + +\t// Check to see if we have a response for the expected dataType +\tif ( dataTypes[ 0 ] in responses ) { +\t\tfinalDataType = dataTypes[ 0 ]; +\t} else { + +\t\t// Try convertible dataTypes +\t\tfor ( type in responses ) { +\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { +\t\t\t\tfinalDataType = type; +\t\t\t\tbreak; +\t\t\t} +\t\t\tif ( !firstDataType ) { +\t\t\t\tfirstDataType = type; +\t\t\t} +\t\t} + +\t\t// Or just use first one +\t\tfinalDataType = finalDataType || firstDataType; +\t} + +\t// If we found a dataType +\t// We add the dataType to the list if needed +\t// and return the corresponding response +\tif ( finalDataType ) { +\t\tif ( finalDataType !== dataTypes[ 0 ] ) { +\t\t\tdataTypes.unshift( finalDataType ); +\t\t} +\t\treturn responses[ finalDataType ]; +\t} +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { +\tvar conv2, current, conv, tmp, prev, +\t\tconverters = {}, + +\t\t// Work with a copy of dataTypes in case we need to modify it for conversion +\t\tdataTypes = s.dataTypes.slice(); + +\t// Create converters map with lowercased keys +\tif ( dataTypes[ 1 ] ) { +\t\tfor ( conv in s.converters ) { +\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ]; +\t\t} +\t} + +\tcurrent = dataTypes.shift(); + +\t// Convert to each sequential dataType +\twhile ( current ) { + +\t\tif ( s.responseFields[ current ] ) { +\t\t\tjqXHR[ s.responseFields[ current ] ] = response; +\t\t} + +\t\t// Apply the dataFilter if provided +\t\tif ( !prev && isSuccess && s.dataFilter ) { +\t\t\tresponse = s.dataFilter( response, s.dataType ); +\t\t} + +\t\tprev = current; +\t\tcurrent = dataTypes.shift(); + +\t\tif ( current ) { + +\t\t\t// There's only work to do if current dataType is non-auto +\t\t\tif ( current === "*" ) { + +\t\t\t\tcurrent = prev; + +\t\t\t// Convert response if prev dataType is non-auto and differs from current +\t\t\t} else if ( prev !== "*" && prev !== current ) { + +\t\t\t\t// Seek a direct converter +\t\t\t\tconv = converters[ prev + " " + current ] || converters[ "* " + current ]; + +\t\t\t\t// If none found, seek a pair +\t\t\t\tif ( !conv ) { +\t\t\t\t\tfor ( conv2 in converters ) { + +\t\t\t\t\t\t// If conv2 outputs current +\t\t\t\t\t\ttmp = conv2.split( " " ); +\t\t\t\t\t\tif ( tmp[ 1 ] === current ) { + +\t\t\t\t\t\t\t// If prev can be converted to accepted input +\t\t\t\t\t\t\tconv = converters[ prev + " " + tmp[ 0 ] ] || +\t\t\t\t\t\t\t\tconverters[ "* " + tmp[ 0 ] ]; +\t\t\t\t\t\t\tif ( conv ) { + +\t\t\t\t\t\t\t\t// Condense equivalence converters +\t\t\t\t\t\t\t\tif ( conv === true ) { +\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ]; + +\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType +\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) { +\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ]; +\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] ); +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t\tbreak; +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\t// Apply converter (if not an equivalence) +\t\t\t\tif ( conv !== true ) { + +\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them +\t\t\t\t\tif ( conv && s.throws ) { +\t\t\t\t\t\tresponse = conv( response ); +\t\t\t\t\t} else { +\t\t\t\t\t\ttry { +\t\t\t\t\t\t\tresponse = conv( response ); +\t\t\t\t\t\t} catch ( e ) { +\t\t\t\t\t\t\treturn { +\t\t\t\t\t\t\t\tstate: "parsererror", +\t\t\t\t\t\t\t\terror: conv ? e : "No conversion from " + prev + " to " + current +\t\t\t\t\t\t\t}; +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} +\t\t} +\t} + +\treturn { state: "success", data: response }; +} + +jQuery.extend( { + +\t// Counter for holding the number of active queries +\tactive: 0, + +\t// Last-Modified header cache for next request +\tlastModified: {}, +\tetag: {}, + +\tajaxSettings: { +\t\turl: location.href, +\t\ttype: "GET", +\t\tisLocal: rlocalProtocol.test( location.protocol ), +\t\tglobal: true, +\t\tprocessData: true, +\t\tasync: true, +\t\tcontentType: "application/x-www-form-urlencoded; charset=UTF-8", + +\t\t/* +\t\ttimeout: 0, +\t\tdata: null, +\t\tdataType: null, +\t\tusername: null, +\t\tpassword: null, +\t\tcache: null, +\t\tthrows: false, +\t\ttraditional: false, +\t\theaders: {}, +\t\t*/ + +\t\taccepts: { +\t\t\t"*": allTypes, +\t\t\ttext: "text/plain", +\t\t\thtml: "text/html", +\t\t\txml: "application/xml, text/xml", +\t\t\tjson: "application/json, text/javascript" +\t\t}, + +\t\tcontents: { +\t\t\txml: /\\bxml\\b/, +\t\t\thtml: /\\bhtml/, +\t\t\tjson: /\\bjson\\b/ +\t\t}, + +\t\tresponseFields: { +\t\t\txml: "responseXML", +\t\t\ttext: "responseText", +\t\t\tjson: "responseJSON" +\t\t}, + +\t\t// Data converters +\t\t// Keys separate source (or catchall "*") and destination types with a single space +\t\tconverters: { + +\t\t\t// Convert anything to text +\t\t\t"* text": String, + +\t\t\t// Text to html (true = no transformation) +\t\t\t"text html": true, + +\t\t\t// Evaluate text as a json expression +\t\t\t"text json": JSON.parse, + +\t\t\t// Parse text as xml +\t\t\t"text xml": jQuery.parseXML +\t\t}, + +\t\t// For options that shouldn't be deep extended: +\t\t// you can add your own custom options here if +\t\t// and when you create one that shouldn't be +\t\t// deep extended (see ajaxExtend) +\t\tflatOptions: { +\t\t\turl: true, +\t\t\tcontext: true +\t\t} +\t}, + +\t// Creates a full fledged settings object into target +\t// with both ajaxSettings and settings fields. +\t// If target is omitted, writes into ajaxSettings. +\tajaxSetup: function( target, settings ) { +\t\treturn settings ? + +\t\t\t// Building a settings object +\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + +\t\t\t// Extending ajaxSettings +\t\t\tajaxExtend( jQuery.ajaxSettings, target ); +\t}, + +\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ), +\tajaxTransport: addToPrefiltersOrTransports( transports ), + +\t// Main method +\tajax: function( url, options ) { + +\t\t// If url is an object, simulate pre-1.5 signature +\t\tif ( typeof url === "object" ) { +\t\t\toptions = url; +\t\t\turl = undefined; +\t\t} + +\t\t// Force options to be an object +\t\toptions = options || {}; + +\t\tvar transport, + +\t\t\t// URL without anti-cache param +\t\t\tcacheURL, + +\t\t\t// Response headers +\t\t\tresponseHeadersString, +\t\t\tresponseHeaders, + +\t\t\t// timeout handle +\t\t\ttimeoutTimer, + +\t\t\t// Url cleanup var +\t\t\turlAnchor, + +\t\t\t// Request state (becomes false upon send and true upon completion) +\t\t\tcompleted, + +\t\t\t// To know if global events are to be dispatched +\t\t\tfireGlobals, + +\t\t\t// Loop variable +\t\t\ti, + +\t\t\t// uncached part of the url +\t\t\tuncached, + +\t\t\t// Create the final options object +\t\t\ts = jQuery.ajaxSetup( {}, options ), + +\t\t\t// Callbacks context +\t\t\tcallbackContext = s.context || s, + +\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection +\t\t\tglobalEventContext = s.context && +\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ? +\t\t\t\t\tjQuery( callbackContext ) : +\t\t\t\t\tjQuery.event, + +\t\t\t// Deferreds +\t\t\tdeferred = jQuery.Deferred(), +\t\t\tcompleteDeferred = jQuery.Callbacks( "once memory" ), + +\t\t\t// Status-dependent callbacks +\t\t\tstatusCode = s.statusCode || {}, + +\t\t\t// Headers (they are sent all at once) +\t\t\trequestHeaders = {}, +\t\t\trequestHeadersNames = {}, + +\t\t\t// Default abort message +\t\t\tstrAbort = "canceled", + +\t\t\t// Fake xhr +\t\t\tjqXHR = { +\t\t\t\treadyState: 0, + +\t\t\t\t// Builds headers hashtable if needed +\t\t\t\tgetResponseHeader: function( key ) { +\t\t\t\t\tvar match; +\t\t\t\t\tif ( completed ) { +\t\t\t\t\t\tif ( !responseHeaders ) { +\t\t\t\t\t\t\tresponseHeaders = {}; +\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) { +\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ]; +\t\t\t\t\t} +\t\t\t\t\treturn match == null ? null : match; +\t\t\t\t}, + +\t\t\t\t// Raw string +\t\t\t\tgetAllResponseHeaders: function() { +\t\t\t\t\treturn completed ? responseHeadersString : null; +\t\t\t\t}, + +\t\t\t\t// Caches the header +\t\t\t\tsetRequestHeader: function( name, value ) { +\t\t\t\t\tif ( completed == null ) { +\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] = +\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name; +\t\t\t\t\t\trequestHeaders[ name ] = value; +\t\t\t\t\t} +\t\t\t\t\treturn this; +\t\t\t\t}, + +\t\t\t\t// Overrides response content-type header +\t\t\t\toverrideMimeType: function( type ) { +\t\t\t\t\tif ( completed == null ) { +\t\t\t\t\t\ts.mimeType = type; +\t\t\t\t\t} +\t\t\t\t\treturn this; +\t\t\t\t}, + +\t\t\t\t// Status-dependent callbacks +\t\t\t\tstatusCode: function( map ) { +\t\t\t\t\tvar code; +\t\t\t\t\tif ( map ) { +\t\t\t\t\t\tif ( completed ) { + +\t\t\t\t\t\t\t// Execute the appropriate callbacks +\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] ); +\t\t\t\t\t\t} else { + +\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones +\t\t\t\t\t\t\tfor ( code in map ) { +\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ]; +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t} +\t\t\t\t\treturn this; +\t\t\t\t}, + +\t\t\t\t// Cancel the request +\t\t\t\tabort: function( statusText ) { +\t\t\t\t\tvar finalText = statusText || strAbort; +\t\t\t\t\tif ( transport ) { +\t\t\t\t\t\ttransport.abort( finalText ); +\t\t\t\t\t} +\t\t\t\t\tdone( 0, finalText ); +\t\t\t\t\treturn this; +\t\t\t\t} +\t\t\t}; + +\t\t// Attach deferreds +\t\tdeferred.promise( jqXHR ); + +\t\t// Add protocol if not provided (prefilters might expect it) +\t\t// Handle falsy url in the settings object (#10093: consistency with old signature) +\t\t// We also use the url parameter if available +\t\ts.url = ( ( url || s.url || location.href ) + "" ) +\t\t\t.replace( rprotocol, location.protocol + "//" ); + +\t\t// Alias method option to type as per ticket #12004 +\t\ts.type = options.method || options.type || s.method || s.type; + +\t\t// Extract dataTypes list +\t\ts.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + +\t\t// A cross-domain request is in order when the origin doesn't match the current origin. +\t\tif ( s.crossDomain == null ) { +\t\t\turlAnchor = document.createElement( "a" ); + +\t\t\t// Support: IE <=8 - 11, Edge 12 - 13 +\t\t\t// IE throws exception on accessing the href property if url is malformed, +\t\t\t// e.g. http://example.com:80x/ +\t\t\ttry { +\t\t\t\turlAnchor.href = s.url; + +\t\t\t\t// Support: IE <=8 - 11 only +\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative +\t\t\t\turlAnchor.href = urlAnchor.href; +\t\t\t\ts.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== +\t\t\t\t\turlAnchor.protocol + "//" + urlAnchor.host; +\t\t\t} catch ( e ) { + +\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain, +\t\t\t\t// it can be rejected by the transport if it is invalid +\t\t\t\ts.crossDomain = true; +\t\t\t} +\t\t} + +\t\t// Convert data if not already a string +\t\tif ( s.data && s.processData && typeof s.data !== "string" ) { +\t\t\ts.data = jQuery.param( s.data, s.traditional ); +\t\t} + +\t\t// Apply prefilters +\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + +\t\t// If request was aborted inside a prefilter, stop there +\t\tif ( completed ) { +\t\t\treturn jqXHR; +\t\t} + +\t\t// We can fire global events as of now if asked to +\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) +\t\tfireGlobals = jQuery.event && s.global; + +\t\t// Watch for a new set of requests +\t\tif ( fireGlobals && jQuery.active++ === 0 ) { +\t\t\tjQuery.event.trigger( "ajaxStart" ); +\t\t} + +\t\t// Uppercase the type +\t\ts.type = s.type.toUpperCase(); + +\t\t// Determine if request has content +\t\ts.hasContent = !rnoContent.test( s.type ); + +\t\t// Save the URL in case we're toying with the If-Modified-Since +\t\t// and/or If-None-Match header later on +\t\t// Remove hash to simplify url manipulation +\t\tcacheURL = s.url.replace( rhash, "" ); + +\t\t// More options handling for requests with no content +\t\tif ( !s.hasContent ) { + +\t\t\t// Remember the hash so we can put it back +\t\t\tuncached = s.url.slice( cacheURL.length ); + +\t\t\t// If data is available, append data to url +\t\t\tif ( s.data ) { +\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + +\t\t\t\t// #9682: remove data so that it's not used in an eventual retry +\t\t\t\tdelete s.data; +\t\t\t} + +\t\t\t// Add or update anti-cache param if needed +\t\t\tif ( s.cache === false ) { +\t\t\t\tcacheURL = cacheURL.replace( rantiCache, "$1" ); +\t\t\t\tuncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; +\t\t\t} + +\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732) +\t\t\ts.url = cacheURL + uncached; + +\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658) +\t\t} else if ( s.data && s.processData && +\t\t\t( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { +\t\t\ts.data = s.data.replace( r20, "+" ); +\t\t} + +\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. +\t\tif ( s.ifModified ) { +\t\t\tif ( jQuery.lastModified[ cacheURL ] ) { +\t\t\t\tjqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); +\t\t\t} +\t\t\tif ( jQuery.etag[ cacheURL ] ) { +\t\t\t\tjqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); +\t\t\t} +\t\t} + +\t\t// Set the correct header, if data is being sent +\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { +\t\t\tjqXHR.setRequestHeader( "Content-Type", s.contentType ); +\t\t} + +\t\t// Set the Accepts header for the server, depending on the dataType +\t\tjqXHR.setRequestHeader( +\t\t\t"Accept", +\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? +\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] + +\t\t\t\t\t( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : +\t\t\t\ts.accepts[ "*" ] +\t\t); + +\t\t// Check for headers option +\t\tfor ( i in s.headers ) { +\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] ); +\t\t} + +\t\t// Allow custom headers/mimetypes and early abort +\t\tif ( s.beforeSend && +\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + +\t\t\t// Abort if not done already and return +\t\t\treturn jqXHR.abort(); +\t\t} + +\t\t// Aborting is no longer a cancellation +\t\tstrAbort = "abort"; + +\t\t// Install callbacks on deferreds +\t\tcompleteDeferred.add( s.complete ); +\t\tjqXHR.done( s.success ); +\t\tjqXHR.fail( s.error ); + +\t\t// Get transport +\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + +\t\t// If no transport, we auto-abort +\t\tif ( !transport ) { +\t\t\tdone( -1, "No Transport" ); +\t\t} else { +\t\t\tjqXHR.readyState = 1; + +\t\t\t// Send global event +\t\t\tif ( fireGlobals ) { +\t\t\t\tglobalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); +\t\t\t} + +\t\t\t// If request was aborted inside ajaxSend, stop there +\t\t\tif ( completed ) { +\t\t\t\treturn jqXHR; +\t\t\t} + +\t\t\t// Timeout +\t\t\tif ( s.async && s.timeout > 0 ) { +\t\t\t\ttimeoutTimer = window.setTimeout( function() { +\t\t\t\t\tjqXHR.abort( "timeout" ); +\t\t\t\t}, s.timeout ); +\t\t\t} + +\t\t\ttry { +\t\t\t\tcompleted = false; +\t\t\t\ttransport.send( requestHeaders, done ); +\t\t\t} catch ( e ) { + +\t\t\t\t// Rethrow post-completion exceptions +\t\t\t\tif ( completed ) { +\t\t\t\t\tthrow e; +\t\t\t\t} + +\t\t\t\t// Propagate others as results +\t\t\t\tdone( -1, e ); +\t\t\t} +\t\t} + +\t\t// Callback for when everything is done +\t\tfunction done( status, nativeStatusText, responses, headers ) { +\t\t\tvar isSuccess, success, error, response, modified, +\t\t\t\tstatusText = nativeStatusText; + +\t\t\t// Ignore repeat invocations +\t\t\tif ( completed ) { +\t\t\t\treturn; +\t\t\t} + +\t\t\tcompleted = true; + +\t\t\t// Clear timeout if it exists +\t\t\tif ( timeoutTimer ) { +\t\t\t\twindow.clearTimeout( timeoutTimer ); +\t\t\t} + +\t\t\t// Dereference transport for early garbage collection +\t\t\t// (no matter how long the jqXHR object will be used) +\t\t\ttransport = undefined; + +\t\t\t// Cache response headers +\t\t\tresponseHeadersString = headers || ""; + +\t\t\t// Set readyState +\t\t\tjqXHR.readyState = status > 0 ? 4 : 0; + +\t\t\t// Determine if successful +\t\t\tisSuccess = status >= 200 && status < 300 || status === 304; + +\t\t\t// Get response data +\t\t\tif ( responses ) { +\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses ); +\t\t\t} + +\t\t\t// Convert no matter what (that way responseXXX fields are always set) +\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess ); + +\t\t\t// If successful, handle type chaining +\t\t\tif ( isSuccess ) { + +\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. +\t\t\t\tif ( s.ifModified ) { +\t\t\t\t\tmodified = jqXHR.getResponseHeader( "Last-Modified" ); +\t\t\t\t\tif ( modified ) { +\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified; +\t\t\t\t\t} +\t\t\t\t\tmodified = jqXHR.getResponseHeader( "etag" ); +\t\t\t\t\tif ( modified ) { +\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified; +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\t// if no content +\t\t\t\tif ( status === 204 || s.type === "HEAD" ) { +\t\t\t\t\tstatusText = "nocontent"; + +\t\t\t\t// if not modified +\t\t\t\t} else if ( status === 304 ) { +\t\t\t\t\tstatusText = "notmodified"; + +\t\t\t\t// If we have data, let's convert it +\t\t\t\t} else { +\t\t\t\t\tstatusText = response.state; +\t\t\t\t\tsuccess = response.data; +\t\t\t\t\terror = response.error; +\t\t\t\t\tisSuccess = !error; +\t\t\t\t} +\t\t\t} else { + +\t\t\t\t// Extract error from statusText and normalize for non-aborts +\t\t\t\terror = statusText; +\t\t\t\tif ( status || !statusText ) { +\t\t\t\t\tstatusText = "error"; +\t\t\t\t\tif ( status < 0 ) { +\t\t\t\t\t\tstatus = 0; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t} + +\t\t\t// Set data for the fake xhr object +\t\t\tjqXHR.status = status; +\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + ""; + +\t\t\t// Success/Error +\t\t\tif ( isSuccess ) { +\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); +\t\t\t} else { +\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); +\t\t\t} + +\t\t\t// Status-dependent callbacks +\t\t\tjqXHR.statusCode( statusCode ); +\t\t\tstatusCode = undefined; + +\t\t\tif ( fireGlobals ) { +\t\t\t\tglobalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", +\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] ); +\t\t\t} + +\t\t\t// Complete +\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + +\t\t\tif ( fireGlobals ) { +\t\t\t\tglobalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + +\t\t\t\t// Handle the global AJAX counter +\t\t\t\tif ( !( --jQuery.active ) ) { +\t\t\t\t\tjQuery.event.trigger( "ajaxStop" ); +\t\t\t\t} +\t\t\t} +\t\t} + +\t\treturn jqXHR; +\t}, + +\tgetJSON: function( url, data, callback ) { +\t\treturn jQuery.get( url, data, callback, "json" ); +\t}, + +\tgetScript: function( url, callback ) { +\t\treturn jQuery.get( url, undefined, callback, "script" ); +\t} +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { +\tjQuery[ method ] = function( url, data, callback, type ) { + +\t\t// Shift arguments if data argument was omitted +\t\tif ( jQuery.isFunction( data ) ) { +\t\t\ttype = type || callback; +\t\t\tcallback = data; +\t\t\tdata = undefined; +\t\t} + +\t\t// The url can be an options object (which then must have .url) +\t\treturn jQuery.ajax( jQuery.extend( { +\t\t\turl: url, +\t\t\ttype: method, +\t\t\tdataType: type, +\t\t\tdata: data, +\t\t\tsuccess: callback +\t\t}, jQuery.isPlainObject( url ) && url ) ); +\t}; +} ); + + +jQuery._evalUrl = function( url ) { +\treturn jQuery.ajax( { +\t\turl: url, + +\t\t// Make this explicit, since user can override this through ajaxSetup (#11264) +\t\ttype: "GET", +\t\tdataType: "script", +\t\tcache: true, +\t\tasync: false, +\t\tglobal: false, +\t\t"throws": true +\t} ); +}; + + +jQuery.fn.extend( { +\twrapAll: function( html ) { +\t\tvar wrap; + +\t\tif ( this[ 0 ] ) { +\t\t\tif ( jQuery.isFunction( html ) ) { +\t\t\t\thtml = html.call( this[ 0 ] ); +\t\t\t} + +\t\t\t// The elements to wrap the target around +\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + +\t\t\tif ( this[ 0 ].parentNode ) { +\t\t\t\twrap.insertBefore( this[ 0 ] ); +\t\t\t} + +\t\t\twrap.map( function() { +\t\t\t\tvar elem = this; + +\t\t\t\twhile ( elem.firstElementChild ) { +\t\t\t\t\telem = elem.firstElementChild; +\t\t\t\t} + +\t\t\t\treturn elem; +\t\t\t} ).append( this ); +\t\t} + +\t\treturn this; +\t}, + +\twrapInner: function( html ) { +\t\tif ( jQuery.isFunction( html ) ) { +\t\t\treturn this.each( function( i ) { +\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) ); +\t\t\t} ); +\t\t} + +\t\treturn this.each( function() { +\t\t\tvar self = jQuery( this ), +\t\t\t\tcontents = self.contents(); + +\t\t\tif ( contents.length ) { +\t\t\t\tcontents.wrapAll( html ); + +\t\t\t} else { +\t\t\t\tself.append( html ); +\t\t\t} +\t\t} ); +\t}, + +\twrap: function( html ) { +\t\tvar isFunction = jQuery.isFunction( html ); + +\t\treturn this.each( function( i ) { +\t\t\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); +\t\t} ); +\t}, + +\tunwrap: function( selector ) { +\t\tthis.parent( selector ).not( "body" ).each( function() { +\t\t\tjQuery( this ).replaceWith( this.childNodes ); +\t\t} ); +\t\treturn this; +\t} +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { +\treturn !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { +\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { +\ttry { +\t\treturn new window.XMLHttpRequest(); +\t} catch ( e ) {} +}; + +var xhrSuccessStatus = { + +\t\t// File protocol always yields status code 0, assume 200 +\t\t0: 200, + +\t\t// Support: IE <=9 only +\t\t// #1450: sometimes IE returns 1223 when it should be 204 +\t\t1223: 204 +\t}, +\txhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { +\tvar callback, errorCallback; + +\t// Cross domain only allowed if supported through XMLHttpRequest +\tif ( support.cors || xhrSupported && !options.crossDomain ) { +\t\treturn { +\t\t\tsend: function( headers, complete ) { +\t\t\t\tvar i, +\t\t\t\t\txhr = options.xhr(); + +\t\t\t\txhr.open( +\t\t\t\t\toptions.type, +\t\t\t\t\toptions.url, +\t\t\t\t\toptions.async, +\t\t\t\t\toptions.username, +\t\t\t\t\toptions.password +\t\t\t\t); + +\t\t\t\t// Apply custom fields if provided +\t\t\t\tif ( options.xhrFields ) { +\t\t\t\t\tfor ( i in options.xhrFields ) { +\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ]; +\t\t\t\t\t} +\t\t\t\t} + +\t\t\t\t// Override mime type if needed +\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) { +\t\t\t\t\txhr.overrideMimeType( options.mimeType ); +\t\t\t\t} + +\t\t\t\t// X-Requested-With header +\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are +\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure. +\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup) +\t\t\t\t// For same-domain requests, won't change header if already provided. +\t\t\t\tif ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { +\t\t\t\t\theaders[ "X-Requested-With" ] = "XMLHttpRequest"; +\t\t\t\t} + +\t\t\t\t// Set headers +\t\t\t\tfor ( i in headers ) { +\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] ); +\t\t\t\t} + +\t\t\t\t// Callback +\t\t\t\tcallback = function( type ) { +\t\t\t\t\treturn function() { +\t\t\t\t\t\tif ( callback ) { +\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload = +\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + +\t\t\t\t\t\t\tif ( type === "abort" ) { +\t\t\t\t\t\t\t\txhr.abort(); +\t\t\t\t\t\t\t} else if ( type === "error" ) { + +\t\t\t\t\t\t\t\t// Support: IE <=9 only +\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws +\t\t\t\t\t\t\t\t// errors on any property access that is not readyState +\t\t\t\t\t\t\t\tif ( typeof xhr.status !== "number" ) { +\t\t\t\t\t\t\t\t\tcomplete( 0, "error" ); +\t\t\t\t\t\t\t\t} else { +\t\t\t\t\t\t\t\t\tcomplete( + +\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207 +\t\t\t\t\t\t\t\t\t\txhr.status, +\t\t\t\t\t\t\t\t\t\txhr.statusText +\t\t\t\t\t\t\t\t\t); +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t} else { +\t\t\t\t\t\t\t\tcomplete( +\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status, +\t\t\t\t\t\t\t\t\txhr.statusText, + +\t\t\t\t\t\t\t\t\t// Support: IE <=9 only +\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426) +\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498) +\t\t\t\t\t\t\t\t\t( xhr.responseType || "text" ) !== "text" || +\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== "string" ? +\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } : +\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText }, +\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders() +\t\t\t\t\t\t\t\t); +\t\t\t\t\t\t\t} +\t\t\t\t\t\t} +\t\t\t\t\t}; +\t\t\t\t}; + +\t\t\t\t// Listen to events +\t\t\t\txhr.onload = callback(); +\t\t\t\terrorCallback = xhr.onerror = callback( "error" ); + +\t\t\t\t// Support: IE 9 only +\t\t\t\t// Use onreadystatechange to replace onabort +\t\t\t\t// to handle uncaught aborts +\t\t\t\tif ( xhr.onabort !== undefined ) { +\t\t\t\t\txhr.onabort = errorCallback; +\t\t\t\t} else { +\t\t\t\t\txhr.onreadystatechange = function() { + +\t\t\t\t\t\t// Check readyState before timeout as it changes +\t\t\t\t\t\tif ( xhr.readyState === 4 ) { + +\t\t\t\t\t\t\t// Allow onerror to be called first, +\t\t\t\t\t\t\t// but that will not handle a native abort +\t\t\t\t\t\t\t// Also, save errorCallback to a variable +\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed +\t\t\t\t\t\t\twindow.setTimeout( function() { +\t\t\t\t\t\t\t\tif ( callback ) { +\t\t\t\t\t\t\t\t\terrorCallback(); +\t\t\t\t\t\t\t\t} +\t\t\t\t\t\t\t} ); +\t\t\t\t\t\t} +\t\t\t\t\t}; +\t\t\t\t} + +\t\t\t\t// Create the abort callback +\t\t\t\tcallback = callback( "abort" ); + +\t\t\t\ttry { + +\t\t\t\t\t// Do send the request (this may raise an exception) +\t\t\t\t\txhr.send( options.hasContent && options.data || null ); +\t\t\t\t} catch ( e ) { + +\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet +\t\t\t\t\tif ( callback ) { +\t\t\t\t\t\tthrow e; +\t\t\t\t\t} +\t\t\t\t} +\t\t\t}, + +\t\t\tabort: function() { +\t\t\t\tif ( callback ) { +\t\t\t\t\tcallback(); +\t\t\t\t} +\t\t\t} +\t\t}; +\t} +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { +\tif ( s.crossDomain ) { +\t\ts.contents.script = false; +\t} +} ); + +// Install script dataType +jQuery.ajaxSetup( { +\taccepts: { +\t\tscript: "text/javascript, application/javascript, " + +\t\t\t"application/ecmascript, application/x-ecmascript" +\t}, +\tcontents: { +\t\tscript: /\\b(?:java|ecma)script\\b/ +\t}, +\tconverters: { +\t\t"text script": function( text ) { +\t\t\tjQuery.globalEval( text ); +\t\t\treturn text; +\t\t} +\t} +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { +\tif ( s.cache === undefined ) { +\t\ts.cache = false; +\t} +\tif ( s.crossDomain ) { +\t\ts.type = "GET"; +\t} +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + +\t// This transport only deals with cross domain requests +\tif ( s.crossDomain ) { +\t\tvar script, callback; +\t\treturn { +\t\t\tsend: function( _, complete ) { +\t\t\t\tscript = jQuery( " + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 50'] = ''' + + + + + + Errors — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Errors

+

Core dagster error classes.

+
+
+exception dagster.DagsterExpectationFailedError(expectation_context, value, *args, **kwargs)[source]
+

Thrown with pipeline configured to throw on expectation failure

+
+ +
+
+exception dagster.DagsterInvalidDefinitionError[source]
+

Indicates that some violation of the definition rules has been violated by the user

+
+ +
+
+exception dagster.DagsterInvariantViolationError[source]
+

Indicates the user has violated a well-defined invariant that can only be deteremined +at runtime.

+
+ +
+
+exception dagster.DagsterRuntimeCoercionError[source]
+

Runtime checked faild

+
+ +
+
+exception dagster.DagsterTypeError[source]
+

Indicates an error in the solid type system (e.g. mismatched arguments)

+
+ +
+
+exception dagster.DagsterUserCodeExecutionError(*args, **kwargs)[source]
+

This is base class for any exception that is meant to wrap an Exception +thrown by user code. It wraps that existing user code. The original_exc_info +argument to the ctor is meant to be a sys.exc_info at the site of constructor.

+
+ +
+
+exception dagster.PipelineConfigEvaluationError(pipeline, errors, config_value, *args, **kwargs)[source]
+
+ +
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 51'] = ''' + + + + + + Execution — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Execution

+
+

Execution Functions

+
+
+dagster.execute_pipeline(pipeline, environment_dict=None, run_config=None)[source]
+

“Synchronous” version of execute_pipeline_iterator().

+

Note: raise_on_error is very useful in testing contexts when not testing for error +conditions

+
+
Parameters
+
    +
  • pipeline (PipelineDefinition) – Pipeline to run

  • +
  • environment_dict (dict) – The enviroment configuration that parameterizes this run

  • +
  • run_config (RunConfig) – Configuration for how this pipeline will be executed

  • +
+
+
Returns
+

PipelineExecutionResult

+
+
+
+ +
+
+dagster.execute_pipeline_iterator(pipeline, environment_dict=None, run_config=None)[source]
+

Returns iterator that yields SolidExecutionResult for each +solid executed in the pipeline.

+

This is intended to allow the caller to do things between each executed +node. For the ‘synchronous’ API, see execute_pipeline().

+
+
Parameters
+
    +
  • pipeline (PipelineDefinition) – Pipeline to run

  • +
  • environment_dict (dict) – The enviroment configuration that parameterizes this run

  • +
  • run_config (RunConfig) – Configuration for how this pipeline will be executed

  • +
+
+
Returns
+

Iterator[DagsterEvent]

+
+
+
+ +
+
+

Results

+
+
+class dagster.InProcessExecutorConfig(raise_on_error=True)[source]
+
+ +
+
+class dagster.MultiprocessExecutorConfig(pipeline_fn)[source]
+
+ +
+
+class dagster.PipelineExecutionResult(pipeline, run_id, event_list, reconstruct_context)[source]
+

Result of execution of the whole pipeline. Returned eg by execute_pipeline().

+
+
+result_for_solid(name)[source]
+

Get a SolidExecutionResult for a given solid name.

+
+ +
+
+success
+

Whether the pipeline execution was successful at all steps

+
+ +
+ +
+
+class dagster.SolidExecutionResult(solid, step_events_by_kind, reconstruct_context)[source]
+

Execution result for one solid of the pipeline.

+
+
+context
+

ExecutionContext of that particular Pipeline run.

+
+
Type
+

ExecutionContext

+
+
+
+ +
+
+solid
+

Solid for which this result is

+
+
Type
+

SolidDefinition

+
+
+
+ +
+
+failure_data
+

Returns the failing step’s data that happened during this solid’s execution, if any

+
+ +
+
+skipped
+

Whether the solid execution was skipped

+
+ +
+
+success
+

Whether the solid execution was successful

+
+ +
+
+transformed_value(output_name=\'result\')[source]
+

Returns transformed value either for DEFAULT_OUTPUT or for the output +given as output_name. Returns None if execution result isn’t a success.

+

Reconstructs the pipeline context to materialize value.

+
+ +
+
+transformed_values
+

Return dictionary of transformed results, with keys being output names. +Returns None if execution result isn’t a success.

+

Reconstructs the pipeline context to materialize values.

+
+ +
+ +
+
+

Configuration

+
+
+class dagster.RunConfig[source]
+

Configuration that controls the details of how Dagster will execute a pipeline.

+
+
Parameters
+
    +
  • run_id (str) – The ID to use for this run. If not provided a new UUID will be created using uuid4.

  • +
  • tags (dict[str, str]) – Key value pairs that will be added to logs.

  • +
  • event_callback (callable) – A callback to invoke with each EventRecord produced during execution.

  • +
  • loggers (list) – Additional loggers that log messages will be sent to.

  • +
  • executor_config (ExecutorConfig) – Configuration for where and how computation will occur.

  • +
  • storage_mode (RunStorageMode) – Where intermediate artifacts will be stored during execution.

  • +
  • rexecution_config (RexecutionConfig) – Information about a previous run to allow for subset rexecution.

  • +
  • step_keys_to_execute (list[str]) – They subset of steps from a pipeline to execute this run.

  • +
+
+
+
+ +
+
+class dagster.RunStorageMode[source]
+

An enumeration.

+
+ +
+
+class dagster.SolidExecutionResult(solid, step_events_by_kind, reconstruct_context)[source]
+

Execution result for one solid of the pipeline.

+
+
+context
+

ExecutionContext of that particular Pipeline run.

+
+
Type
+

ExecutionContext

+
+
+
+ +
+
+solid
+

Solid for which this result is

+
+
Type
+

SolidDefinition

+
+
+
+ +
+
+failure_data
+

Returns the failing step’s data that happened during this solid’s execution, if any

+
+ +
+
+skipped
+

Whether the solid execution was skipped

+
+ +
+
+success
+

Whether the solid execution was successful

+
+ +
+
+transformed_value(output_name=\'result\')[source]
+

Returns transformed value either for DEFAULT_OUTPUT or for the output +given as output_name. Returns None if execution result isn’t a success.

+

Reconstructs the pipeline context to materialize value.

+
+ +
+
+transformed_values
+

Return dictionary of transformed results, with keys being output names. +Returns None if execution result isn’t a success.

+

Reconstructs the pipeline context to materialize values.

+
+ +
+ +
+
Environment Dict Schema

The environment_dict used by execute_pipeline and +execute_pipeline_iterator has the following schema:

+
{
+  # configuration for Solids
+  'solids': {
+
+    # these keys align with the names of the solids, or their alias in this pipeline
+    '_solid_name_': {
+
+      # pass any data that was defined via config_field
+      'config': _,
+
+       # materialize input values, keyed by input name
+       'inputs': {
+         '_input_name_': {'value': _value_}
+        }
+      }
+    },
+
+    # configuration for PipelineContextDefinitions
+    'context': {
+
+      # these keys align with the names defined via context_definitions on PipelineDefinition
+      '_context_name_': {
+
+        # pass any config data that was defined via config_field
+        'config': _,
+
+        # configuration for ResourceDefinitions
+        'resources': {
+
+          # these keys align with the names defined via resources on PipelineContextDefinitions
+          '_resource_name_': {
+
+            # pass any data that was defined via config_field
+            'config': _
+          }
+        }
+      }
+    }
+  }
+}
+
+
+
+
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 52'] = ''' + + + + + + Pipelines — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Pipelines

+
+
+class dagster.PipelineDefinition(solids, name=None, description=None, context_definitions=None, dependencies=None)[source]
+

A instance of a PipelineDefinition represents a pipeline in dagster.

+

A pipeline is comprised of:

+
    +
  • +
    Solids:

    Each solid represents a functional unit of data computation.

    +
    +
    +
  • +
  • +
    Context Definitions:

    Pipelines can be designed to execute in a number of different operating environments +(e.g. prod, dev, unittest) that require different configuration and setup. A context +definition defines how a context (of type ExecutionContext) is created and what +configuration is necessary to create it.

    +
    +
    +
  • +
  • +
    Dependencies:

    Solids within a pipeline are arranged as a DAG (directed, acyclic graph). Dependencies +determine how the values produced by solids flow through the DAG.

    +
    +
    +
  • +
+
+
Parameters
+
    +
  • solids (List[SolidDefinition]) – The set of solid definitions used in this pipeline.

  • +
  • name (Optional[str]) –

  • +
  • despcription (Optional[str]) –

  • +
  • context_definitions (Optional[Dict[str, PipelineContextDefinition]]) – A mapping of context names to PipelineContextDefinition.

  • +
  • dependencies (Optional[Dict[Union[str, SolidInstance], Dict[str, DependencyDefinition]]]) – A structure that declares where each solid gets its inputs. The keys at the top +level dict are either string names of solids or SolidInstances. The values +are dicts that map input names to DependencyDefinitions.

  • +
+
+
+
+
+name
+

Name of the pipeline. Must be unique per-repository.

+
+
Type
+

str

+
+
+
+ +
+
+description
+

Description of the pipeline. Optional.

+
+
Type
+

str

+
+
+
+ +
+
+solids
+

List of the solids in this pipeline.

+
+
Type
+

List[SolidDefinition]

+
+
+
+ +
+
+dependencies
+

Dependencies that constitute the structure of the pipeline. This is a two-dimensional +array that maps solid_name => input_name => DependencyDefinition instance

+
+
Type
+

Dict[str, Dict[str, DependencyDefinition]]

+
+
+
+ +
+
+context_definitions
+

The context definitions available for consumers of this pipelines. For example, a +unit-testing environment and a production environment probably have very different +configuration and requirements. There would be one context definition per +environment.

+

Only one context will be used at runtime, selected by environment configuration.

+
+
Type
+

Dict[str, PipelineContextDefinition]

+
+
+
+ +
+
+dependency_structure
+

Used mostly internally. This has the same information as the dependencies data +structure, but indexed for fast usage.

+
+
Type
+

DependencyStructure

+
+
+
+ +
+
+display_name
+

Name suitable for exception messages, logging etc. If pipeline +is unnamed the method with return “<<unnamed>>”.

+
+
Returns
+

Display name of pipeline

+
+
Return type
+

str

+
+
+
+ +
+
+has_solid(name)[source]
+

Return whether or not the solid is in the piepline

+
+
Parameters
+

name (str) – Name of solid

+
+
Returns
+

True if the solid is in the pipeline

+
+
Return type
+

bool

+
+
+
+ +
+
+solid_named(name)[source]
+

Return the solid named “name”. Throws if it does not exist.

+
+
Parameters
+

name (str) – Name of solid

+
+
Returns
+

SolidDefinition with correct name.

+
+
Return type
+

SolidDefinition

+
+
+
+ +
+
+solids
+

Return the solids in the pipeline.

+
+
Returns
+

List of solids.

+
+
Return type
+

List[SolidDefinition]

+
+
+
+ +
+ +
+
+class dagster.DependencyDefinition[source]
+

Dependency definitions represent an edge in the DAG of solids. This object is +used with a dictionary structure (whose keys represent solid/input where the dependency +comes from) so this object only contains the target dependency information.

+
+
Parameters
+
    +
  • solid (str) – The name of the solid that is the target of the dependency. +This is the solid where the value passed between the solids +comes from.

  • +
  • output (str) – The name of the output that is the target of the dependency. +Defaults to “result”, the default output name of solids with a single output.

  • +
  • description (str) – Description of this dependency. Optional.

  • +
+
+
+
+ +
+
+class dagster.SolidInstance[source]
+

A solid identifier in a dependency structure. Allows supplying parameters to the solid, +like the alias.

+
+
Parameters
+
    +
  • name (str) – Name of the solid in the pipeline to instance.

  • +
  • alias (Optional[str]) – Name for this instance of the solid. Necessary when there are multiple instances +of the same solid.

  • +
+
+
+

Example

+
pipeline = Pipeline(
+    solids=[solid_1, solid_2]
+    dependencies={
+        SolidInstance('solid_2', alias='other_name') : {
+            'input_name' : DependencyDefinition('solid_2'),
+        },
+        'solid_1' : {
+            'input_name': DependencyDefinition('other_name'),
+        },
+    }
+)
+
+
+
+ +
+
+
+

Contexts & Resources

+
+
+class dagster.PipelineContextDefinition(context_fn=None, config_field=None, resources=None, description=None)[source]
+

Defines a context type supported by a pipeline.

+

Pipelines declare the different context types they support, in the form +of PipelineContextDefinitions. For example a pipeline could declare a context +definition for different operating environments: unittest, integration tests, +production and so forth. The user provides a context function that returns an +ExecutionContext that is passed to every solid. One can hang resources +(such as db connections) off of that context. Thus the pipeline author +has complete control over how the author of each individual solid within +the pipeline interacts with its operating environment.

+

The PipelineContextDefinition is passed to the PipelineDefinition in +a dictionary keyed by its name so the name is not present in this object.

+
+
Parameters
+
    +
  • context_fn (Callable) –

    Signature of context_fn: +(pipeline: PipelineDefintion, config_value: Any) => ExecutionContext

    +

    Returns or yields an ExecutionContext.

    +

    If it yields a context, the code after the yield executes after pipeline +completion, just like a python context manager.

    +

  • +
  • config_field (Field) – Define the configuration for the context

  • +
  • description (str) –

  • +
+
+
+
+
+config_field
+

The configuration for the pipeline context.

+
+
Type
+

Field

+
+
+
+ +
+
+context_fn
+

Signature is (pipeline: PipelineDefintion, config_value: Any) : +ExecutionContext.

+

A callable that either returns or yields an ExecutionContext.

+
+
Type
+

callable

+
+
+
+ +
+
+description
+

A description of what this context represents

+
+
Type
+

str

+
+
+
+ +
+
+static passthrough_context_definition(context_params)[source]
+

Create a context definition from a pre-existing context. This can be useful +in testing contexts where you may want to create a context manually and then +pass it into a one-off PipelineDefinition

+
+
Parameters
+

context (ExecutionContext) – The context that will provided to the pipeline.

+
+
Returns
+

The passthrough context definition.

+
+
Return type
+

PipelineContextDefinition

+
+
+
+ +
+ +
+
+class dagster.InitContext[source]
+

InitContext is the context object provided to context creation functions. +In effect, it is the state available to those functions, and any function that +is called prior to pipeline execution, plus the configuration value for that context.

+
+
+context_config
+

The configuration data provided by the environment config. The schema for this +data is defined by config_field on the PipelineContextDefinition

+
+
Type
+

Any

+
+
+
+ +
+
+pipeline_def
+

The pipeline definition currently being executed.

+
+
Type
+

PipelineDefinition

+
+
+
+ +
+
+run_id
+

The ID for this run of the pipeline.

+
+
Type
+

str

+
+
+
+ +
+ +
+
+class dagster.ExecutionContext[source]
+

The user-facing object in the context creation function. The user constructs +this in order to effect the context creation process. This could be named +SystemPipelineExecutionContextCreationData although that seemed excessively verbose.

+
+
Parameters
+
    +
  • loggers (List[Logger]) –

  • +
  • () (resources) –

  • +
  • tags (dict[str, str]) –

  • +
+
+
+
+ +
+
+class dagster.ResourceDefinition(resource_fn, config_field=None, description=None)[source]
+

Resources are pipeline-scoped ways to make external resources (like database connections) +available to solids during pipeline execution and clean up after execution resolves.

+
+
Parameters
+
    +
  • resource_fn (Callable[[InitResourceContext], Any]) – User provided function to instantiate the resource. This resource will be available to +solids via context.resources

  • +
  • config_field (Field) – The type for the configuration data for this resource, passed to resource_fn via +init_context.resource_config

  • +
  • description (str) –

  • +
+
+
+
+ +
+
+@dagster.resource(config_field=None, description=None)[source]
+

A decorator for creating a resource. The decorated function will be used as the +resource_fn in a ResourceDefinition.

+
+ +
+
+class dagster.InitResourceContext[source]
+

Similar to InitContext, but is resource specific. It includes all the properties +in the InitContext, plus the resource config and the resource definition.

+
+
+context_config
+

The configuration data provided by the environment config. The schema for this +data is defined by config_field on the PipelineContextDefinition

+
+
Type
+

Any

+
+
+
+ +
+
+resource_config
+

The configuration data provided by the environment config. The schema for this +data is defined by config_field on the ResourceDefinition

+
+
Type
+

Any

+
+
+
+ +
+
+pipeline_def
+

The pipeline definition currently being executed.

+
+
Type
+

PipelineDefinition

+
+
+
+ +
+
+resource_def
+

The resource definition for the resource being constructed.

+
+
Type
+

ResourceDefinition

+
+
+
+ +
+
+run_id
+

The ID for this run of the pipeline.

+
+
Type
+

str

+
+
+
+ +
+ +
+
+
+

Repositories

+
+
+class dagster.RepositoryDefinition(name, pipeline_dict, repo_config=None, enforce_solid_def_uniqueness=True)[source]
+

Define a repository that contains a collection of pipelines.

+
+
Parameters
+
    +
  • name (str) – The name of the pipeline.

  • +
  • pipeline_dict (Dict[str, callable]) –

    An dictionary of pipelines. The value of the dictionary is a function that takes +no parameters and returns a PipelineDefiniton.

    +

    We pass callables instead of the PipelineDefinitions itself so that they can be +created on demand when accessed by name.

    +

    As the pipelines are retrieved it ensures that the keys of the dictionary and the +name of the pipeline are the same.

    +

  • +
  • repo_config (Optional[dict]) – Preset configurations for pipelines such as environments and execution subsets

  • +
+
+
+
+
+get_all_pipelines()[source]
+

Return all pipelines as a list

+
+
Returns
+

+
+
Return type
+

List[PipelineDefinition]

+
+
+
+ +
+
+get_pipeline(name)[source]
+

Get a pipeline by name. Only constructs that pipeline and caches it.

+
+
Parameters
+

name (str) – Name of the pipeline to retriever

+
+
Returns
+

Instance of PipelineDefinition with that name.

+
+
Return type
+

PipelineDefinition

+
+
+
+ +
+ +
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 53'] = ''' + + + + + + Solids — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Solids

+

The foundational unit of composition in Dagster.

+
+
+
+class dagster.SolidDefinition(name, inputs, transform_fn, outputs, config_field=None, description=None, metadata=None)[source]
+

A solid (a name extracted from the acronym of “software-structured data” (SSD)) represents +a unit of computation within a data pipeline.

+

As its core, a solid is a function. It accepts inputs (which are values produced from +other solids) and configuration, and produces outputs. These solids are composed as a +directed, acyclic graph (DAG) within a pipeline to form a computation that produces +data assets.

+

Solids should be implemented as idempotent, parameterizable, non-destructive functions. +Data computations with these properties are much easier to test, reason about, and operate.

+

The inputs and outputs are gradually, optionally typed by the dagster type system. Types +can be user-defined and can represent entities as varied as scalars, dataframe, database +tables, and so forth. They can represent pure in-memory objects, or handles to assets +on disk or in external resources.

+

A solid is a generalized abstraction that could take many forms.

+

End users should prefer the @solid and @lambda_solid decorator. SolidDefinition +is generally used by framework authors.

+
+
Parameters
+
    +
  • name (str) – Name of the solid.

  • +
  • inputs (List[InputDefinition]) – Inputs of the solid.

  • +
  • transform_fn (Callable[[SystemTransformExecutionContext, ], Iterable[Union[Result, Materialization]]]) –

    The core of the solid, the function that does the actual computation. The arguments passed to +this function after context are deteremined by inputs.

    +

    This function yields Result according to outputs or Materialization.

    +

  • +
  • outputs (List[OutputDefinition]) – Outputs of the solid.

  • +
  • config_field (Optional[Field]) – How the solid configured.

  • +
  • description (Optional[str]) – Description of the solid.

  • +
  • metadata (Optional[Dict[Any, Any]]) – Arbitrary metadata for the solid. Some frameworks expect and require +certain metadata to be attached to a solid.

  • +
+
+
+

Examples

+
def _add_one(_context, inputs):
+    yield Result(inputs["num"] + 1)
+
+SolidDefinition(
+    name="add_one",
+    inputs=[InputDefinition("num", Int)],
+    outputs=[OutputDefinition(Int)], # default name ("result")
+    transform_fn=_add_one,
+)
+
+
+
+ +
+
+class dagster.InputDefinition(name, dagster_type=None, expectations=None, description=None)[source]
+

An InputDefinition instance represents an argument to a transform defined within a solid. +Inputs are values within the dagster type system that are created from previous solids.

+
+
+name
+

Name of the input.

+
+
Type
+

str

+
+
+
+ +
+
+runtime_type
+

Type of the input. Defaults to types.Any

+
+
Type
+

DagsterType

+
+
+
+ +
+
+expectations
+

List of expectations that applies to the value passed to the solid.

+
+
Type
+

List[ExpectationDefinition]

+
+
+
+ +
+
+description
+

Description of the input. Optional.

+
+
Type
+

str

+
+
+
+ +
+ +
+
+class dagster.OutputDefinition(dagster_type=None, name=None, expectations=None, description=None, is_optional=False)[source]
+

An OutputDefinition represents an output from a solid. Solids can have multiple +outputs. In those cases the outputs must be named. Frequently solids have only one +output, and so the user can construct a single OutputDefinition that will have +the default name of “result”.

+
+
+runtime_type
+

Type of the output. Defaults to types.Any.

+
+
Type
+

DagsterType

+
+
+
+ +
+
+name
+

Name of the output. Defaults to “result”.

+
+
Type
+

str

+
+
+
+ +
+
+expectations List[ExpectationDefinition]
+

Expectations for this output.

+
+ +
+
+description
+

Description of the output. Optional.

+
+
Type
+

str

+
+
+
+ +
+
+is_optional
+

If this output is optional. Optional, defaults to false.

+
+
Type
+

bool

+
+
+
+ +
+ +
+
+class dagster.Result[source]
+

A solid transform function return a stream of Result objects. +An implementator of a SolidDefinition must provide a transform that +yields objects of this type.

+
+
+value
+

Value returned by the transform.

+
+
Type
+

Any

+
+
+
+ +
+
+output_name
+

Name of the output returns. defaults to “result”

+
+
Type
+

str

+
+
+
+ +
+ +
+
+class dagster.Materialization[source]
+
+ +
+
+

Decorators

+

The concise way to define solids.

+
+
+@dagster.lambda_solid(name=None, inputs=None, output=None, description=None)[source]
+

(decorator) Create a simple solid.

+

This shortcut allows the creation of simple solids that do not require +configuration and whose implementations do not require a context.

+

Lambda solids take inputs and produce a single output. The body of the function +should return a single value.

+
+
Parameters
+
    +
  • name (str) – Name of solid.

  • +
  • inputs (list[InputDefinition]) – List of inputs.

  • +
  • output (OutputDefinition) – The output of the solid. Defaults to OutputDefinition().

  • +
  • description (str) – Solid description.

  • +
+
+
+

Examples

+
@lambda_solid
+def hello_world():
+    return 'hello'
+
+@lambda_solid(inputs=[InputDefinition(name='foo')])
+def hello_world(foo):
+    return foo
+
+
+
+ +
+
+@dagster.solid(name=None, inputs=None, outputs=None, config_field=None, description=None)[source]
+

(decorator) Create a solid with specified parameters.

+

This shortcut simplifies the core solid API by exploding arguments into kwargs of the +transform function and omitting additional parameters when they are not needed. +Parameters are otherwise as in the core API, SolidDefinition.

+

The decorated function will be used as the solid’s transform function. Unlike in the core API, +the transform function does not have to yield Result object directly. Several +simpler alternatives are available:

+
    +
  1. Return a value. This is returned as a Result for a single output solid.

  2. +
  3. Return a Result. Works like yielding result.

  4. +
  5. Return an instance of MultipleResults. Works like yielding several results for +multiple outputs. Useful for solids that have multiple outputs.

  6. +
  7. Yield Result. Same as default transform behaviour.

  8. +
+
+
Parameters
+
    +
  • name (str) – Name of solid.

  • +
  • inputs (list[InputDefinition]) – List of inputs.

  • +
  • outputs (list[OutputDefinition]) – List of outputs.

  • +
  • config_field (Field) – The configuration for this solid.

  • +
  • description (str) – Description of this solid.

  • +
+
+
+

Examples

+
@solid
+def hello_world(_context):
+    print('hello')
+
+@solid()
+def hello_world(_context):
+    print('hello')
+
+@solid(outputs=[OutputDefinition()])
+def hello_world(_context):
+    return {'foo': 'bar'}
+
+@solid(outputs=[OutputDefinition()])
+def hello_world(_context):
+    return Result(value={'foo': 'bar'})
+
+@solid(outputs=[OutputDefinition()])
+def hello_world(_context):
+    yield Result(value={'foo': 'bar'})
+
+@solid(outputs=[
+    OutputDefinition(name="left"),
+    OutputDefinition(name="right"),
+])
+def hello_world(_context):
+    return MultipleResults.from_dict({
+        'left': {'foo': 'left'},
+        'right': {'foo': 'right'},
+    })
+
+@solid(
+    inputs=[InputDefinition(name="foo")],
+    outputs=[OutputDefinition()]
+)
+def hello_world(_context, foo):
+    return foo
+
+@solid(
+    inputs=[InputDefinition(name="foo")],
+    outputs=[OutputDefinition()],
+)
+def hello_world(context, foo):
+    context.log.info('log something')
+    return foo
+
+@solid(
+    inputs=[InputDefinition(name="foo")],
+    outputs=[OutputDefinition()],
+    config_field=Field(types.Dict({'str_value' : Field(types.String)})),
+)
+def hello_world(context, foo):
+    # context.solid_config is a dictionary with 'str_value' key
+    return foo + context.solid_config['str_value']
+
+
+
+ +
+
+class dagster.MultipleResults[source]
+

A shortcut to output multiple results.

+

When using the @solid API, you may return an instance of +MultipleResults from a decorated transform function instead of yielding multiple results.

+
+
+results
+

list of Result

+
+
Type
+

list[Result]

+
+
+
+ +

Examples

+
@solid(outputs=[
+    OutputDefinition(name='foo'),
+    OutputDefinition(name='bar'),
+])
+def my_solid():
+    return MultipleResults(
+        Result('Barb', 'foo'),
+        Result('Glarb', 'bar'),
+    )
+
+
+@solid(outputs=[
+    OutputDefinition(name='foo'),
+    OutputDefinition(name='bar'),
+])
+def my_solid_from_dict():
+    return MultipleResults.from_dict({
+        'foo': 'Barb',
+        'bar': 'Glarb',
+    })
+
+
+
+
+static from_dict(result_dict)[source]
+

Create a new MultipleResults object from a dictionary.

+

Keys of the dictionary are unpacked into result names.

+
+
Parameters
+

result_dict (dict) –

+
+
Returns
+

(MultipleResults) A new MultipleResults object

+
+
+
+ +
+ +
+
+
+

Expectations

+
+
+class dagster.ExpectationDefinition(name, expectation_fn, description=None)[source]
+

Expectations represent a data quality test. It performs an arbitrary computation +to see if a given input or output satisfies the expectation.

+
+
+name
+

The name of the expectation. Names should be unique per-solid.

+
+
Type
+

str

+
+
+
+ +
+
+expectation_fn
+

This is the implementation of an expectation computation. It should be a callback +with the signature (context: ExecutionContext, info: +ExpectationExecutionInfo, value: Any) : ExpectationResult.

+

“value” conforms to the type check performed within the Dagster type system.

+

e.g. If the expectation is declared on an input of type dagster_pandas.DataFrame, +you can assume that value is a pandas.DataFrame.

+
+
Type
+

callable

+
+
+
+ +
+
+description
+

Description of expectation. Optional.

+
+
Type
+

str

+
+
+
+ +

Examples

+
InputDefinition('some_input', types.Int, expectations=[
+    ExpectationDefinition(
+        name='is_positive',
+        expectation_fn=lambda(
+            _info,
+            value,
+        ): ExpectationResult(success=value > 0),
+    )
+])
+
+
+
+ +
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 54'] = ''' + + + + + + Types — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Types

+

Dagster type system.

+
+

Builtin Types

+
+
+dagster.Any
+
+ +

No rules. No fear. No limits.

+
+
+dagster.Bool
+
+ +

Validates at runtime time that isinstance(value, bool)

+
+
+dagster.Int
+
+ +

Validates at runtime time that isinstance(value, six.integer_types)

+
+
+dagster.Float
+
+ +

Validates at runtime time that isinstance(value, float)

+
+
+dagster.String
+
+ +

Validates at runtime time that isinstance(value, six.string_types)

+
+
+dagster.Path
+
+ +

Same validation as String, useful for communicating that this string +represents a file path.

+
+
+dagster.Nothing
+
+ +

A way to establish execution dependencies without communicating +values. When a solid uses InputDefinition of type +Nothing, no parameters are passed to to the transform_fn +for that input.

+
+
+dagster.Nullable(inner_type)[source]
+

Validates at runtime that the type is either None or passes validation of inner_type

+
+
Parameters
+

inner_type (DagsterType) –

+
+
+
+ +
+
+dagster.List(inner_type)[source]
+

Validates at runtime that the value is List[inner_type].

+
+
Parameters
+

inner_type (DagsterType) –

+
+
+
+ +
+
+
+

Config Types

+

The following types are used to describe the schema of configuration +data via config_field. They are used in conjunction with the +builtin types above.

+
+
+dagster.Field(dagster_type, default_value=<class \'dagster.core.types.field_utils.__FieldValueSentinel\'>, is_optional=<class \'dagster.core.types.field_utils.__InferOptionalCompositeFieldSentinel\'>, description=None)[source]
+

The schema for configuration data that describes the type, optionality, defaults, and description.

+
+
Parameters
+
    +
  • dagster_type (DagsterType) – A DagsterType describing the schema of this field, ie Dict({‘example’: Field(String)})

  • +
  • default_value (Any) – A default value to use that respects the schema provided via dagster_type

  • +
  • is_optional (bool) – Whether the presence of this field is optional

  • +
  • despcription (str) –

  • +
+
+
+
+ +
+
+dagster.Dict(fields)[source]
+

Schema for configuration data with string keys and typed values via Field .

+
+
Parameters
+

fields (Dict[str, Field]) –

+
+
+
+ +
+
+
+

Making New Types

+
+
+dagster.as_dagster_type(existing_type, name=None, description=None, input_schema=None, output_schema=None, serialization_strategy=None, storage_plugins=None)[source]
+

Takes a python cls and creates a type for it in the Dagster domain.

+
+
Parameters
+
    +
  • existing_type (cls) – The python type you want to project in to the Dagster type system.

  • +
  • name (Optional[str]) –

  • +
  • description (Optiona[str]) –

  • +
  • input_schema (Optional[InputSchema]) – An instance of a class that inherits from InputSchema that +can map config data to a value of this type.

  • +
  • output_schema (Optiona[OutputSchema]) – An instance of a class that inherits from OutputSchema that +can map config data to persisting values of this type.

  • +
  • serialization_strategy (Optional[SerializationStrategy]) – The default behavior for how to serialize this value for +persisting between execution steps.

  • +
  • storage_plugins (Optional[Dict[RunStorageMode, TypeStoragePlugin]]) – Storage type specific overrides for the serialization strategy. +This allows for storage specific optimzations such as effecient +distributed storage on S3.

  • +
+
+
+
+ +
+
+dagster.dagster_type(name=None, description=None, input_schema=None, output_schema=None, serialization_strategy=None, storage_plugins=None)[source]
+

Decorator version of as_dagster_type. See documentation for as_dagster_type() .

+
+ +
+
+class dagster.PythonObjectType(python_type, key=None, name=None, **kwargs)[source]
+
+ +
+
+class dagster.RuntimeType(key, name, is_builtin=False, description=None, input_schema=None, output_schema=None, serialization_strategy=None, storage_plugins=None)[source]
+

The class backing DagsterTypes as they are used during execution.

+
+ +
+
+class dagster.ConfigType(key, name, type_attributes=ConfigTypeAttributes(is_builtin=False, is_system_config=False), description=None)[source]
+

The class backing DagsterTypes as they are used processing configuration data.

+
+ +
+
+dagster.NamedDict(name, fields, description=None, type_attributes=ConfigTypeAttributes(is_builtin=False, is_system_config=False))[source]
+

A Dict with a name allowing it to be referenced by that name.

+
+ +
+
+
+

Schema

+
+
+dagster.Selector(fields)[source]
+

Selectors are used when you want to be able present several different options to the user but +force them to select one. For example, it would not make much sense to allow them +to say that a single input should be sourced from a csv and a parquet file: They must choose.

+

Note that in other type systems this might be called an “input union.”

+
+
Parameters
+

fields (Dict[str, Field]) –

+
+
+
+ +
+
+dagster.NamedSelector(name, fields, description=None, type_attributes=ConfigTypeAttributes(is_builtin=False, is_system_config=False))[source]
+

A :py:class`Selector` with a name, allowing it to be referenced by that name.

+
+
Parameters
+
    +
  • name (str) –

  • +
  • fields (Dict[str, Field]) –

  • +
+
+
+
+ +
+
+dagster.input_schema(config_cls)[source]
+

A decorator for annotating a function that can turn a config_value in to +an instance of a custom type.

+
+
Parameters
+

config_cls (Any) –

+
+
+
+ +
+
+dagster.input_selector_schema(config_cls)[source]
+

A decorator for annotating a function that can take the selected properties +from a config_value in to an instance of a custom type.

+
+
Parameters
+

config_cls (Selector) –

+
+
+
+ +
+
+dagster.output_schema(config_cls)[source]
+

A decorator for a annotating a function that can take a config_value +and an instance of a custom type and materialize it.

+
+
Parameters
+

config_cls (Any) –

+
+
+
+ +
+
+dagster.output_selector_schema(config_cls)[source]
+

A decorator for a annotating a function that can take the selected properties +of a config_value and an instance of a custom type and materialize it.

+
+
Parameters
+

config_cls (Selector) –

+
+
+
+ +
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 55'] = ''' + + + + + + Utilities — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Utilities

+
+
+dagster.execute_solid(pipeline_def, solid_name, inputs=None, environment_dict=None)[source]
+
+ +
+
+dagster.execute_solids(pipeline_def, solid_names, inputs=None, environment_dict=None)[source]
+
+ +
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 56'] = ''' + + + + + + Code of Conduct — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Code of Conduct

+
+

Our Pledge

+

In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation.

+
+
+

Our Standards

+

Examples of behavior that contributes to creating a positive environment +include:

+
    +
  • Using welcoming and inclusive language

  • +
  • Being respectful of differing viewpoints and experiences

  • +
  • Gracefully accepting constructive criticism

  • +
  • Focusing on what is best for the community

  • +
  • Showing empathy towards other community members

  • +
+

Examples of unacceptable behavior by participants include:

+
    +
  • The use of sexualized language or imagery and unwelcome sexual attention or +advances

  • +
  • Trolling, insulting/derogatory comments, and personal or political attacks

  • +
  • Public or private harassment

  • +
  • Publishing others’ private information, such as a physical or electronic +address, without explicit permission

  • +
  • Other conduct which could reasonably be considered inappropriate in a +professional setting

  • +
+
+
+

Our Responsibilities

+

Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior.

+

Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful.

+
+
+

Scope

+

This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers.

+
+
+

Enforcement

+

Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team on Slack. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately.

+

Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project’s leadership.

+
+
+

Attribution

+

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

+

For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq

+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 57'] = ''' + + + + + + Community — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Community

+

Here, we’ve including instructions for how to contribute to the Dagster project. We welcome both +code contributions and issue reports.

+ +
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 58'] = ''' + + + + + + Contributing — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Contributing

+

If you are planning to contribute to dagster, you will need to set up a local +development environment.

+
+

Local development setup

+
    +
  1. Install Python. Python 3.6 or above recommended.

    +
    +

    Note: If you use Python 3.7 dagster-airflow will not install and run properly +as airflow is not Python 3.7 compatible. Until [AIRFLOW-2876](https://github.com/apache/airflow/pull/3723) +is resolved (expected in 1.10.3), Airflow (and, as a consequence, dagster-airflow) +is incompatible with Python 3.7.

    +

    The rest of the modules will work properly so you can ignore this error and develop the rest +of the modules.

    +
    +
  2. +
  3. Create and activate a virtualenv.

  4. +
+
$ python3 -m venv dagsterenv
+$ source dagsterenv/bin/activate
+
+
+
    +
  1. Install yarn. If you are on macOS, this should be:

  2. +
+
$ brew install yarn
+
+
+

4. Run the script dev_env_setup.sh at repo root. This sets up a full +dagster developer environment with all modules and runs tests that +do not require heavy external dependencies such as docker. This will +take a few minutes.

+
+

$ ./dev_env_setup.sh

+
+
    +
  1. Run some tests manually to make sure things are working.

    +
    +

    $ pytest python_modules/dagster/dagster_tests

    +
    +
  2. +
+

Have fun coding!

+
    +
  1. Set up pre-commit hooks

  2. +
+

We use black to enforce a consistent code style. To set up a pre-commit hook, just run:

+
$ pre-commit install
+
+
+

(The pre-commit package is installed in dagster’s dev-requirements.)

+
+

Running dagit webapp in development

+

For development, run the dagit GraphQL server on a different port than the +webapp, from any directory that contains a repository.yml file. For example:

+
$ cd dagster/python_modules/dagster/dagster/tutorials/intro_tutorial
+$ dagit -p 3333
+
+
+

Keep this running. Then, in another terminal, run the local development +(autoreloading, etc.) version of the webapp:

+
$ cd dagster/js_modules/dagit
+$ make dev_webapp
+
+
+

To run JavaScript tests for the dagit frontend, you can run:

+
$ cd dagster/js_modules/dagit
+$ yarn test
+
+
+

In webapp development it’s handy to run yarn run jest --watch to have an +interactive test runner.

+

Some webapp tests use snapshots–auto-generated results to which the test +render tree is compared. Those tests are supposed to break when you change +something.

+

Check that the change is sensible and run yarn run jest -u to update the +snapshot to the new result. You can also update snapshots interactively +when you are in --watch mode.

+
+
+

Releasing

+

Projects are released using the Python script at dagster/bin/publish.py.

+
+
+

Developing docs

+

Running a live html version of the docs can expedite documentation development.

+
$ cd python_modules/dagster/docs
+$ make livehtml
+
+
+
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 59'] = ''' + + + + + + Release Notes — Dagster + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Release Notes

+

Dagster versions follow the guidelines in PEP 440.

+

To make dependency management easier in the context of a monorepo with many installable projects, +package versions move in lockstep with each other and with git tags.

+

As the API is still in flux, we aren’t following strict semantic versioning rules at this point, but roughly +intend micro versions to reflect a regular release schedule and minor versions to reflect +milestones in the framework’s capability.

+
+

0.4.0

+

API Changes

+
    +
  • There is now a new top-level configuration section storage which controls whether or not +execution should store intermediate values and the history of pipeline runs on the filesystem, +on S3, or in memory. The dagster CLI now includes options to list and wipe pipeline run +history. Facilities are provided for user-defined types to override the default serialization +used for storage.

  • +
  • Similarily, there is a new configuration for RunConfig where the user can specify +intermediate value storage via an API.

  • +
  • OutputDefinition now contains an explicit is_optional parameter and defaults to being +not optional.

  • +
  • New functionality in dagster.check: is_list

  • +
  • New functionality in dagster.seven: py23-compatible FileNotFoundError, json.dump, +json.dumps.

  • +
  • Dagster default logging is now multiline for readability.

  • +
  • The Nothing type now allows dependencies to be constructed between solids that do not have +data dependencies.

  • +
  • Many error messages have been improved.

  • +
  • throw_on_user_error has been renamed to raise_on_error in all APIs, public and private

  • +
+

GraphQL

+
    +
  • The GraphQL layer has been extracted out of Dagit into a separate dagster-graphql package.

  • +
  • startSubplanExecution has been replaced by executePlan.

  • +
  • startPipelineExecution now supports reexecution of pipeline subsets.

  • +
+

Dagit

+
    +
  • It is now possible to reexecute subsets of a pipeline run from Dagit.

  • +
  • Dagit’s Execute tab now opens runs in separate browser tabs and a new Runs tab allows you to +browse and view historical runs.

  • +
  • Dagit no longer scaffolds configuration when creating new Execute tabs. This functionality will +be refined and revisited in the future.

  • +
  • Dagit’s Explore tab is more performant on large DAGs.

  • +
  • The dagit -q command line flag has been deprecated in favor of a separate command-line +dagster-graphql utility.

  • +
  • The execute button is now greyed out when Dagit is offline.

  • +
  • The Dagit UI now includes more contextual cues to make the solid in focus and its connections +more salient.

  • +
  • Dagit no longer offers to open materializations on your machine. Clicking an on-disk +materialization now copies the path to your clipboard.

  • +
  • Pressing Ctrl-Enter now starts execution in Dagit’s Execute tab.

  • +
  • Dagit properly shows List and Nullable types in the DAG view.

  • +
+

Dagster-Airflow

+
    +
  • Dagster-Airflow includes functions to dynamically generate containerized (DockerOperator-based) +and uncontainerized (PythonOperator-based) Airflow DAGs from Dagster pipelines and config.

  • +
+

Libraries

+
    +
  • Dagster integration code with AWS, Great Expectations, Pandas, Pyspark, Snowflake, and Spark +has been reorganized into a new top-level libraries directory. These modules are now +importable as dagster_aws, dagster_ge, dagster_pandas, dagster_pyspark, +dagster_snowflake, and dagster_spark.

  • +
  • Removed dagster-sqlalchemy and dagma

  • +
+

Examples

+
    +
  • Added the event-pipeline-demo, a realistic web event data pipeline using Spark and Scala.

  • +
  • Added the Pyspark pagerank example, which demonstrates how to incrementally introduce dagster +into existing data processing workflows.

  • +
+

Documentation

+
    +
  • Docs have been expanded, reorganized, and reformatted.

  • +
+
+
+

0.3.5

+

Dagit

+
    +
  • Dagit now defaults to --watch; run dagit --no-watch to disable (process-based) +autoreloading.

  • +
+
+
+

0.3.4

+

API Changes

+
    +
  • ExecutionMetadata has been renamed to RunConfig

  • +
  • throw_on_user_error is no longer a top level argument to execute_pipeline, but +instead is part of the InProcessExecutorConfig

  • +
  • We no longer include values of configs in config parsing error exception to prevent +accidental logging of sensitive information that might be in config files.

  • +
+

Dagit

+
    +
  • Show total execution time at the bottom of the execution pane

  • +
  • Remove extra scrollbars in Windows and Mac with external mouse

  • +
  • New dynamics for multiple runs in dagit; run history; better tabbing behavior.

  • +
+

Dagstermill

+
    +
  • Repo registration is now optional; “Hello, World” examples are now boilerplate free.

  • +
+
+
+

0.3.3

+

API Changes

+
    +
  • Removed step, environment_config, event_callback, has_event_callback, +persistence_strategy, events, and execution_metadata properties from user-facing +context objects.

  • +
  • Removed solid_subset parameter to execute_pipeline.

  • +
  • check.inst and associated methods take type tuples.

  • +
+

GraphQL

+
    +
  • StartSubplanExecutionInvalidStepsError and InvalidSubplanExecutionError replaced +with more exact StartSubplanExecutionInvalidStepError and +InvalidSubplanMissingInputError

  • +
+

Dagit

+
    +
  • Dagit can launch Jupyter to explore and execute Dagstermill output notebooks.

  • +
+

Bugfixes

+
    +
  • #849: Dagit watches fewer files and runs faster.

  • +
  • #856: Execution steps are displayed in order in Dagit.

  • +
  • #863, #865: Dagstermill errors are reported.

  • +
  • #873: Dagit provides visual feedback as soon as pipelines are executed.

  • +
  • #871: Pipeline validation errors appear in Dagit.

  • +
  • #872: Dagit logs stream reliably.

  • +
+
+
+

0.3.2

+

API Changes

+
    +
  • The info object passed to transform and expectation functions has been renamed to context. +All fields that were previously available on the info.context object are now hoisted to the +top level context object. Additionally an alias for config has been introduced: +solid_config. So where you would have written info.config it is now +context.solid_config Logging should be done with the top-level property context.log. +The context and config properies on this new context object are deprecated, will warn +for now, and be eliminated when 0.4.0 is released.

  • +
  • The info object passed context and resource creation functions is now named init_context +by convention.

  • +
  • PipelineExecutionResult’s (returned from execute_pipeline) result_list property has been +renamed to solid_result_list

  • +
  • execute_pipeline_iterator now returns an iterable of ExecutionStepEvent instead of +SolidExecutionResult

  • +
  • Breaking: All arguments named environment to execute_pipeline and its variants has +been renamed to environment_dict.

  • +
  • Breaking: Types of objects flowed as the first argument to context, resource, transform, and +expectation functions have been renamed. If you do instanceof checks on these objects, they will +fail. Property-level compatibility has not changed and should not require code changes.

  • +
+

GraphQL

+
    +
  • StepResult has been renamed to StepEvent.

  • +
  • stepResults property on startSubplanExecution has been renamed to stepEvents.

  • +
  • StepSuccessResult is now SuccessfulStepOutputEvent

  • +
  • StepFailureResult is now StepFailureEvent

  • +
  • Added UNMARSHAL_INPUT and MARSHAL_OUTPUT values to the StepKind enumeration. +Marshalling steps are now implemented as execution steps themselves.

  • +
+

Dagit

+
    +
  • Link to output notebook rendered in dagit when dagstermill solids are executed.

  • +
+

Dagstermill

+
    +
  • Dagstermill solids now required reduced scaffolding.

  • +
+

Bugfixes

+
    +
  • #792: execute_pipeline_iterator now properly streams results at step-event granularity.

  • +
  • #820: Unbreak config scaffolding within dagit.

  • +
+
+
+

0.3.1

+

API Changes

+
    +
  • New decorator-based @resource API as a more concise alternative to ResourceDefinition

  • +
  • Dagster config type system now supports enum types. (dagster.Enum and dagster.EnumType)

  • +
  • New top level properties resources and log on info.

  • +
  • The context stack in RuntimeExecutionContext is no longer modifiable by the user during a +transform. It has been renamed to tags.

  • +
  • ReentrantInfo has been renamed to ExecutionMetadata

  • +
+

GraphQL

+
    +
  • GraphQL queries and mutations taking a pipeline name now take both a pipeline name and an optional +solid subset and have slightly improved call signatures.

  • +
  • The config and runtime type system split is now reflected in the GraphQL frontend. This was the +infrastructure piece that allowed the fix to #598. runtimeTypeOrError and +configTypeOrError are now top level fields, and there are configTypes and +runtimeTypes fields on Pipeline. Top-level field type and types property on Pipeline +has been eliminated.

  • +
  • StepTag has been renamed to ``StepKind

  • +
  • Added s``tartSubplanExecution`` to enable pipeline execution at step subset granularity

  • +
  • Deprecated ExecutionStep.name in favor of ExecutionStep.key

  • +
  • Added isBuiltin to RuntimeType

  • +
+

Dagit

+
    +
  • Execute tab now supports partial pipeline execution via a solid selector in the bottom left.

  • +
  • Dagit execute button is redesigned, indicates running state, and is unpressable when the +dagit process is dead.

  • +
  • The config editor now offers autocompletion for enum values.

  • +
+

Dagstermill

+
    +
  • Dagstermill has a dramatically improved parameter passing experience and scaffolding and is ready +for broader consumption.

  • +
+

Bugfixes

+
    +
  • #598: Correctly display input and output schemas for types in dagit

  • +
  • #670: Internal system error “dagster.check.CheckError: Invariant failed. Description: Should not +be in context” raised when user throwing error during transform. Now the appropriate user error +should be raised.

  • +
  • #672: Dagit sometimes hangs (TypeError: unsupported operand type(s) for -: ‘float’ and +‘NoneType’ in console log)

  • +
  • #575: Improve error messaging by masking anonymous type names

  • +
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 60'] = ''' + + + + + + Install — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Install

+
+

Quick Start

+

To install dagster and dagit, run:

+
$ pip install dagster dagit
+
+
+

This will install the latest stable version of dagster’s packages in your current Python +environment.

+
+
+

Detailed Installation Guide

+

Dagster is tested on Python 3.7.3, 3.6.8, 3.5.7, and 2.7.16. Python 3 is strongly +encouraged – if you can, you won’t regret making the switch!

+

To check that Python and the pip package manager are already installed, you can run:

+
$ python --version
+$ pip --version
+
+
+

If you’re running Python 3.3 or later, you already have the venv package for managing +virtualenvs. On Python 2.7, you can check whether you have the virtualenv tool installed by +running:

+
$ virtualenv --version
+
+
+

If these tools aren’t present on your system, you can install them as follows:

+
+

Ubuntu

+
$ sudo apt update
+$ sudo apt install python3-dev python3-pip
+
+
+
+
+

macOS

+

Using Homebrew:

+
$ brew update
+$ brew install python  # Python 3
+
+
+

On Python 2.7, you can install virtualenv with:

+
$ sudo pip install -U virtualenv  # system-wide install
+
+
+
+
+

Windows (Python 3)

+
    +
  • Install the Microsoft Visual C++ 2015 Redistributable Update 3. This comes with Visual Studio 2015 but can be installed separately as follows:

    +
      +
    1. Go to the Visual Studio downloads,

    2. +
    3. Select Redistributables and Build Tools,

    4. +
    5. Download and install the Microsoft Visual C++ 2015 Redistributable Update 3.

    6. +
    +
  • +
  • Install the 64-bit Python 3 release for Windows (select pip as an optional feature).

  • +
+

To use the dagit tool, you will also need to +install yarn.

+
+
+

Notes on Python virtualenvs

+

We strongly recommend installing dagster inside a Python virtualenv. If you are +running Anaconda, you should install dagster inside a Conda environment.

+

To create a virtual environment on Python 3, you can just run:

+
$ python3 -m venv ~/.venvs/dagster
+
+
+

This will create a new Python environment whose interpreter and libraries +are isolated from those installed in other virtual environments, and +(by default) any libraries installed in a “system” Python installed as part +of your operating system.

+

On Python 2, you can use a tool like +virtualenvwrapper +to manage your virtual environments, or just run:

+
$ virtualenv ~/.venvs/dagster
+
+
+

You’ll then need to ‘activate’ the virtualenvironment, in bash by +running:

+
$ source ~/.venvs/dagster/bin/activate
+
+
+

(For other shells, see the +venv documentation.)

+

If you are using Anaconda, you can run:

+
$ conda create --name dagster
+
+
+

And then, on macOS or Ubuntu:

+
$ source activate dagster
+
+
+

Or, on Windows:

+
$ activate dagster
+
+
+
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 61'] = ''' + + + + + + Learn — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Learn

+ + +
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 62'] = ''' + + + + + + Principles — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Principles

+

Dagster is opinionated about how data pipelines should be built and structured. What do we think +is important?

+
+

Functional

+

Data pipelines should be expressed as DAGs (directed acyclic graphs) of functional, idempotent +computations. Individual nodes in the graph consume their inputs, perform some computation, and +yield outputs, either with no side effects or with clearly advertised side effects. Given the +same inputs and configuration, the computation should always produce the same output. If these +computations have external dependencies, these should be parametrizable, so that the computations +may execute in different environments.

+
+
    +
  • See Maxime Beauchemin’s Medium article on Functional Data Engineering +for an excellent overview of functional programing in batch computations.

  • +
+
+
+
+

Self-describing

+

Data pipelines should be self-describing, with rich metadata and types. Users should be able to +approach an unfamiliar pipeline and use tooling to inspect it and discover its structure, +capabilities, and requirements. Pipeline metadata should be co-located with the pipeline’s actual +code: documentation and code should be delivered as a single artifact.

+
+
+

Compute-agnostic

+

Heterogeneity in data pipelines is the norm, rather than the exception. Data pipelines are written +collaboratively by many people in different personas – data engineers, machine-learning engineers, +data scientists, analysts and so on – who have different needs and tools, and are particular about +those tools.

+

Dagster has opinions about best practices for structuring data pipelines. It has no opinions +about what libraries and engines should do actual compute. Dagster pipelines can be made up of +any Python computations, whether they use Pandas, Spark, or call out to SQL or any other DSL or +library deemed appropriate to the task.

+
+
+

Testable

+

Testing data pipelines is notoriously difficult. Because testing is so difficult, it is often never +done, or done poorly. Dagster pipelines are designed to be tested. Dagster provides explicit support +for pipeline authors to manage and maintain multiple execution environments – for example, unit +testing, integration testing, and production environments. Dagster can also execute arbitrary +subsets and nodes of pipelines, which is critical for testability (and useful in operational +contexts as well).

+
+
+

Verifiable data quality

+

Testing code is important in data pipelines, but it is not sufficient. Data quality tests – run +during every meaningful stage of computation in production – are critical to reduce the +maintenance burden of data pipelines. Pipeline authors generally do not have control over their +input data, and make many implicit assumptions about that data. Data formats can also change +over time. In order to control this entropy, Dagster encourages users to computationally verify +assumptions (known as expectations) about the data as part of the pipeline process. This way, when +those assumptions break, the breakage can be reported quickly, easily, and with rich metadata +and diagnostic information. These expectations can also serve as contracts between teams.

+
+
+
+
+
+

Gradual, optional typing

+

Dagster contains a type system to describe the values flowing through the pipeline and the +configuration of the pipeline. As pipelines mature, gradual typing lets nodes in a pipeline +know if they are properly arranged and configured prior to execution, and provides rich +documentation and runtime error checking.

+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 63'] = ''' + + + + + + New Concepts in 0.3.0 — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

New Concepts in 0.3.0

+

The upgrade guide describes the changes you are require to make to install 0.3.0. This guide +describes the changes you should make in order to use the latest capabilities. The new concepts +take some getting used to, but are quite powerful.

+
+

Resources

+

In 0.2.0 the notion of resources were relatively informal. This is no longer true: They are now an +officially supported abstraction. They break apart context creation into composable, reusable +chunks of software.

+
+

Defining a Resource

+

Let’s take a typical unittest context.

+

Before:

+
def define_unittest_context():
+    return PipelineContextDefinition(
+        config_field=Field(
+            Dict(
+                {
+                    'data_source_run_id' : _data_source_run_id_field(),
+                    'conf' : _conf_field(),
+                    'log_level' : _log_level_field(),
+                    'cleanup_files' : _cleanup_field(),
+                },
+            )
+        ),
+        context_fn=create_fileload_unittest_context,
+        description='''
+Context for use in unit tests. It does not allow for any interaction with aws
+or s3, and can only be used for a subset of the pipeline that can execute on a
+local machine.
+
+This context does not log to file and also has a configurable log_level.
+        '''
+    )
+
+def create_fileload_unittest_context(info):
+    data_source_run_id = info.config['data_source_run_id']
+    log_level = level_from_string(info.config['log_level'])
+    pipeline_run_id = str(uuid.uuid4())
+
+    resources = FileloadResources(
+        aws=None,
+        redshift=None,
+        bucket_path=None,
+        local_fs=LocalFsHandleResource.for_pipeline_run(pipeline_run_id),
+        sa=None,
+        pipeline_guid=data_source_run_id)
+
+    yield ExecutionContext(
+        loggers=[define_colored_console_logger('dagster', log_level)],
+        resources=resources,
+        tags={
+            'data_source_run_id': data_source_run_id,
+            'data_source': 'new_data',
+            'pipeline_run_id': pipeline_run_id,
+        },
+    )
+
+
+

That’s quite the ball of wax for what should be relatively straightforward. And this doesn’t even +include the boilerplate FileloadResources class as well. We’re going to break this apart using +the ResourceDefinition abstraction and eliminate the need for that class.

+

The only real reusable resource here is the LocalFsHandleResource, so let’s break that out into +itss own ResourceDefinition.

+
def define_local_fs_resource():
+    def _create_resource(init_context):
+        resource = LocalFsHandleResource.for_pipeline_run(init_context.run_id)
+        yield resource
+        if init_context.resource_config['cleanup_files']:
+            LocalFsHandleResource.clean_up_dir(init_context.run_id)
+
+    return ResourceDefinition(
+        resource_fn=_create_resource,
+        config_field=Field(
+            Dict({'cleanup_files': Field(Bool, is_optional=True, default_value=True)})
+        ),
+    )
+
+
+

This is now a self-contained piece that can be reused in other contexts as well.

+

Aside: We now guarantee a system-generated run_id, so the manually created pipeline_guid resource +is no longer relevant.

+

The rest of the “resources” in the unittesting context are None, and we have a special helper to +create “none” resources.

+

Let’s put it all together:

+
def define_unittest_context():
+    return PipelineContextDefinition(
+        config_field=Field(Dict({
+            'log_level' : _log_level_field(),
+            'data_source_run_id': _data_source_run_id_field(),
+        })),
+        resources={
+            'local_fs': define_local_fs_resource(),
+            'aws': ResourceDefinition.none_resource(),
+            'redshift': ResourceDefinition.none_resource(),
+            'bucket_path': ResourceDefinition.none_resource(),
+            'sa': ResourceDefinition.none_resource(),
+        },
+        context_fn=create_fileload_unittest_context,
+        description='''
+Context for use in unit tests. It does not allow for any interaction with aws
+or s3, and can only be used for a subset of the pipeline that can execute on a
+local machine.
+
+This context does not log to file and also has a configurable log_level.
+        '''
+    )
+
+def create_fileload_unittest_context(init_context):
+    data_source_run_id = init_context.context_config['data_source_run_id']
+    log_level = level_from_string(init_context.context_config['log_level'])
+
+    yield ExecutionContext(
+        loggers=[define_colored_console_logger('dagster', log_level)],
+        tags={
+            'data_source_run_id': data_source_run_id,
+            'data_source': 'new_data',
+        },
+    )
+
+
+

Notice a few things. The bulk of the context creation function is now gone. Instead of having to +manually create the FileloadResources, that is replaced by a class (a namedtuple) that is +system-synthesized. Predictably it has N fields, one for each resource. The pipeline-code-facing +API is the same, it just requires less boilerplate within the pipeline infrastructure.

+
+
+

Configuring a Resource

+

The configuration schema changes, as each resource has itss own section.

+

Before:

+
environment = {
+    'context':{
+        'unittest' : {
+            'config' : {
+                'data_source_run_id': str(uuid.uuid4()),
+                'conf': CONF,
+                'log_level': 'ERROR',
+                'cleanup_files': False,
+            }
+        }
+    },
+    'solids': {
+        'unzip_file': {
+            'config' : {
+                'zipped_file': ZIP_FILE_PATH,
+            }
+        }
+    }
+}
+
+
+

In particular we need to move cleanup_files to a resource section of the config.

+
environment = {
+    'context':{
+        'unittest' : {
+            'config' : {
+                'data_source_run_id': str(uuid.uuid4()),
+                'log_level': 'ERROR',
+            },
+            'resources' : {
+                'local_fs': {
+                    'config' : {
+                        'cleanup_files': False,
+                    }
+                }
+            }
+        }
+    },
+    'solids': {
+        'unzip_file': {
+            'config' : {
+                'zipped_file': ZIP_FILE_PATH,
+            }
+        }
+    }
+}
+
+
+

While slightly more verbose, you will be able to count on more consistent of configuration +between pipelines as you reuse resources, and you an even potentially share resource configuration +between pipelines using the configuration file merging feature of 0.3.0

+
+
+
+

Resource Libraries

+

The real promise of resources to build a library of resuable, composable resources.

+

For example, here would be a resource to create a redshift connection.

+
def define_redshift_sa_resource():
+    def _create_resource(init_context):
+        user = init_context.resource_config['user']
+        password = init_context.resource_config['password']
+        host = init_context.resource_config['host']
+        port = init_context.resource_config['port']
+        dbname = init_context.resource_config['dbname']
+        return sa.create_engine(f'postgresql://{user}:{password}@{host}:{port}/{dbname}')
+
+    return ResourceDefinition(
+        resource_fn=_create_resource,
+        config_field=Field(
+            Dict(
+                {
+                    'user' : Field(String),
+                    'password' : Field(String),
+                    'host' : Field(String),
+                    'port' : Field(Int),
+                    'dbname' : Field(String),
+                }
+            )
+        )
+    )
+
+
+

This could be used – unmodified – across all your pipelines. This will also make it easier to +write reusable solids as they can know that they will be using the same resource. Indeed, we may +formalize this in subsequent releases, allowing solids to formally declare their dependencies on +specific resource types.

+
+
+

Solid-Level Configs to Inputs

+

With the new ability to source inputs from the environment config files, we anticipate that +solid-level configuration will become much less common, and instead that we will uses inputs +and outputs exclusively.

+

Let’s use another example from the a typical fileload pipeline.

+

Before:

+
@solid(
+    name='unzip_file',
+    inputs=[],
+    outputs=[OutputDefinition(dagster_type=DagsterTypes.PathToFile)],
+    description='''
+This takes a single, pre-existing zip folder with a single file and unzips it,
+and then outputs the path to that file.
+''',
+    config_def=ConfigDefinition(
+        types.ConfigDictionary('UnzipFileConfig', {'zipped_file' : Field(types.Path)}),
+    ),
+)
+def unzip_file(info):
+    context = info.context
+    zipped_file = info.config['zipped_file']
+
+
+

You’ll note that in 0.2.8 we have to model the incoming zipped file as config rather than an +input because unzip_file had no upstream dependencies and inputs +had to come from previous solids. In 0.3.0 this is no longer true. Inputs +can be sourced from the config file now, which means that by default you should +be modeling such things as inputs.

+

After:

+
@solid(
+    name='unzip_file',
+    inputs=[InputDefinition('zipped_file', Path)],
+    outputs=[OutputDefinition(Path)],
+    description='''
+This takes a single, pre-existing zip folder with a single file and unzips it,
+and then outputs the path to that file.
+''',
+)
+def unzip_file(context, zipped_file):
+    # ...
+    pass
+
+
+

In order to invoke a pipeline that contains this solid, you need to satisy this input in the +environment config.

+

Before:

+
    environment = {
+        # .. context section omitted
+        'solids': {
+            'unzip_file': {
+                'config' : {
+                    'zipped_file': ZIP_FILE_PATH,
+                }
+            }
+        }
+    }
+
+
+

After:

+
    environment = {
+        # .. context section omitted
+        'solids': {
+            'unzip_file': {
+                'inputs' : {
+                    'zipped_file': ZIP_FILE_PATH,
+                }
+            }
+        }
+    }
+
+
+

What’s great about this new input structure is that now the unzip_file is more reusable as it could +be reused in the middle of a pipeline with its input coming from a previous solid, or as a solid +at the beginning of a pipeline.

+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 64'] = ''' + + + + + + Upgrading to 0.3.0 — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Upgrading to 0.3.0

+

This guide is a step-by-step guide for upgrading from dagster 0.2.x to 0.3.0. This represents a +substantial upgrade in capabilities but also some breaking API changes. We’ll detail them, provide +context and reasoning, and instructions about how to upgrade.

+
+

Required API Changes

+
+

1. No more top level config subpackage.

+

Error:

+
from dagster import (
+ImportError: cannot import name 'config'
+
+
+

We have eliminated the public-facing “config” namespace. (You use raw dictionaries instead of a +parallel, typed API to configure pipeline runs).

+

Fix: Simply eliminate the include. You’ll run into related errors later.

+
+
+

2. No more dagster.sqlalchemy and dagster.pandas submodules.

+

Error:

+
E   ModuleNotFoundError: No module named 'dagster.sqlalchemy'
+
+
+

We have moved pandas and sqlalchemy code into their own separate modules (dagster-pandas and +dagster-sqlalchemy). This makes the core dagster library have less dependencies.

+

Fix: Instead of importing dagster.sqlalchemy you need to pip install dagster-sqlalchemy, +add it to your virtual env, and then include dagster_sqlalchemy instead.

+
+
+

3. ConfigDefinition no longer exists.

+

Error:

+
ImportError: cannot import name 'ConfigDefinition'
+
+
+

We have eliminated a separate notion of a ConfigDefinition. Instead, we realized the user provided +config in a solid, resource, or context is just a Field that you would use to build a Dict or +Selector. So replace ConfigDefinition with Field. (Generally config_def=ConfigDefinition is +now config_field=Field)

+

Before:

+
"production": PipelineContextDefinition(
+    context_fn=generate_production_execution_context,
+    config_def=ConfigDefinition(
+        # ...
+    )
+
+
+

After:

+
"production": PipelineContextDefinition(
+    context_fn=generate_production_execution_context,
+    config_field=Field(
+       # ...
+    )
+
+
+
+
+
+

4. New, Simpler Dagster Type Definition API.

+

Error:

+
    description='''This represents a path to a file on disk'''
+E   TypeError: __init__() got multiple values for argument 'python_type'
+
+
+

Another Error:

+
E   dagster.check.ParameterCheckError: Param "klass" was supposed to be a type. Got <dagster.core.types.runtime.PythonObjectType object at 0x11e4fbf60> instead of type <class 'dagster.core.types.runtime.PythonObjectType'>
+
+
+

There are now two different type creation APIs. One for creating new types, and one for annotating existing types that you include.

+

Examples:

+
@dagster_type(description='This represents a path to a file on disk')
+class PathToFile(str):
+    pass
+
+S3FileHandle = as_dagster_type(
+    namedtuple('S3FileHandle', 'bucket path'),
+    description='''
+upload_header_to_s3 and upload_service_line_to_s3 both result in files
+being uploaded to s3. Hence the "output" of those two solids is a handle
+to a file. The following stages take those as their inputs to create
+redshift tables out of them.
+
+Properties:
+    - bucket: String
+    - path: String
+        '''
+)
+
+
+

Note you can use S3FileHandle and PathToFile as if they were just “normal types” as well.

+
+
+

5. ConfigDictionary –> NamedDict or Dict

+

We have a much less verbose API for building configuration schema:

+

Error:

+
E   AttributeError: module 'dagster.core.types' has no attribute 'ConfigDictionary
+
+
+

First, we are discouraging the use of the types namespace. Instead just +from dagster import Dict (or whatever class directly). +Second, ConfigDictionary is now just NamedDict. If the name of the type wasn’t +particularily relevant you can also eliminate that and just use Dict. +Third, you do not have to name it. The net result is much nicer:

+

Before:

+
types.ConfigDictionary(
+    'DefaultContextConfig',
+    {
+        'data_source_run_id' : Field(types.String, description='''
+            This is a run id generated by the caller of this pipeline. Right
+            now this is required to tie a single run id to multiple executions
+            of the same pipeline.
+        '''),
+        'conf' : Field(types.Any),
+    },
+)
+
+
+

After:

+
Dict({
+    'data_source_run_id' : Field(String, description='''
+        This is a run id generated by the caller of this pipeline. Right
+        now this is required to tie a single run id to multiple executions
+        of the same pipeline.
+    '''),
+    'conf' : Field(Any),
+})
+
+
+

This is a fairly mechanical transition.

+
+
+

6. define_stub_solid no longer in top-level dagster

+

This is now an internal utility function. If you really, really need it:

+

from dagster.core.utility_solids import define_stub_solid

+
+
+

7. Environments are raw dictionaries rather than config.* classes

+

Per update 1 config classes no longer are public or used in the execute_pipeline family of APIs. +Use raw dictionaries instead. They should be shaped exactly like the yaml files.

+

Before:

+
    environment = config.Environment(
+        context=config.Context(
+            name='unittest',
+            config={
+                'data_source_run_id': str(uuid.uuid4()),
+                'conf': CONF,
+                'log_level': 'ERROR',
+                'cleanup_files': False,
+            }
+        ),
+        solids={
+            'unzip_file': config.Solid({
+                'zipped_file': ZIP_FILE_PATH
+            }),
+        },
+    )
+
+
+

After:

+
    environment = {
+        'context':{
+            'unittest' : {
+                'config' : {
+                    'data_source_run_id': str(uuid.uuid4()),
+                    'conf': CONF,
+                    'log_level': 'ERROR',
+                    'cleanup_files': False,
+                }
+            }
+        },
+        'solids': {
+            'unzip_file': {
+                'config' : {
+                    'zipped_file': ZIP_FILE_PATH,
+                }
+            }
+        }
+    }
+
+
+

While providing less guarantees within the python type system, this API results in very high quality +error checking and messaging from the dagster config schema.

+
+
+

8. New testing APIs

+

Error:

+
 AttributeError: type object 'PipelineDefinition' has no attribute 'create_sub_pipeline'
+
+
+

or

+
AttributeError: type object 'PipelineDefinition' has no attribute 'create_single_solid_pipeline'
+
+
+

The creation of “sub” and “single_solid” pipelines was awkward and error-prone. Instead we have +the new functions execute_solid and execute_solids. You can now execute a single solid with a +single function call.

+

Before:

+
    pipeline = PipelineDefinition.create_single_solid_pipeline(
+        define_fileload_pipeline(),
+        'unzip_file',
+    )
+
+    result = execute_pipeline(pipeline, environment)
+
+    assert result.success
+    assert os.path.exists(
+        result.result_for_solid('unzip_file').transformed_value())
+
+
+

After:

+
    solid_result = execute_solid(
+        define_fileload_pipeline(),
+        'unzip_file',
+        environment=environment
+    )
+
+    assert solid_result.success
+    assert os.path.exists(solid_result.transformed_value())
+
+
+

Before (with stubbed inputs):

+
    pipeline = PipelineDefinition.create_single_solid_pipeline(
+        define_fileload_pipeline(),
+        'split_headers_and_service_lines',
+        {
+            'split_headers_and_service_lines': {
+                'unzipped_file':
+                define_stub_solid('unzipped_path_value', unzipped_path)
+            }
+        },
+    )
+
+    result = execute_pipeline(pipeline, environment)
+
+    assert result.success
+    solid_result = result.result_for_solid('split_headers_and_service_lines')
+    assert os.path.exists(solid_result.transformed_value('header_file'))
+    assert os.path.exists(solid_result.transformed_value('service_lines_file'))
+
+
+

After (with stubbed inputs):

+
    solid_result = execute_solid(
+        define_fileload_pipeline(),
+        'split_headers_and_service_lines',
+        inputs={
+            'unzipped_file': unzipped_path,
+        },
+        environment=environment,
+    )
+
+    assert os.path.exists(solid_result.transformed_value('header_file'))
+    assert os.path.exists(solid_result.transformed_value('service_lines_file'))
+
+
+

Before (subset execution):

+
    pipeline = PipelineDefinition.create_sub_pipeline(
+        define_fileload_pipeline(),
+        ['unzip_file'],
+        ['split_headers_and_service_lines'],
+        {},
+    )
+
+    result = execute_pipeline(pipeline, environment)
+
+
+    assert result.success
+    solid_result = result.result_for_solid('split_headers_and_service_lines')
+    snapshot_check_results(snapshot, solid_result)
+
+
+

After (subset execution):

+
    result_dict = execute_solids(
+        define_pipeline(),
+        ['unzip_file', 'split_headers_and_service_lines'],
+        environment=environment,
+    )
+
+    snapshot_check_results(snapshot, result_dict['split_headers_and_service_lines'])
+
+
+
+
+

9. Execution Context Lifecycle Changes

+

Error:

+
AttributeError: 'ExecutionContext' object has no attribute 'value'
+
+
+

This is officially the most difficult change, conceptually. We changed the system so that the +ExecutionContext passed around to your solids (now RuntimeExecutionContext) is constructed +by the system rather than the user. The ExecutionContext object the user creates can be thought +of as RuntimeExecutionContextParams. We opted against that name because it was excessively +verbose.

+

Before:

+
    with context.value('data_source_run_id', data_source_run_id),\\
+        context.value('data_source', 'new_data'),\\
+        context.value('pipeline_run_id', pipeline_run_id):
+
+        yield ExecutionContext(
+            loggers=[define_colored_console_logger('dagster', log_level)],
+            resources=resources
+        )
+
+
+

After:

+
    # because you no longer need the with clause here you can just return
+    # the ExecutionContext object directly
+    return ExecutionContext(
+        loggers=[define_colored_console_logger('dagster', log_level)],
+        resources=resources,
+        tags={
+            'data_source_run_id': data_source_run_id,
+            'data_source': 'new_data',
+            'pipeline_run_id': pipeline_run_id,
+        },
+    )
+
+
+
+
    +
  1. Non-null by default

  2. +
+

Error:

+
E   dagster.core.errors.DagsterTypeError: Solid solid_name input input_name received value None which does not pass the typecheck for Dagster type PandasDataFrame. Step solid_name.transform
+
+
+

You have encountered a type error. Likely it is because in 0.2.8, types could +accept None by default, and this is no longer true in 0.3.0. You have to opt into accepting nulls.

+

Before:

+
@solid(outputs=[OutputDefinition(dagster_type=dagster_pd.DataFrame)])
+def return_none(context):
+    return None # None no longer allowed, would break at runtime
+
+
+

After:

+
@solid(outputs=[OutputDefinition(dagster_type=Nullable(dagster_pd.DataFrame))])
+def return_none(context):
+    return None # Because of Nullable wrapper, this is ok
+
+
+
+
+

11. Solid name uniqueness per-repository enforce by default

+

Error:

+
 dagster.core.errors.DagsterInvalidDefinitionError: Trying to add duplicate solid def solid_one in pipeline_two, Already saw in pipeline_one.
+
+
+

We enforce that solid names are unique per-repository by default. This is to setup +a future where you can look up a solid by name in a repository and view that as an +independent entity, among other things. An example of a feature this enables is the +ability to index back into all the places where that solid is used.

+

As a temporary measure, we have added an enforce_uniqueness boolean flag to +RepositoryDefinition construction. However, this will not be supported forever as +we will be building features that rely on that property.

+

Fix is:

+

+    return RepositoryDefinition(
+        name='repo_name',
+        enforce_uniqueness=True, # add this flag
+        pipeline_dict={...}
+    )
+
+
+

The preferred option is to make solid names unique. Prefixing solids in +offending pipelines with the pipeline name would be a straightforward approach +to solve this quickly. This would also guarantee that a later change would not +trigger this error again.

+
+
+

12. Context is now a top-level argument to solids

+

This is not a breaking change, but it will improve developer ergonomics +and is relatively straightforward to do.

+

Before:

+
    @solid
+    def a_solid(info):
+        info.context.info('something')
+        info.context.resources.a_resource.do_something()
+
+
+

After:

+
    @solid
+    def a_solid(context):
+        context.log.info('something') # log in the name is more clear
+        context.resources.a_resource.do_something() # resources available top-level
+        context.run_id # run_id available as top level property
+        # no longer info.context.config as it was confusing
+        # when switching between resources, contexts, and solids
+        context.solid_config
+
+
+

The ability to refer to info.context will go away fairly +(there is a legacy adapter class to enable backwards compatability +and we do not want it to be immortal). We also want to enforce +that the name of the first variable is context. We are only +allowing info temporarily.

+
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 65'] = ''' + + + + + + An actual DAG — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

An actual DAG

+

Next we will build a slightly more topologically complex DAG that demonstrates how dagster +determines the execution order of solids in a pipeline:

+../../../_images/actual_dag_figure_one.png +
+
actual_dag.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
from dagster import DependencyDefinition, InputDefinition, PipelineDefinition, lambda_solid
+
+
+@lambda_solid
+def solid_a():
+    return 1
+
+
+@lambda_solid(inputs=[InputDefinition('arg_a')])
+def solid_b(arg_a):
+    return arg_a * 2
+
+
+@lambda_solid(inputs=[InputDefinition('arg_a')])
+def solid_c(arg_a):
+    return arg_a * 3
+
+
+@lambda_solid(inputs=[InputDefinition('arg_b'), InputDefinition('arg_c')])
+def solid_d(arg_b, arg_c):
+    return arg_b * arg_c
+
+
+def define_diamond_dag_pipeline():
+    return PipelineDefinition(
+        name='actual_dag_pipeline',
+        # The order of this list does not matter:
+        # dependencies determine execution order
+        solids=[solid_d, solid_c, solid_b, solid_a],
+        dependencies={
+            'solid_b': {'arg_a': DependencyDefinition('solid_a')},
+            'solid_c': {'arg_a': DependencyDefinition('solid_a')},
+            'solid_d': {
+                'arg_b': DependencyDefinition('solid_b'),
+                'arg_c': DependencyDefinition('solid_c'),
+            },
+        },
+    )
+
+
+
+

Again, it is worth noting how we are connecting inputs and outputs rather than just tasks. +Point your attention to the solid_d entry in the dependencies dictionary: we declare +dependencies on a per-input basis.

+

When you execute this example, you’ll see that solid_a executes first, then solid_b and +solid_c – in any order – and solid_d executes last, after solid_b and solid_c +have both executed.

+

In more sophisticated execution environments, solid_b and solid_c could execute not just +in any order, but at the same time, since their inputs don’t depend on each other’s outputs – +but both would still have to execute after solid_a (because they depend on its output to +satisfy their inputs) and before solid_d (because their outputs in turn are depended on by +the input of solid_d).

+

Try it in dagit or from the command line:

+
$ dagster pipeline execute -f actual_dag.py -n define_diamond_dag_pipeline
+
+
+

What’s the output of this DAG?

+

We’ve seen how to wire solids together into DAGs. Now let’s look more deeply at their +Inputs, and start to explore how solids can interact with their external +environment.

+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 66'] = ''' + + + + + + Configuration — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Configuration

+

For maximum flexibility, testability, and reusability, we want to avoid hardcoding solids’ +(or pipelines’) dependencies on the external world.

+

We should be able to run the same code in different environments for test, in development, and in +production, and to parametrize our solids’ interactions with the different facilities afforded by +each of those environments.

+

Then, we can declaratively specify features of our environment without having to rewrite our code.

+

Conceptually, where inputs are inputs to the computation done by a single solid, and might be +linked by a dependency definition to outputs of a previous computation in a DAG, +configuration should be used to specify how a computation executes.

+

We’ll illustrate this by configuring our hello world example to speak a couple of different +languages.

+

This time, we’ll use a more fully-featured API to define our solid – +@solid instead of @lambda_solid.

+
+
config.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
# encoding: utf-8
+# py27 compat
+
+from dagster import Field, PipelineDefinition, execute_pipeline, solid, types
+
+
+@solid(config_field=Field(types.String, is_optional=True, default_value='en-us'))
+def configurable_hello(context):
+    if len(context.solid_config) >= 3 and context.solid_config[:3] == 'haw':
+        return 'Aloha honua!'
+    elif len(context.solid_config) >= 2 and context.solid_config[:2] == 'cn':
+        return '你好, 世界!'
+    else:
+        return 'Hello, world!'
+
+
+def define_configurable_hello_pipeline():
+    return PipelineDefinition(name='configurable_hello_pipeline', solids=[configurable_hello])
+
+
+def test_intro_tutorial_part_four():
+    execute_pipeline(
+        define_configurable_hello_pipeline(), {'solids': {'configurable_hello': {'config': 'cn'}}}
+    )
+
+
+
+

We will be exploring the @solid API in much more detail as this tutorial +proceeds. For now, the salient differences are:

+
    +
  1. The @solid API takes an additional parameter, config_field, which +defines the structure and type of configuration values that can be set on each execution of the +solid. This parameter should be a Field, which tells the dagster +machinery how to translate config values into runtime values available to the solid.

  2. +
  3. The function annotated by the @solid API receives an additional first +parameter, context, of type TransformExecutionContext. +The configuration passed into each solid is available to the annotated function as context.solid_config.

  4. +
+

Configuration values are passed in a dict as the second argument to +execute_pipeline. This dict specifies all of the +configuration to execute an entire pipeline. It may have many sections, but we’re only +using one of them here: per-solid configuration specified under the key solids.

+
execute_pipeline(
+    define_configurable_hello_pipeline(), {'solids': {'configurable_hello': {'config': 'cn'}}}
+)
+
+
+

The solids dict is keyed by solid name, and each of its values in turn defines a config +key corresponding to the user-defined configuration schema for each particular solid (which we set +before using the config_field parameter). If these values don’t match the user-defined schema, +we’ll get a helpful error message.

+

In this case, we’ve defined a single scalar string value as config.

+

Let’s see how to run this pipeline, with config, from the command line. In order to do this you +must provide config in the form of a yaml file:

+
+
config_env.yml
+
1
+2
+3
solids:
+  configurable_hello:
+    config: "haw"
+
+
+
+

Now you can run this pipeline with this config file like so:

+
$ dagster pipeline execute -f config.py \\
+-n define_configurable_hello_pipeline -e config_env.yml
+
+
+

To run this example from dagit, use the following command:

+
$ dagit -f config.py -n define_configurable_hello_pipeline
+
+
+

Just as with configurable inputs, you can edit the configuration on the fly in dagit’s built-in +config editor. Try switching languages and rerunning the pipeline!

+../../../_images/config_figure_one.png +

Next, we’ll learn about configuration schemas and how the type system can help with the management +of config: Configuration Schemas.

+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 67'] = ''' + + + + + + Configuration Schemas — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Configuration Schemas

+

Dagster includes a system for strongly-typed, self-describing configurations schemas. These +descriptions are very helpful when learning how to operate a pipeline, make a rich configuration +editing experience possible, and help to catch configuration errors before pipeline execution.

+

Let’s see how the configuration schema can prevent errors and improve pipeline documentation. +We’ll replace the config field in our solid definition with a structured, strongly typed schema.

+
+
configuration_schemas.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
from collections import defaultdict
+
+from dagster import (
+    Any,
+    DependencyDefinition,
+    Dict,
+    Field,
+    InputDefinition,
+    Int,
+    PipelineDefinition,
+    RepositoryDefinition,
+    String,
+    lambda_solid,
+    solid,
+)
+
+
+@solid(inputs=[InputDefinition('word', String)], config_field=Field(Any))
+def multiply_the_word(context, word):
+    return word * context.solid_config['factor']
+
+
+@lambda_solid(inputs=[InputDefinition('word')])
+def count_letters(word):
+    counts = defaultdict(int)
+    for letter in word:
+        counts[letter] += 1
+    return dict(counts)
+
+
+@solid(inputs=[InputDefinition('word', String)], config_field=Field(Dict({'factor': Field(Int)})))
+def typed_multiply_the_word(context, word):
+    return word * context.solid_config['factor']
+
+
+@solid(
+    inputs=[InputDefinition('word', String)], config_field=Field(Dict({'factor': Field(String)}))
+)
+def typed_multiply_the_word_error(context, word):
+    return word * context.solid_config['factor']
+
+
+def define_demo_configuration_schema_pipeline():
+    return PipelineDefinition(
+        name='demo_configuration_schema',
+        solids=[multiply_the_word, count_letters],
+        dependencies={'count_letters': {'word': DependencyDefinition('multiply_the_word')}},
+    )
+
+
+def define_typed_demo_configuration_schema_pipeline():
+    return PipelineDefinition(
+        name='typed_demo_configuration_schema',
+        solids=[typed_multiply_the_word, count_letters],
+        dependencies={'count_letters': {'word': DependencyDefinition('typed_multiply_the_word')}},
+    )
+
+
+def define_typed_demo_configuration_schema_error_pipeline():
+    return PipelineDefinition(
+        name='typed_demo_configuration_schema_error',
+        solids=[typed_multiply_the_word_error, count_letters],
+        dependencies={
+            'count_letters': {'word': DependencyDefinition('typed_multiply_the_word_error')}
+        },
+    )
+
+
+def define_demo_configuration_schema_repo():
+    return RepositoryDefinition(
+        name='demo_configuration_schema_repo',
+        pipeline_dict={
+            'demo_configuration_schema': define_demo_configuration_schema_pipeline,
+            'typed_demo_configuration_schema': define_typed_demo_configuration_schema_pipeline,
+            'typed_demo_configuration_schema_error': define_typed_demo_configuration_schema_error_pipeline,
+        },
+    )
+
+
+
+

The configuration YAML file works as before:

+
+
configuration_schemas.yml
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
context:
+  default:
+    config:
+      log_level: DEBUG
+
+solids:
+  multiply_the_word:
+    inputs:
+      word:
+        value: quux
+    config:
+      factor: 2
+
+
+
+

Now let’s imagine we made a mistake and passed a string in our configuration:

+
+
configuration_schemas_runtime_error.yml
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
context:
+  default:
+    config:
+      log_level: DEBUG
+
+solids:
+  multiply_the_word:
+    inputs:
+      word:
+        value: "kj"
+    config:
+      factor: "not_a_num"
+
+
+
+

And then ran it:

+
$ dagster pipeline execute -f configuration_schemas.py \\
+-n define_demo_configuration_schema_repo \\
+demo_configuration_schema \\
+-e configuration_schemas_runtime_error.yml
+...
+Traceback (most recent call last):
+...
+File "configuration_schemas.py", line 20, in multiply_the_word
+    return word * context.solid_config['factor']
+TypeError: can't multiply sequence by non-int of type 'str'
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+...
+dagster.core.errors.DagsterExecutionStepExecutionError: Error occured during the execution of step:
+    step key: "multiply_the_word.transform"
+    solid instance: "multiply_the_word"
+    solid definition: "multiply_the_word"
+
+
+

This pipeline is not typechecked and therefore error is caught at runtime. It would be preferable +to catch this before execution.

+

In order to do that, let us use the typed config solid.

+
+
configuration_schemas_runtime_error.yml
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
context:
+  default:
+    config:
+      log_level: DEBUG
+
+solids:
+  typed_multiply_the_word:
+    inputs:
+      word:
+        value: kdjfkd
+    config:
+      factor: "not_a_number"
+
+
+
+

And then run the pipeline

+
$ dagster pipeline execute -f configuration_schemas.py \\
+-n define_demo_configuration_schema_repo \\
+typed_demo_configuration_schema \\
+-e configuration_schemas_type_mismatch_error.yml
+
+
+

And you’ll get a nice error prior to execution:

+
dagster.core.execution.PipelineConfigEvaluationError: Pipeline "typed_demo_configuration_schema" config errors:
+Error 1: Type failure at path "root:solids:typed_multiply_the_word:config:factor" on type "Int". Value at path root:solids:typed_multiply_the_word:config:factor is not valid. Expected "Int".
+
+
+

Now, instead of a runtime failure which might arise deep inside a time-consuming or expensive +pipeline execution, and which might be tedious to trace back to its root cause, we get a clear, +actionable error message before the pipeline is ever executed.

+

Let’s see what happens if we pass config with the wrong structure:

+
+
configuration_schemas_wrong_field.yml
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
context:
+  default:
+    config:
+      log_level: DEBUG
+
+solids:
+  multiply_the_word_with_typed_config:
+    config:
+      wrong_factor: 1
+    inputs:
+      word:
+        value: "bkjdf"
+
+
+
+

And then run the pipeline:

+
$ dagster pipeline execute -f configuration_schemas.py \\
+-n define_demo_configuration_schema_pipeline -e configuration_schemas_wrong_field.yml
+...
+dagster.core.execution.PipelineConfigEvaluationError: Pipeline "demo_configuration_schema" config errors:
+Error 1: Undefined field "multiply_the_word_with_typed_config" at path root:solids
+Error 2: Missing required field "multiply_the_word" at path root:solids Expected: "{ count_letters?: DemoConfigurationSchema.SolidConfig.CountLetters multiply_the_word: DemoConfigurationSchema.SolidConfig.MultiplyTheWord }"
+
+
+

Next, we’ll see how to use the Execution Context to further configure +how pipeline execution interacts with its environment.

+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 68'] = ''' + + + + + + Dagstermill — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Dagstermill

+

A wonderful feature of using Dagster is that you can productionize Jupyter notebooks and involve them in a (production) pipeline as units of computation.

+

There are a few stages of data scientists using notebooks in the wild.

+
    +
  1. Unstructured scratch work, cells are often run out of order.

  2. +
  3. More refined prototyping, where cells are run sequentially. Usually the top cells contain parameters that are used in later cells.

  4. +
  5. Pieces of re-usable code are extracted from a notebook, turned into functions and put in a script (.py file)

  6. +
+

Typically, only stage 3 would be involved in a production pipeline. However, with dagstermill, if you have a notebook in stage 2 (i.e. cells run sequentially to produce the desired output), with minimal effort you can register this notebook as a solid in the pipeline and use the notebook driven solid as a unit of computation that takes in inputs and produces outputs (that can be consumed by later stages of the pipeline).

+
+

A (Very Simple) Pipeline with a Notebook

+

Say you have a pipeline as shown below:

+../../../_images/test_add_pipeline.png +

This is a very simple pipeline, where the solid return_one returns 1 and return_two returns 2. The notebook driven solid add_two_numbers simply adds two numbers and returns the result, as the name suggests.

+

The notebook might have a cell that looks like the following:

+
a = 3
+b = 5
+result = 3 + 5
+
+
+

Currently your notebook simply adds together the numbers 3 and 5, but in a more generic sense, your notebook is effectively a function that takes in inputs a and b and products output result. To use the language of the dagster abstraction, it is a solid with inputs a, b of dagster-type Int and with an ouput result of type Int.

+

To register this notebook as a dagster solid, we use the following lines of code.

+
from dagster import InputDefinition, OutputDefinition, Int
+import dagstermill as dm
+
+my_notebook_solid = dm.define_dagstermill_solid(
+                            name='add_two_numbers',
+                            notebook_path='/notebook/path/add_two_numbers.ipynb',
+                            inputs = [
+                                InputDefinition(name='a', dagster_type=Int),
+                                InputDefinition(name='b', dagster_type=Int)
+                            ],
+                            ouputs = [OutputDefinition(Int)]
+                        )
+
+
+

The function dm.define_dagstermill_solid() returns an object of type SolidDefinition that can be passed into PipelineDefinition objects. We see that its arguments are rather self-explanatory:

+
    +
  • name: the name of the solid

  • +
  • notebook_path: the location of the notebook so that the dagster execution engine can run the code in the notebook

  • +
  • inputs, outputs: the named and typed inputs and outputs of the notebook as a solid

  • +
+

However, we also have to add some boilerplate to the notebook itself to make sure it plays nice with the dagstermill framework. The final notebook with the boilerplate looks as follows.

+../../../_images/add_two_numbers.png +
    +
  1. import dagstermill as dm imports the dagstermill library, which is necesary for the rest of the boilerplate

  2. +
  3. dm.register_repository() takes a repository definition (define_example_repository() in this case) and lets the notebook know how to find the repository that contains the corresponding notebook-driven solid.

  4. +
  5. There is a tagged cell with the tag parameters that should contain only the inputs of the notebook-driven solid.

  6. +
  7. If the notebook-driven solid has an output, then call dm.yield_result() with the result.

  8. +
+

There is a helpful Dagstermill CLI that you can use to generate notebooks that will automatically contain the requisite boilerplate.

+
+
+

Output Notebooks & How Dagstermill Works

+

The way dagstermill works is by auto-injecting a cell that replaces the parameters-tagged cell with the +runtime values of the inputs and then running the notebook using the papermill library. +A nice side effect of using the papermill library to run the notebook is that the output is contained in an “output notebook”, +and the source notebook remains unchanged. Since the output notebook is itself a valid Jupyter notebook, debugging can be done within the notebook environment!

+

The execution log contains the path to the output notebook so that you can access it after execution to examine and potentially debug the output. Within dagit we also provide a link to the output notebook, as shown below.

+../../../_images/output_notebook.png +
+
+

Summary of Using Dagstermill

+

Initially, you might want to prototype with a notebook without worrying about incorporating it into a dagster pipeline. When you want to incorporate it into a pipeline, do the following steps:

+
    +
  1. Use dm.define_dagstermill_solid() to define the notebook-driven solid to include within a pipeline

  2. +
  3. Within the notebook, call import dagstermill as dm and make sure that you register the containing repository with dm.register_repository()

  4. +
  5. Make sure all inputs to the notebook-driven solid are contained in a tagged-cell with the parameters tag

  6. +
  7. For all outputs, call dm.yield_result() with the result and output name

  8. +
+

The Dagstermill CLI should help you with stage 2.

+
+
+

A (More Complicated) Dagstermill Pipeline

+

The above pipeline was a very simplistic use-case of a dagster pipeline involving notebook-driven solids. +Below we provide a more complicated example of a pipeline involving notebooks with outputs that are fed in as inputs into further steps in the pipeline. +This is a particular compelling use-case of incorporating notebook-driven solids into a pipeline, as the user no longer has to manually marshall the inputs and outputs of notebooks manually. +Instead, the dagster execution engine takes care of this for us! Let us look at the following machine-learning inspired pipeline.

+../../../_images/ML_pipeline.png +

The corresponding dagster code for defining the pipeline is as follows:

+
def define_tutorial_pipeline():
+    return PipelineDefinition(
+        name='ML_pipeline',
+        solids=[clean_data_solid, LR_solid, RF_solid],
+        dependencies={
+            SolidInstance('clean_data'): {},
+            SolidInstance('linear_regression'): {'df': DependencyDefinition('clean_data')},
+            SolidInstance('random_forest_regression'): {'df': DependencyDefinition('clean_data')},
+        },
+    )
+
+
+

The clean_data_solid solid is driven by the following notebook:

+../../../_images/clean_data_ipynb.png +

We see that this notebook loads some data, filters it and yields it as a dataframe. +Then, this dataframe is consumed by the solids linear_regression and random_forest_regression, which both consume inputs df that is flowed from the output of clean_data_solid.

+

The random_forest_regression solid is driven by the following notebook:

+../../../_images/RF_ipynb.png +

Without the dagstermill abstraction, we’d have to manually save the output of the clean_data notebook to a location and make sure to load the same location in the 2 other notebooks. +However, the dagster execution engine takes care of this marshalling for us, +so notice that the random_forest_regression notebook is simply using df as a parameter +that will be over-written with its correct runtime value from the result of clean_data.

+

After running the pipeline, we can examine the random_forest_regression output notebook, which looks as follows:

+../../../_images/RF_output_notebook.png +

The output notebook is quite convenient, because we can debug within the notebook environment as well as view plots and other output within the notebook context. +We can also look at the input that was flowed into the notebook (i.e. the filtered output of clean_data).

+
+
+

Full Dagstermill API

+

The boilerplate necesary for a notebook involves some of the dagstermill API, but here we describe some more advanced API functionality.

+
notebook_driven_solid = dm.define_dagstermill_solid(
+    name,
+    notebook_path,
+    inputs=None,
+    outputs=None,
+    config_field=None
+)
+
+assert(isinstance(notebook_driven_solid, SolidDefinition))
+
+
+

This function creates a notebook-driven solid by taking in a solid name, notebook location and typed inputs and outputs, and returns a SolidDefinition that can be used in a dagster Pipeline.

+

Parameters:

+
    +
  • name (str) – Name of solid in pipeline

  • +
  • notebook_path (str) – File path of notebook that drives the solid

  • +
  • inputs (list[InputDefinition])

  • +
  • outputs (list[OutputDefinition])

  • +
  • config_field (generic) – Config for the solid

  • +
+
dm.register_repository(repository_defn)
+
+
+

To use a notebook as a solid in a pipeline, the first cell of the notebook must register the repository to which the notebook driven solid belongs.

+

Parameters

+
    +
  • repository_defn (RepositoryDefinition) – RepositoryDefinition object to which solid belongs

  • +
+
dm.yield_result(result_obj, output_name="result")
+
+
+

If the notebook driven solid has outputs (as defined when using define_dagstermill_solid), then call yield_result with the output and the output name (defaults to result) to produce output for consumption for solids in later stages of the pipeline.

+

Parameters

+
    +
  • result_obj (generic) – The result of the computation, must be of the type specified in the corresponding OutputDefinition

  • +
  • output_name (str) – Defaults to “result”, but must match the name given in the OutputDefinition (which defaults to "result" if there is only 1 output)

  • +
+
context = dm.get_context(config=None)
+assert (isinstance(context, AbstractTransformExecutionContext))
+context.log.info("This will log some info to the logger")
+
+
+

If you want access to the context object that is available in other solids, then you can call get_context() with the desired config within the notebook to access the context object and manipulate it as you would in any other solid. When the notebook is run as a solid in a pipeline, the context will be injected at runtime with the configuration provided for the entire pipeline.

+

Parameters

+
    +
  • config (dict) – The config for the context (think dict version of yaml typically passed into config)

  • +
+
+
+
+

Dagstermill CLI

+

To assist you in productionizing notebooks, the dagstermill CLI will be helpful in adding boilerplate to existing notebooks to turn them into dagster solids (or creating notebooks from scratch with the requisite boilerplate).

+

To create a notebook when you know the repository, use the dagstermill create-notebook command. The notebook name is provided with the --notebook argument. A repository can be provided using the .yml file or the other command line options for specifying the location of a repository definition. If the repository is not provided, then the scaffolding dm.register_repository() is not inserted.

+
$ dagstermill create-notebook --notebook "notebook_name" -y repository.yml
+
+
+

Normally, the create-notebook command will prompt to ask if you want to over-write an existing notebook with the same name (if such a notebook exists). The --force-overwrite flag forces the over-write.

+
$ dagstermill create-notebook --help
+
+Usage: dagstermill create-notebook [OPTIONS]
+
+Creates new dagstermill notebook.
+
+Options:
+-n, --fn-name TEXT          Function that returns either repository or
+                            pipeline
+-m, --module-name TEXT      Specify module where repository or pipeline
+                            function lives
+-f, --python-file TEXT      Specify python file where repository or pipeline
+                            function lives.
+-y, --repository-yaml TEXT  Path to config file. Defaults to
+                            ./repository.yml. if --python-file and --module-
+                            name are not specified
+-note, --notebook TEXT      Name of notebook
+--force-overwrite           Will force overwrite any existing notebook or
+                            file with the same name.
+--help                      Show this message and exit.
+
+
+

TODO: Currently we don’t auto-inject the parameters cell if it doesn’t exist, but we can change the CLI to do this.

+

Given a notebook that does not have the requisite scaffolding (perhaps a notebook created before knowing exact what dagster repository it belongs in), use the register-notebook command to specify an existing notebook and repository, and the CLI will inject the requiste cells in the notebook with the boilerplate for registering the repository and adding the parameters-tagged cell, if one doesn’t exist. Note that this CLI command operates in-place, so the original notebook is modified!

+
$ dagstermill register-notebook --notebook path/to/notebook -y repository.yaml
+
+
+

Example CLI usage

+
$ dagstermill create-notebook --notebook test_notebook
+
+
+

Gives the following notebook–notice how there is no call to register_repository within the notebook.

+../../../_images/pre_boilerplate_notebook.png +

After a while, say you finally have a repository file (repository.yml). Then you register the notebook, giving the following:

+
$ ls
+test_notebook.ipynb repository.yml
+$ dagstermill register-notebook --notebook test_notebook.ipynb -y repository.yml
+
+
+../../../_images/post_boilerplate_notebook.png +
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 69'] = ''' + + + + + + Execution Context — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Execution Context

+

One of the most important objects in the system is the execution context. The execution +context, the logger, and the resources are threaded throughout the entire computation ( +via the context object passed to user code) and contains handles to logging facilities +and external resources. Interactions with logging systems, databases, and external +clusters (e.g. a Spark cluster) should be managed through these properties of the execution +context.

+

This provides a powerful layer of indirection that allows a solid to abstract +away its surrounding environment. Using an execution context allows the system and +pipeline infrastructure to provide different implementations for different +environments, giving the engineer the opportunity to design pipelines that +can be executed on your local machine or your CI/CD pipeline as readily as +your production cluster environment.

+
+

Logging

+

One of the most basic pipeline-level facilities is logging:

+
+
execution_context.py
+
from dagster import PipelineDefinition, execute_pipeline, solid
+
+
+@solid
+def debug_message(context):
+    context.log.debug('A debug message.')
+    return 'foo'
+
+
+@solid
+def error_message(context):
+    context.log.error('An error occurred.')
+
+
+def define_execution_context_pipeline_step_one():
+    return PipelineDefinition(solids=[debug_message, error_message])
+
+
+
+

Run this example pipeline in dagit:

+
$ dagster pipeline execute -m dagster.tutorials.intro_tutorial.tutorial_repository -n define_repository execution_context_pipeline
+
+
+

And you’ll notice log messages like this:

+
2019-04-05 16:54:31 - dagster - ERROR -
+        orig_message = "An error occurred."
+      log_message_id = "d567e965-31a1-4b99-8b6c-f2f7cfccfcca"
+       log_timestamp = "2019-04-05T23:54:31.678344"
+              run_id = "28188449-51bc-4c75-8b70-38cccb8e82e7"
+            pipeline = "execution_context_pipeline"
+            step_key = "error_message.transform"
+               solid = "error_message"
+    solid_definition = "error_message"
+
+
+

These log messages are annonated with a bunch of key value pairs that indicate where in the +computation each log message was emitted. This happened because we logged through the execution +context.

+

Notice that even though the user only logged the message “An error occurred”, by routing logging +through the context we are able to provide richer error information – including the name of the +solid and a timestamp – in a semi-structured format.

+

You’ll notice that \'A debug message.\' does not appear in the execution logs. This +is because the default log level is INFO, so debug-level messages will not appear.

+

Let’s change that by specifying some config.

+
+
execution_context.yml
+
1
+2
+3
+4
context:
+  default:
+    config:
+      log_level: DEBUG
+
+
+
+

Save it as execution_context.yml and then run:

+
$ dagster pipeline execute  \\
+-m dagster.tutorials.intro_tutorial.tutorial_repository \\
+-n define_repository execution_context_pipeline \\
+-e execution_context.yml
+
+
+

You’ll see now that debug messages print out to the console.

+

Although logging is a universally useful case for the execution context, this example only touches +on the capabilities of the context. Any pipeline-level facilities that pipeline authors might want +to make configurable for different environments – for instance, access to file systems, databases, +or compute substrates – can be configured using the context.

+

We’ll see how to use some of these other capabilities in the next section: +Resources.

+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 70'] = ''' + + + + + + Expectations — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Expectations

+

Dagster has a first-class concept to capture data quality tests. We call these +data quality tests expectations.

+

Data pipelines have the property that they typically do not control +what data they ingest. Unlike a traditional application where you can +prevent users from entering malformed data, data pipelines do not have +that option. When unexpected data enters a pipeline and causes a software +error, typically the only recourse is to update your code.

+

Lying within the code of data pipelines are a whole host of implicit +assumptions about the nature of the data. One way to frame the goal of +expectations is to say that they make those implict assumption explicit. +And by making these a first class concept they can be described with metadata, +inspected, and configured to run in different ways.

+

You’ll note the new concept of expecatations.

+
+
expectations.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
from dagster import (
+    ExpectationDefinition,
+    ExpectationResult,
+    InputDefinition,
+    Int,
+    OutputDefinition,
+    PipelineDefinition,
+    lambda_solid,
+)
+
+
+@lambda_solid(
+    inputs=[
+        InputDefinition(
+            'num_one',
+            Int,
+            expectations=[
+                ExpectationDefinition(
+                    name='check_positive',
+                    expectation_fn=lambda _info, value: ExpectationResult(success=value > 0),
+                )
+            ],
+        ),
+        InputDefinition('num_two', Int),
+    ],
+    output=OutputDefinition(Int),
+)
+def add_ints(num_one, num_two):
+    return num_one + num_two
+
+
+def define_expectations_tutorial_pipeline():
+    return PipelineDefinition(name='expectations_tutorial_pipeline', solids=[add_ints])
+
+
+
+

At its core, an expectation is a function applied to either an input or an output. +Generally anywhere there is a type, you can apply an expectation. This function +can be as sophisticated as the user wants, anywhere from a simple null check to +checking thresholds of distrbutions or querying lookup tables.

+

If you run this pipeline, you’ll notice some logging that indicates that the expectation +was processed

+

We’ll use this config file.

+
+
expectations_pass.yml
+
1
+2
+3
+4
+5
+6
+7
+8
solids:
+  add_ints:
+    inputs:
+      num_one:
+        value: 2
+      num_two:
+        value: 3
+
+
+
+
+

And then run:

+
$ dagster pipeline execute -f expectations.py \\
+-n define_expectations_tutorial_pipeline -e \\
+expectations_pass.yml
+
+
+

In that execution you’ll notice a passing expectation:

+
2019-01-15 13:04:17 - dagster - INFO - orig_message="Execution of add_ints.output.num_one.expectation.check_positive succeeded in 0.06198883056640625" log_message_id="e903e121-e529-42ff-9561-b17dea553fba" run_id="71affcec-1c10-4a8b-9416-10115a01783f" pipeline="expectations_tutorial_pipeline" solid="add_ints" solid_definition="add_ints" event_type="EXECUTION_PLAN_STEP_SUCCESS" millis=0.06198883056640625 step_key="add_ints.output.num_one.expectation.check_positive"
+
+
+

Now let’s make this fail. Currently the default behavior is to throw an error and halt execution +when an expectation fails. So:

+
+
expectations_fail.yml
+
1
+2
+3
+4
+5
+6
+7
+8
solids:
+  add_ints:
+    inputs:
+      num_one:
+        value: -2
+      num_two:
+        value: 3
+
+
+
+
+

And then:

+
$ dagster pipeline execute -f expectations.py \\
+-n define_expectations_tutorial_pipeline \\
+-e expectations_fail.yml
+
+dagster.core.errors.DagsterExpectationFailedError:
+DagsterExpectationFailedError(solid=add_ints,
+output=num_one, expectation=check_positive
+value=-2)
+
+
+

Because the system is explictly aware of these expectations they are viewable in dagit. +It can also configure the execution of these expectations. The capabilities of this part of the +system are currently quite immature, but we expect to develop these more in the future. The only +feature right now is the ability to skip expectations entirely. This is useful in a case where +expectations are expensive and you have a time-critical job you must execute. In that case you can +configure the pipeline to skip expectations entirely:

+
+
expectations_skip_fail.yml
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
solids:
+  add_ints:
+    inputs:
+      num_one:
+        value: -2
+      num_two:
+        value: 3
+
+expectations:
+  evaluate: False
+
+
+
+
$ dagster pipeline execute -f expectations.py \\
+-n define_expectations_tutorial_pipeline \\
+-e expectations_skip_failed.yml
+
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 71'] = ''' + + + + + + Hello, DAG — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Hello, DAG

+

One of the core capabitilies of dagster is the ability to express data pipelines as arbitrary +directed acyclic graphs (DAGs) of solids.

+

We’ll define a very simple two-solid pipeline whose first solid returns a hardcoded string, +and whose second solid concatenates two copies of its input. The output of the pipeline should be +two concatenated copies of the hardcoded string.

+
+
hello_dag.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
from dagster import DependencyDefinition, InputDefinition, PipelineDefinition, lambda_solid
+
+
+@lambda_solid
+def solid_one():
+    return 'foo'
+
+
+@lambda_solid(inputs=[InputDefinition('arg_one')])
+def solid_two(arg_one):
+    return arg_one * 2
+
+
+def define_hello_dag_pipeline():
+    return PipelineDefinition(
+        name='hello_dag_pipeline',
+        solids=[solid_one, solid_two],
+        dependencies={'solid_two': {'arg_one': DependencyDefinition('solid_one')}},
+    )
+
+
+
+

This pipeline introduces a few new concepts.

+
    +
  1. Solids can have inputs defined by instances of +InputDefinition. Inputs allow us to connect solids to +each other, and give dagster information about solids’ dependencies on each other (and, as +we’ll see later, optionally let dagster check the types of the inputs at runtime).

  2. +
  3. Solids’ dependencies on each other are expressed by instances of +DependencyDefinition. +You’ll notice the new argument to PipelineDefinition +called dependencies, which is a dict that defines the connections between solids in a +pipeline’s DAG.

    +
    dependencies={'solid_two': {'arg_one': DependencyDefinition('solid_one')}},
    +
    +
    +

    The first layer of keys in this dict are the names of solids in the pipeline. The second layer +of keys are the names of the inputs to each solid. Each input in the DAG must be provided a +DependencyDefinition. (Don’t worry – if you forget +to specify an input, a helpful error message will tell you what you missed.)

    +

    In this case the dictionary encodes the fact that the input arg_one of solid solid_two +should flow from the output of solid_one.

    +
  4. +
+

Let’s visualize the DAG we’ve just defined in dagit.

+
$ dagit -f hello_dag.py -n define_hello_dag_pipeline
+
+
+

Navigate to http://127.0.0.1:3000/hello_dag_pipeline/explore or choose the hello_dag_pipeline +from the dropdown:

+../../../_images/hello_dag_figure_one.png +

One of the distinguishing features of dagster that separates it from many workflow engines is that +dependencies connect inputs and outputs rather than just tasks. An author of a dagster +pipeline defines the flow of execution by defining the flow of data within that +execution. This is core to the programming model of dagster, where each step in the pipeline +– the solid – is a functional unit of computation.

+

Now run the pipeline we’ve just defined, either from dagit or from the command line:

+
$ dagster pipeline execute -f hello_dag.py -n define_hello_dag_pipeline
+
+
+

In the next section, An actual DAG, we’ll build our first DAG with interesting +topology and see how dagster determines the execution order of a pipeline.

+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 72'] = ''' + + + + + + Hello, World — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Hello, World

+

See Install for instructions installing dagster (the core library) and dagit (the +web UI tool used to visualize your data pipelines) on your platform of choice.

+

Let’s write our first pipeline and save it as hello_world.py.

+
+
hello_world.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
from dagster import PipelineDefinition, execute_pipeline, lambda_solid
+
+
+@lambda_solid
+def hello_world():
+    return 'hello'
+
+
+def define_hello_world_pipeline():
+    return PipelineDefinition(name='hello_world_pipeline', solids=[hello_world])
+
+
+
+

This example introduces three concepts:

+
    +
  1. A solid is a functional unit of computation in a data pipeline. In this example, we use the +decorator @lambda_solid to mark the function hello_world +as a solid: a functional unit which takes no inputs and returns the output \'hello\' every +time it’s run.

  2. +
  3. A pipeline is a set of solids arranged into a DAG of computation that produces data assets. +In this example, the call to PipelineDefinition defines +a pipeline with a single solid.

  4. +
  5. We execute the pipeline by running execute_pipeline. +Dagster will call into each solid in the pipeline, functionally transforming its inputs, if any, +and threading its outputs to solids further on in the DAG.

  6. +
+
+

Pipeline Execution

+

Assuming you’ve saved this pipeline as hello_world.py, we can execute it via any of three +different mechanisms:

+
    +
  1. The CLI utility dagster

  2. +
  3. The GUI tool dagit

  4. +
  5. Using dagster as a library within your own script.

  6. +
+
+

CLI

+
$ dagster pipeline execute -f hello_world.py -n define_hello_world_pipeline
+2019-01-08 11:23:57 - dagster - INFO - orig_message="Beginning execution of pipeline hello_world_pipeline" log_message_id="5c829421-06c7-49eb-9195-7e828e37eab8" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" event_type="PIPELINE_START"
+2019-01-08 11:23:57 - dagster - INFO - orig_message="Beginning execution of hello_world.transform" log_message_id="5878513a-b510-4837-88cb-f77205931abb" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" solid="hello_world" solid_definition="hello_world" event_type="EXECUTION_PLAN_STEP_START" step_key="hello_world.transform"
+2019-01-08 11:23:57 - dagster - INFO - orig_message="Solid hello_world emitted output \\"result\\" value 'hello'" log_message_id="b27fb70a-744a-46cc-81ba-677247b1b07b" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" solid="hello_world" solid_definition="hello_world"
+2019-01-08 11:23:57 - dagster - INFO - orig_message="Execution of hello_world.transform succeeded in 0.9558200836181641" log_message_id="25faadf5-b5a8-4251-b85c-dea6d00d99f0" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" solid="hello_world" solid_definition="hello_world" event_type="EXECUTION_PLAN_STEP_SUCCESS" millis=0.9558200836181641 step_key="hello_world.transform"
+2019-01-08 11:23:57 - dagster - INFO - orig_message="Step hello_world.transform emitted 'hello' for output result" log_message_id="604dc47c-fe29-4d71-a531-97ae58fda0f4" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline"
+2019-01-08 11:23:57 - dagster - INFO - orig_message="Completing successful execution of pipeline hello_world_pipeline" log_message_id="1563854b-758f-4ae2-8399-cb75946b0055" run_id="dfc8165a-f37e-43f5-a801-b602e4409f74" pipeline="hello_world_pipeline" event_type="PIPELINE_SUCCESS"
+
+
+

There’s a lot of information in these log lines (we’ll get to how you can use, and customize, +them later), but you can see that the third message is: +Solid hello_world emitted output \\"result\\" value \'hello\'. Success!

+
+
+

Dagit

+

To visualize your pipeline (which only has one node) in dagit, you can run:

+
$ dagit -f hello_world.py -n define_hello_world_pipeline
+Serving on http://127.0.0.1:3000
+
+
+

You should be able to navigate to http://127.0.0.1:3000/hello_world_pipeline/explore in your web +browser and view your pipeline.

+../../../_images/hello_world_figure_one.png +

There are lots of ways to execute dagster pipelines. If you navigate to the “Execute” +tab (http://127.0.0.1:3000/hello_world_pipeline/execute), you can execute your pipeline directly +from dagit by clicking the “Start Execution” button.

+../../../_images/hello_world_figure_two.png +

A new window will open, and you’ll see the pipeline execution commence with logs; here, you can +filter logs by level and search over the results

+../../../_images/hello_world_figure_three.png +
+
+

Library

+

If you’d rather execute your pipelines as a script, you can do that without using the dagster CLI +at all. Just add a few lines to hello_world.py (highlighted in yellow):

+
+
hello_world.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
from dagster import PipelineDefinition, execute_pipeline, lambda_solid
+
+
+@lambda_solid
+def hello_world():
+    return 'hello'
+
+
+def define_hello_world_pipeline():
+    return PipelineDefinition(name='hello_world_pipeline', solids=[hello_world])
+
+
+if __name__ == '__main__':
+    result = execute_pipeline(define_hello_world_pipeline())
+    assert result.success
+
+
+
+

Then you can just run:

+
$ python hello_world.py
+
+
+

Next, let’s build our first multi-solid DAG in Hello, DAG!

+
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 73'] = ''' + + + + + + Tutorial — Dagster + + + + + + + + + + + + + + + + + + + + + + + + + + + + +''' + +snapshots['test_build_all_docs 74'] = ''' + + + + + + Inputs — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Inputs

+

So far we have only demonstrated pipelines whose solids yield hardcoded values and then flow them +through the pipeline. In order to be useful a pipeline must also interact with its external +environment.

+

Let’s return to our hello world example. But this time, we’ll make the string +the solid returns be parameterized based on inputs.

+
+
inputs.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
from dagster import (
+    InputDefinition,
+    OutputDefinition,
+    PipelineDefinition,
+    execute_pipeline,
+    lambda_solid,
+    types,
+)
+
+
+@lambda_solid(inputs=[InputDefinition('word')])
+def add_hello_to_word(word):
+    return 'Hello, ' + word + '!'
+
+
+def define_hello_inputs_pipeline():
+    return PipelineDefinition(name='hello_inputs', solids=[add_hello_to_word])
+
+
+
+

Note that the input word to solid add_hello_to_word has no dependency specified. This +means that the operator of the pipeline must specify the input at pipeline execution +time.

+

Recall that there are three primary ways to execute a pipeline: using the python API, from +the command line, and from dagit. We’ll go through each of these and see how to specify the input +in each case.

+
+

Python API

+

In the Python API, pipeline configuration is specified in the second argument to +execute_pipeline, which must be a dict. This dict contains +all of the configuration to execute an entire pipeline. It may have many sections, but we’ll only +use one of them here: per-solid configuration specified under the key solids:

+
1
+2
+3
+4
+5
{
+    'solids': {
+        'add_hello_to_word': {'inputs': {'word': {'value': 'Mars'}}}
+    }
+},
+
+
+

The solids dict is keyed by solid name, and each solid is configured by a dict that may have +several sections of its own. In this case we are only interested in the inputs section, so +that we can specify that value of the input word.

+

The function execute_with_another_world demonstrates how one would invoke this pipeline +using the python API:

+
1
+2
+3
+4
+5
+6
+7
+8
+9
def execute_with_another_world():
+    return execute_pipeline(
+        define_hello_inputs_pipeline(),
+        {
+            'solids': {
+                'add_hello_to_word': {'inputs': {'word': {'value': 'Mars'}}}
+            }
+        },
+    )
+
+
+
+
+

CLI

+

Next let’s use the CLI. In order to do that we’ll need to provide the environment +information via a config file. We’ll use the same values as before, but in the form +of YAML rather than python dictionaries:

+
+
inputs_env.yml
+
1
+2
+3
+4
+5
solids:
+  add_hello_to_word:
+    inputs:
+      word:
+        value: "Mars"
+
+
+
+

And now specify that config file via the -e flag.

+
$ dagster pipeline execute -f inputs.py \\
+-n define_hello_inputs_pipeline -e inputs_env.yml
+
+
+
+
+

Dagit

+

As always, you can load the pipeline and execute it within dagit.

+
$ dagit -f inputs.py -n define_hello_inputs_pipeline
+Serving on http://127.0.0.1:3000
+
+
+

From the execute console, you can enter your config directly like so:

+../../../_images/inputs_figure_one.png +

You’ll notice that the config editor is auto-completing. Because it knows the structure +of the config, the editor can provide rich error information. We can improve the experience of +using the editor by appropriately typing the inputs, making everything less error-prone.

+
+

Typing

+

Right now the inputs and outputs of this solid are totally untyped. (Any input or output +without a type is automatically assigned the Any type.) This means that mistakes +are often not surfaced until the pipeline is executed.

+

For example, imagine if our environment for our pipeline was:

+
+
inputs_env_bad.yml
+
1
+2
+3
+4
+5
solids:
+  add_hello_to_word:
+    inputs:
+      word:
+        value: 2343
+
+
+
+

If we execute this pipeline with this config, it’ll fail at runtime.

+

Enter this config in dagit, hit execute, and you’ll see the execution fail:

+../../../_images/inputs_figure_two_untyped_execution.png +

Click on the red dot on the execution step that failed and a detailed stacktrace will pop up.

+../../../_images/inputs_figure_three_error_modal.png +

It would be better if we could catch this error earlier, when we specify the config. So let’s +make the inputs typed.

+

A user can apply types to inputs and outputs. In this case we just want to type them as the +built-in String.

+
+
inputs.py
+
@lambda_solid(inputs=[InputDefinition('word', types.String)], output=OutputDefinition(types.String))
+def add_hello_to_word_typed(word):
+    return 'Hello, ' + word + '!'
+
+
+def define_hello_typed_inputs_pipeline():
+
+
+
+

By using typed input instead we can catch this error prior to execution.

+../../../_images/inputs_figure_four_error_prechecked.png +

Next, we’ll look at a closely allied concept – Configuration values.

+
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 75'] = ''' + + + + + + Multiple Outputs — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Multiple Outputs

+

So far all of our examples have been solids that have a single output. But +solids can have an arbitrary number of outputs. Downstream solids can +depend on any number of these outputs. Additionally, these outputs do +not necessarily have to be fired, therefore unlocking the ability for +downstream solids to be invoked conditionally based on something that +happened during the computation.

+
+

MultipleResults Class

+

Here we present an example of a solid that has multiple outputs within a pipeline:

+
+
multiple_outputs.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
@solid(
+    outputs=[
+        OutputDefinition(dagster_type=Int, name='out_one'),
+        OutputDefinition(dagster_type=Int, name='out_two'),
+    ]
+)
+def return_dict_results(_context):
+    return MultipleResults.from_dict({'out_one': 23, 'out_two': 45})
+
+
+@solid(inputs=[InputDefinition('num', dagster_type=Int)])
+def log_num(context, num):
+    context.log.info('num {num}'.format(num=num))
+    return num
+
+
+@solid(inputs=[InputDefinition('num', dagster_type=Int)])
+def log_num_squared(context, num):
+    context.log.info('num_squared {num_squared}'.format(num_squared=num * num))
+    return num * num
+
+
+def define_multiple_outputs_step_one_pipeline():
+    return PipelineDefinition(
+        name='multiple_outputs_step_one_pipeline',
+        solids=[return_dict_results, log_num, log_num_squared],
+        dependencies={
+            'log_num': {'num': DependencyDefinition(solid='return_dict_results', output='out_one')},
+            'log_num_squared': {
+                'num': DependencyDefinition(solid='return_dict_results', output='out_two')
+            },
+        },
+    )
+
+
+
+

This can be visualized in dagit:

+../../../_images/multiple_results_figure_one.png +

Notice how return_dict_results has two outputs. For the first time +we have provided the name argument to an OutputDefinition. +(The name of an output defaults to \'result\', as it does for a +DependencyDefinition) Output names must be unique +and each result returned by a solid’s transform function must have a name that corresponds to +one of these outputs.

+

So from return_dict_results we used MultipleResults +to return all outputs from this transform.

+

Just as this tutorial gives us the first example of a named +OutputDefinition, this is also the first time that we’ve +seen a named DependencyDefinition. Recall that dependencies +point to a particular output of a solid, rather than to the solid itself.

+

With this we can run the pipeline (condensed here for brevity):

+
$ dagster pipeline execute -f multiple_outputs.py \\
+-n define_multiple_outputs_step_one_pipeline
+
+... log spew
+2019-04-05 22:23:37 - dagster - INFO -
+        orig_message = "Solid return_dict_results emitted output \\"out_one\\" value 23"
+        ...
+    solid_definition = "return_dict_results"
+...
+2019-04-05 22:23:37 - dagster - INFO -
+        orig_message = "Solid return_dict_results emitted output \\"out_two\\" value 45"
+        ...
+    solid_definition = "return_dict_results"
+... more log spew
+
+
+
+
+

Iterator of Result

+

The MultipleResults class is not the only way +to return multiple results from a solid transform function. You can also yield +multiple instances of the Result object. (Note: this is actually the core +specification of the transform function: all other forms are implemented in terms of +the iterator form.)

+
+
multiple_outputs.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
@solid(
+    outputs=[
+        OutputDefinition(dagster_type=Int, name='out_one'),
+        OutputDefinition(dagster_type=Int, name='out_two'),
+    ]
+)
+def yield_outputs(_context):
+    yield Result(23, 'out_one')
+    yield Result(45, 'out_two')
+
+
+
+
+
+
+

Conditional Outputs

+

Multiple outputs are the mechanism by which we implement branching or conditional execution. Let’s +modify the first solid above to conditionally emit one output or the other based on config +and then execute that pipeline.

+
+
multiple_outputs.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
@solid(
+    config_field=Field(String, description='Should be either out_one or out_two'),
+    outputs=[
+        OutputDefinition(dagster_type=Int, name='out_one', is_optional=True),
+        OutputDefinition(dagster_type=Int, name='out_two', is_optional=True),
+    ],
+)
+def conditional(context):
+    if context.solid_config == 'out_one':
+        yield Result(23, 'out_one')
+    elif context.solid_config == 'out_two':
+        yield Result(45, 'out_two')
+    else:
+        raise Exception('invalid config')
+
+
+def define_multiple_outputs_step_three_pipeline():
+    return PipelineDefinition(
+        name='multiple_outputs_step_three_pipeline',
+        solids=[conditional, log_num, log_num_squared],
+        dependencies={
+            'log_num': {'num': DependencyDefinition('conditional', 'out_one')},
+            'log_num_squared': {'num': DependencyDefinition('conditional', 'out_two')},
+        },
+    )
+
+
+
+

You must create a config file

+
+
conditional_outputs.yml
+
1
+2
+3
solids:
+  conditional:
+    config: out_two
+
+
+
+

And then run it.

+
$ dagster pipeline execute -f multiple_outputs.py \\
+-n define_multiple_outputs_step_three_pipeline \\
+-e conditional_outputs.yml
+
+... log spew
+2019-04-05 22:29:31 - dagster - INFO -
+        orig_message = "Solid conditional emitted output \\"out_two\\" value 45"
+        ...
+
+2019-04-05 22:29:31 - dagster - INFO -
+        orig_message = "Solid conditional did not fire outputs {'out_one'}"
+        ...
+... log spew
+
+
+

Note that we are configuring this solid to only emit out_two which will end up +only triggering log_num_squared. The solid log_num will never be executed.

+

Next, let’s look at writing Reusable Solids so we can avoid duplicating +common data pipeline work.

+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 76'] = ''' + + + + + + Pipeline CLI Execution — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Pipeline CLI Execution

+

Up until now we’ve been focusing on using the dagit tool for executing pipelines. However, we +also have a CLI utility for use in scripting contexts. It has its own features which are useful in +a production context.

+

Just as in the last part of the tutorial, we’ll define a pipeline and a repository, and create +a yaml file to tell the CLI tool about the repository.

+
+
pipeline_cli_execution.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
from collections import defaultdict
+
+from dagster import (
+    DependencyDefinition,
+    Dict,
+    Field,
+    InputDefinition,
+    Int,
+    PipelineDefinition,
+    RepositoryDefinition,
+    String,
+    lambda_solid,
+    solid,
+)
+
+
+@solid(inputs=[InputDefinition('word', String)], config_field=Field(Dict({'factor': Field(Int)})))
+def multiply_the_word(context, word):
+    return word * context.solid_config['factor']
+
+
+@lambda_solid(inputs=[InputDefinition('word')])
+def count_letters(word):
+    counts = defaultdict(int)
+    for letter in word:
+        counts[letter] += 1
+    return dict(counts)
+
+
+def define_demo_execution_pipeline():
+    return PipelineDefinition(
+        name='demo_pipeline',
+        solids=[multiply_the_word, count_letters],
+        dependencies={'count_letters': {'word': DependencyDefinition('multiply_the_word')}},
+    )
+
+
+def define_demo_execution_repo():
+    return RepositoryDefinition(
+        name='demo_execution_repo', pipeline_dict={'demo_pipeline': define_demo_execution_pipeline}
+    )
+
+
+
+

And now the repository file:

+
+
repository.yml
+
1
+2
+3
repository:
+  file: pipeline_cli_execution.py
+  fn: define_demo_execution_repo
+
+
+
+

Finally, we’ll need to define the pipeline config in a yaml file in order to +execute our pipeline from the command line.

+
+
env.yml
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
context:
+  default:
+    config:
+      log_level: DEBUG
+
+solids:
+  multiply_the_word:
+    inputs:
+      word:
+        value: bar
+    config:
+      factor: 2
+
+
+
+

With these elements in place we can now drive execution from the CLI specifying only the pipeline +name. The tool loads the repository using the repository.yml file and looks up the pipeline by +name.

+
$ dagster pipeline execute demo_pipeline -e env.yml
+
+
+
+

Config Splitting

+

Suppose that we want to keep some settings (like our context-level logging config) constant across +a bunch of our pipeline executions, and vary only pipeline-specific settings. It’d be tedious to +copy the broadly-applicable settings into each of our config yamls, and error-prone to try to keep +those copies in sync. So the command line tools allow us to specify more than one yaml file to use +for config.

+

Let’s split up our env.yml into two parts:

+
+
constant_env.yml
+
context:
+  default:
+    config:
+      log_level: DEBUG
+
+
+
+
+
specific_env.yml
+
solids:
+  multiply_the_word:
+    inputs:
+      word:
+        value: bar
+    config:
+      factor: 2
+
+
+
+

Now we can run our pipeline as follows:

+
$ dagster pipeline execute part_seven -e constant_env.yml -e specific_env.yml
+
+
+

Order matters when specifying yaml files to use – values specified in later files will override +values in earlier files, which can be useful. You can also use globs in the CLI arguments to consume +multiple yaml files.

+

Next, we’ll look at how User-Defined Types can enrich documentation and type-safety +in pipelines.

+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 77'] = ''' + + + + + + Repositories — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Repositories

+

Dagster is a not just a programming model for pipelines, it is also a platform for +tool-building. You’ve already met the dagster and dagit CLI tools, which let you programmatically +run and visualize pipelines.

+

In previous examples we have specified a file (-f) or a module (-m) and named a pipeline definition function +(-n) in order to tell the CLI tools how to load a pipeline, e.g.:

+
$ dagit -f hello_world.py -n define_hello_world_pipeline
+$ dagster pipeline execute -f hello_world.py \\
+    -n define_hello_world_pipeline
+
+
+

But most of the time, especially when working on long-running projects with other people, we will +want to be able to target many pipelines at once with our tools.

+

A repository is a collection of pipelines at which dagster tools may be pointed.

+

Repostories are declared using a new API, +RepositoryDefinition:

+
+
repos.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
from dagster import lambda_solid, PipelineDefinition, RepositoryDefinition
+
+
+@lambda_solid
+def hello_world():
+    pass
+
+
+def define_repo_demo_pipeline():
+    return PipelineDefinition(name='repo_demo_pipeline', solids=[hello_world])
+
+
+def define_repo():
+    return RepositoryDefinition(
+        name='demo_repository',
+        # Note that we pass the function itself, rather than call the function.
+        # This allows us to construct pipelines on demand.
+        pipeline_dict={'repo_demo_pipeline': define_repo_demo_pipeline},
+    )
+
+
+
+

Note that the name of the pipeline in the RepositoryDefinition must match the name we declared +for it in its PipelineDefinition. Don’t worry, if these names don’t match, you’ll see a helpful +error message.

+

If you save this file as repos.py, you can then run the command line tools on it. Try running:

+
$ dagit -f repos.py -n define_repo
+
+
+

Now you can see the list of all pipelines in the repo via the dropdown at the top.

+../../../_images/repos_figure_one.png +

Typing the name of the file and function defining the repository gets tiresome and repetitive, so +let’s create a declarative config file with this information to make using the command line tools +easier. Save this file as repository.yml. This is the default name for a repository config file, +although you can tell the CLI tools to use any file you like.

+
+
repository.yml
+
1
+2
+3
repository:
+  file: repos.py
+  fn: define_repo
+
+
+
+

Now you should be able to list the pipelines in this repo without all the typing:

+
$ dagit
+
+
+

In the next part of the tutorial, we’ll get to know Pipeline Execution +a little better, and learn how to execute pipelines in a repository from the command line by name, +with swappable config.

+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 78'] = ''' + + + + + + Resources — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Resources

+

We’ve already learned about logging through the info object. We can also use the info object +to manage pipelines’ access to resources like the file system, databases, or cloud services. +In general, interactions with features of the external environment like these should be modeled +as resources.

+

Let’s imagine that we are using a key value store offered by a cloud service that has a python API. +We are going to record the results of computations in that key value store.

+

We are going to model this key value store as a resource.

+
from bigco import PublicCloudConn, set_value_in_cloud_store
+
+
+
class PublicCloudStore:
+    def __init__(self, username, password):
+        # create credential and store it
+        self.conn = PublicCloudConn(username, password)
+
+    def record_value(self, log, key, value):
+        log.info('Setting key={key} value={value} in cloud'.format(key=key, value=value))
+        set_value_in_cloud_store(self.conn, key, value)
+
+
+def define_cloud_store_resource():
+    return ResourceDefinition(
+        resource_fn=lambda init_context: PublicCloudStore(
+            init_context.resource_config['username'], init_context.resource_config['password']
+        ),
+        config_field=Field(Dict({'username': Field(String), 'password': Field(String)})),
+        description='''This represents some cloud-hosted key value store.
+        Username and password must be provided via configuration for this to
+        work''',
+
+
+

The core of a resource are the definition of its configuration (the config_field) +and then the function that can actually construct the resource. Notice that all of the +configuration specified for a given resource is passed to its constructor under the +resource_config key of the init_context parameter.

+

Let’s now attach this resource to a pipeline and use it in a solid.

+
@solid(
+    inputs=[InputDefinition('num_one', Int), InputDefinition('num_two', Int)],
+    outputs=[OutputDefinition(Int)],
+)
+def add_ints(context, num_one, num_two):
+    sum_ints = num_one + num_two
+    context.resources.store.record_value(context.log, 'add', sum_ints)
+    return sum_ints
+
+
+def define_resource_test_pipeline():
+    return PipelineDefinition(
+        name='resource_test_pipeline',
+        solids=[add_ints],
+        context_definitions={
+            'local': PipelineContextDefinition(
+                resources={'store': define_in_memory_store_resource()}
+            ),
+            'cloud': PipelineContextDefinition(resources={'store': define_cloud_store_resource()}),
+        },
+    )
+
+
+

Resources are attached to pipeline context definitions. A pipeline context +definition is way that a pipeline can declare the different “modes” it can +operate in. For example, a common context definition would be “unittest” +or “production”. So, you can swap out implementations of these resources +by altering configuration, while not changing your code.

+

In this case we have a single context definition, cloud, and that context definition has a +single resource, the cloud store resource.

+

In order to invoke this pipeline, we pass it the following configuration:

+
environment_dict={
+    'context': {
+        'cloud': {
+            'resources': {
+                'store': {'config': {'username': 'some_user', 'password': 'some_password'}}
+            }
+        }
+    },
+    'solids': {'add_ints': {'inputs': {'num_one': {'value': 2}, 'num_two': {'value': 6}}}},
+},
+
+
+

Note how we are telling the configuration to create a cloud context by +using the cloud key under context and then parameterizing the store resource +with the appropriate config. As a config, any user-provided configuration for +an artifact (in this case the store resoource) is placed under the config key.

+

So this works, but imagine we wanted to have a test mode, where we interacted +with an in memory version of that key value store and not develop against the live +public cloud version.

+

First, we need a version of the store that implements the same interface as the production key-value +store; this version can be used in testing contexts without touching the public cloud:

+
class InMemoryStore:
+    def __init__(self):
+        self.values = {}
+
+    def record_value(self, log, key, value):
+        log.info('Setting key={key} value={value} in memory'.format(key=key, value=value))
+        self.values[key] = value
+
+
+

Next we package this up as a resource.

+
def define_in_memory_store_resource():
+    return ResourceDefinition(
+        resource_fn=lambda _: InMemoryStore(),
+        description='''An in-memory key value store that requires 
+        no configuration. Useful for unit testing.''',
+    )
+
+
+

And lastly add a new context definition to represent this new operating “mode”:

+
def define_resource_test_pipeline():
+    return PipelineDefinition(
+        name='resource_test_pipeline',
+        solids=[add_ints],
+        context_definitions={
+            'local': PipelineContextDefinition(
+                resources={'store': define_in_memory_store_resource()}
+            ),
+            'cloud': PipelineContextDefinition(resources={'store': define_cloud_store_resource()}),
+        },
+    )
+
+
+

Now we can simply change configuration and the “in-memory” version of the +resource will be used instead of the cloud version:

+
result = execute_pipeline(
+    define_resource_test_pipeline(),
+    environment_dict={
+        'context': {'local': {}},
+        'solids': {'add_ints': {'inputs': {'num_one': {'value': 2}, 'num_two': {'value': 6}}}},
+    },
+)
+
+
+

In the next section, we’ll see how to declaratively specify Repositories to +manage collections of multiple dagster pipelines.

+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 79'] = ''' + + + + + + Reusable Solids — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Reusable Solids

+

So far we have been using solids tailor-made for each pipeline they were resident in, and have +only used a single instance of that solid. However, solids are, at their core, a specialized type +of function. And like functions, they should be reusable and not tied to a particular call site.

+

Imagine we have some solids that perform generic mathematical computations and we want them to +be reusable. E.g. we want to have a generic adder solid and use it a couple times within +a pipeline. Using APIs presented so far, that would be impossible: there would be a name collision +if one included two copies of the solid.

+

Instead we introduce a new class SolidInstance that allows the user to create multiple, named instances +of a single solid:

+
+
reusable_solids.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
from dagster import (
+    DependencyDefinition,
+    InputDefinition,
+    OutputDefinition,
+    PipelineDefinition,
+    SolidInstance,
+    lambda_solid,
+    Int,
+)
+
+
+@lambda_solid(
+    inputs=[InputDefinition('num1', Int), InputDefinition('num2', Int)],
+    output=OutputDefinition(Int),
+)
+def adder(num1, num2):
+    return num1 + num2
+
+
+@lambda_solid(
+    inputs=[InputDefinition('num1', Int), InputDefinition('num2', Int)],
+    output=OutputDefinition(Int),
+)
+def multer(num1, num2):
+    return num1 * num2
+
+
+def define_reusable_solids_pipeline():
+    # (a + b) * (c + d)
+
+    return PipelineDefinition(
+        name='reusable_solids_pipeline',
+        solids=[adder, multer],
+        dependencies={
+            SolidInstance('adder', 'a_plus_b'): {},
+            SolidInstance('adder', 'c_plus_d'): {},
+            SolidInstance('multer', 'final'): {
+                'num1': DependencyDefinition('a_plus_b'),
+                'num2': DependencyDefinition('c_plus_d'),
+            },
+        },
+    )
+
+
+
+

You’ll notice that now have two copies of the adder solid.

+

You can think of the solids parameter as declaring what solids are “in-scope” for the +purposes of this pipeline, and the dependencies parameter is how they instantiated +and connected together. Within the dependency graph and in config, the alias of the +particular instance is used, rather than the name of the definition.

+

If you inspect this in dagit, you’ll see those two instances:

+../../../_images/reusable_solids_figure_one.png +

You also use the aliases in the environment config. In order to execute this pipeline, use +the following config file:

+
+
reusable_solids.yml
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
solids:
+  a_plus_b:
+    inputs:
+      num1:
+        value: 2
+      num2:
+        value: 6
+  c_plus_d:
+    inputs:
+      num1:
+        value: 4
+      num2:
+        value: 8
+
+
+
+

Load this in dagit and you’ll see that the node are the graph are labeled with +their instance name.

+
$ dagit -f part_thirteen.py -n define_part_thirteen_step_two
+
+
+

Now these arithmetic operations are not particularly interesting, but one +can imagine reusable solids doing more useful things like uploading files +to cloud storage, unzipping files, etc.

+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 80'] = ''' + + + + + + User-Defined Types & Input/Output Schemas — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

User-Defined Types & Input/Output Schemas

+

Throughout the tutorial you have seen the use of builtins such as Int +and String for types. However you will want to be able to define your +own dagster types to fully utilize the system. We’ll go over that here.

+

As a pedogogical example, we will go over the code used to the define the PandasDataFrame type +in the dagster-pandas library, building it step by step along the way.

+
+

Basic Typing

+
import pandas as pd
+
+
+DataFrame = as_dagster_type(
+    pd.DataFrame,
+    name='PandasDataFrame',
+    description='''Two-dimensional size-mutable, potentially heterogeneous
+    tabular data structure with labeled axes (rows and columns).
+    See http://pandas.pydata.org/''',
+    input_schema=dataframe_input_schema,
+)
+
+
+

What this code doing is annotating/registering an existing type as a dagster type. Now one can +include this type and use it as an input or output of a solid. The system will do a typecheck +to ensure that the object is of type pd.DataFrame.

+

Now one can use it to define a solid:

+
 @lambda_solid(
+     inputs=[InputDefinition('num', DataFrame)],
+     output=OutputDefinition(DataFrame),
+ )
+ def sum_solid(num):
+     sum_df = num.copy()
+     sum_df['sum'] = sum_df['num1'] + sum_df['num2']
+     return sum_df
+
+
+

The type metadata now appears in dagit and the system will ensure the input and output to this +solid are indeed data frames.

+
+
+

Input Schema

+

This solid as defined is only expressed in terms of an in-memory object; it says nothing about +how this data should be sourced from or materialized to disk. This is where the notion of +input and output schemas come into play. Once the user provides those she is able to use +the configuration language in order to parameterize the computation.

+

Let us now add the input schema:

+
@input_schema(
+    Selector(
+        {
+            'csv': define_csv_dict_field(),
+            'parquet': define_path_dict_field(),
+            'table': define_path_dict_field(),
+        }
+    )
+)
+def dataframe_input_schema(config_value):
+    file_type, file_options = list(config_value.items())[0]
+    check.str_param(file_type, 'file_type')
+    check.dict_param(file_options, 'file_options')
+
+    if file_type == 'csv':
+        path = file_options['path']
+        del file_options['path']
+        return pd.read_csv(path, **file_options)
+    elif file_type == 'parquet':
+        return pd.read_parquet(file_options['path'])
+    elif file_type == 'table':
+        return pd.read_table(file_options['path'])
+    else:
+        raise DagsterInvariantViolationError(
+            'Unsupported file_type {file_type}'.format(
+                file_type=file_type
+            )
+        )
+
+
+

Any input schema is define by a decorated function with a single argument. The argument is the +format the input schema takes. In this case it is a Selector. Selectors are used when you want +to be able present several different options to the user but force them to select one. In this case, +for example, it would not make much sense to allow them to say that a single input should be sourced +from a csv and a parquet file: They must choose. (In other type systems this might be called an “input +union.”)

+

Note our selector provides three keys: csv, parquet, and table. Each of these in turn has +their own subfield selections. You’ll note that these are Dict requiring the user to provide all +required fields, rather than only one.

+

The remaining step here is that the user must provide code that takes those validated configurated +files and produces an object of the expected type. In this case that would be the pandas DataFrame +type. The user can assume the value abides by the provided schema and that any and all default +values have been applied.

+

Selectors are very commonly used for these type of schemas, so we’ve also provided an alternative +API that removes some boilerplate around manipulating the config_value dictionary. Instead, the +user-provided function takes the unpacked key and value of config_value directly, since in the +case of a selector, the config_value dictionary has only 1 (key, value) pair.

+

+
+@input_selector_schema(
+    NamedSelector(
+        'DataFrameInputSchema',
+        {
+            'csv': define_csv_dict_field(),
+            'parquet': define_path_dict_field(),
+            'table': define_path_dict_field(),
+        },
+    )
+)
+def dataframe_input_schema(_context, file_type, file_options):
+    check.str_param(file_type, 'file_type')
+    check.dict_param(file_options, 'file_options')
+
+    if file_type == 'csv':
+        path = file_options['path']
+        return pd.read_csv(path, **dict_without_keys(file_options, 'path'))
+    elif file_type == 'parquet':
+        return pd.read_parquet(file_options['path'])
+    elif file_type == 'table':
+        return pd.read_table(file_options['path'])
+    else:
+        raise DagsterInvariantViolationError(
+
+
+

You’ll note that we no longer need to manipulate the config_value dictionary. It grabs +that key and value for you and calls the provided function.

+

Finally insert this into the original declaration:

+

+
+DataFrame = as_dagster_type(
+    pd.DataFrame,
+    name='PandasDataFrame',
+    description='''Two-dimensional size-mutable, potentially heterogeneous
+    tabular data structure with labeled axes (rows and columns).
+    See http://pandas.pydata.org/''',
+    input_schema=dataframe_input_schema,
+
+
+

Now if you run a pipeline with this solid from dagit you will be able to provide sources for +these inputs via config:

+../../../_images/types_figure_one.png +
+
+

Output Schema

+

We will add output schema now. They are similar to input schema, except that they are responsible +for taking the in-memory object flowed through your computation and materializing it to some +persistent store. Outputs are purely optional for any computation, whereas inputs must be provided +for a computation to proceed. You will likely want outputs as for a pipeline to be useful it +should produce some materialization that outlives the computation.

+
@output_selector_schema(
+    NamedSelector(
+        'DataFrameOutputSchema',
+        {
+            'csv': define_csv_dict_field(),
+            'parquet': define_path_dict_field(),
+            'table': define_path_dict_field(),
+        },
+    )
+)
+def dataframe_output_schema(_context, file_type, file_options, pandas_df):
+    check.str_param(file_type, 'file_type')
+    check.dict_param(file_options, 'file_options')
+    check.inst_param(pandas_df, 'pandas_df', DataFrame)
+
+    if file_type == 'csv':
+        path = file_options['path']
+        pandas_df.to_csv(path, index=False, **dict_without_keys(file_options, 'path'))
+    elif file_type == 'parquet':
+        pandas_df.to_parquet(file_options['path'])
+    elif file_type == 'table':
+        pandas_df.to_csv(file_options['path'], sep='\\t', index=False)
+    else:
+        check.failed('Unsupported file_type {file_type}'.format(file_type=file_type))
+
+
+

This has a similar aesthetic to an input schema but performs a different function. Notice that +it takes a third argument, pandas_df (it can be named anything), that is the value that was +outputted from the solid in question. It then takes the configuration data as “instructions” as to +how to materialize the value.

+

One connects the output schema to the type as follows:

+

+
+DataFrame = as_dagster_type(
+    pd.DataFrame,
+    name='PandasDataFrame',
+    description='''Two-dimensional size-mutable, potentially heterogeneous
+    tabular data structure with labeled axes (rows and columns).
+    See http://pandas.pydata.org/''',
+    input_schema=dataframe_input_schema,
+
+
+

Now we can provide a list of materializations to a given execution.

+../../../_images/types_figure_two.png +

You’ll note you can provide an arbitrary number of materializations. You can materialize any +given output any number of times in any number of formats.

+../../../_images/types_figure_three.png +
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 81'] = ''' + + + + + + Unit-testing Pipelines — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Unit-testing Pipelines

+

Historically in production data engineering systems, unit testing data pipelines is quite difficult +to implement. As a result, it is frequently omitted from data engineering workflows, and pipelines +are instead tested end-to-end in a dev environment.

+

One of the mechanisms included in dagster to enable testing has already been discussed: the +Execution Context. Recall that the context allows us to configure the +pipeline-level execution environment while keeping all of the code in our pipelines unchanged.

+

The other important testing mechanism is the ability to execute arbitrary subsets of a DAG. (This +capability is useful for other use cases but we will focus on unit testing for now).

+

Let’s start where we left off.

+

We have the following pipeline:

+
+
unittesting.py
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
from dagster import (
+    DependencyDefinition,
+    InputDefinition,
+    OutputDefinition,
+    PipelineDefinition,
+    SolidInstance,
+    execute_solid,
+    execute_solids,
+    lambda_solid,
+    Int,
+)
+
+
+@lambda_solid(
+    inputs=[InputDefinition('num1', Int), InputDefinition('num2', Int)],
+    output=OutputDefinition(Int),
+)
+def adder(num1, num2):
+    return num1 + num2
+
+
+@lambda_solid(
+    inputs=[InputDefinition('num1', Int), InputDefinition('num2', Int)],
+    output=OutputDefinition(Int),
+)
+def multer(num1, num2):
+    return num1 * num2
+
+
+def define_part_fourteen_step_one_pipeline():
+    # (a + b) * (c + d)
+
+    return PipelineDefinition(
+        name='part_fourteen_step_one_pipeline',
+        solids=[adder, multer],
+        dependencies={
+            SolidInstance(adder.name, 'a_plus_b'): {},
+            SolidInstance(adder.name, 'c_plus_d'): {},
+            SolidInstance(multer.name, 'final'): {
+                'num1': DependencyDefinition('a_plus_b'),
+                'num2': DependencyDefinition('c_plus_d'),
+            },
+        },
+    )
+
+
+
+

Let’s say we wanted to test one of these solids in isolation.

+

We want to do is isolate that solid and execute with inputs we +provide, instead of from solids upstream in the dependency graph.

+

So let’s do that. Follow along in the comments:

+
+
unittesting.py
+
1
+2
+3
+4
+5
+6
def execute_test_only_final():
+    solid_result = execute_solid(
+        define_part_fourteen_step_one_pipeline(), 'final', inputs={'num1': 3, 'num2': 4}
+    )
+    assert solid_result.success
+    assert solid_result.transformed_value() == 12
+
+
+
+

We can also execute entire arbitrary subdags rather than a single solid using +the execute_solids function

+
+
unittesting.py
+
1
+2
+3
+4
+5
+6
+7
+8
+9
def execute_test_a_plus_b_final_subdag():
+    results = execute_solids(
+        define_part_fourteen_step_one_pipeline(),
+        ['a_plus_b', 'final'],
+        inputs={'a_plus_b': {'num1': 2, 'num2': 4}, 'final': {'num2': 6}},
+    )
+
+    assert results['a_plus_b'].transformed_value() == 6
+    assert results['final'].transformed_value() == 36
+
+
+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' + +snapshots['test_build_all_docs 82'] = ''' + + + + + + Reference — Dagster + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+ +
+

Reference

+

As you get started with Dagster, you’ll find that there are a number of important concepts +underpinning the system. Some of these concepts, like DAGs, will undoubtably be familiar +if you’ve previously worked with tools like Airflow. However, Dagster has some important differences +from other workflow systems to facilitate operating at a higher level of abstraction.

+
+

Solid

+../../_images/solid.png +

A solid is a functional unit of computation with defined inputs and outputs. Solids can be strung +together into pipelines by defining dependencies +between their inputs and outputs. Solids are reusable and instances of a solid may appear many +times in a given pipeline, or across many different pipelines.

+

Solids often wrap code written in or intended to execute in other systems (e.g., SQL statements, +Jupyter notebooks, or Spark jobs written in Scala), providing a common interface for defining, +orchestrating, and managing data processing applications with heterogeneous components.

+

Solids can optionally define the types of their inputs and outputs, and can define a typed schema +so that their inputs can be read from external configuration files. Solids can also enforce +expectations on their inputs and outputs.

+

Solids are defined using the @lambda_solid or +@solid decorators, or using the underlying +SolidDefinition class. These APIs wrap an underlying +transform function, making its metadata queryable by higher-level tools.

+
+
+

Transform Function

+../../_images/transform_fn.png +

The user-supplied function which forms the heart of a solid definition. The transform functions are +the business logic defined by you as the user; this business logic is what will be executed when the +solid is invoked by the Dagster engine.

+
+
+

Result

+../../_images/result.png +

A result is how a solid’s transform function communicates the value of an output, and its +name, to Dagster.

+

Solid transform functions are expected to yield a stream of results. Implementers of a solid must +ensure their tranform yields Result objects.

+

In the common case where only a single result is yielded, the machinery provides sugar allowing +the user to return a value instead of yielding it, and automatically wrapping the value in the +Result class.

+
+
+

Dependency Definition

+../../_images/dependency.png +

Solids are linked together into pipelines by defining the dependencies between +their inputs and outputs. Dependencies are data-driven, not workflow-driven – they define what +data is required for solids to execute, not how or when they execute.

+

This reflects an important separation of concerns – the same pipeline may have very different +execution semantics depending on the environment in which it runs or the way in which it is +scheduled, but these conditions should be expressed separately from its underlying structure.

+

Dependencies are defined when constructing pipelines, using the +DependencyDefinition class.

+
+
+

Intermediates

+../../_images/materialization.png +

The intermediate outputs of solids in a pipeline can be materialized. The Dagster engine can +materialize outputs in a number of formats (e.g., json, pickle), and can store materialized +intermediates locally or in object stores such as S3 or GCS.

+

Materialized intermediates make it possible to introspect the intermediate state of a pipeline +execution and ask questions like, “Exactly what output did this solid have on this particular run?” +This is useful when auditing or debugging pipelines, and makes it possible to establish the +provenance of data artifacts.

+

Materialized intermediates also enable partial re-execution of pipelines “starting from” a +materialized state of the upstream execution. This is useful when a pipeline fails halfway through, +or in order to explore how new logic in part of a pipeline would have operated on outputs from +previous runs of the pipeline.

+
+
+

Expectation

+../../_images/expectation.png +

An expectation is a function that determines whether the input or output of a solid passes a +given condition – for instance, that a value is non-null, or that it is distributed in a certain +way.

+

Expectations can be used to enforce runtime data quality and integrity constraints, so that +pipelines fail early – before any downstream solids execute on bad data.

+

Expectations are defined using the ExpectationDefinition +class. We also provide a thin wrapper +around the great_expectations library +so you can use its existing repertoire of expectartions with Dagster.

+
+
+

Pipeline

+../../_images/pipeline.png +

Data pipelines are directed acyclic graphs (DAGs) of solids – that is, they are made up of a number +of solids which have data dependencies on each other (but no circular +dependencies), along with a set of associated pipeline context definitions, which declare the various +environments in which a pipeline can execute.

+

Pipelines are defined using the PipelineDefinition class, and +their contexts are defined using PipelineContextDefinition.

+

When a pipeline is combined with a given config conforming to one of its declared contexts, it can +be compiled by the Dagster engine into an execution plan that can be executed on various compute +substrates.

+

Concretely, a pipeline might include context definitions for local testing (where databases and +other resources will be mocked, in-memory, or local) and for running in production (where resources +will require different credentials and expose configuration options). When a pipeline is compiled +with a config corresponding to one of these contexts, it yields an execution plan suitable for the +given environment.

+
+
+

Resources

+../../_images/resource.png +

Resources are pipeline-scoped and typically used to expose features of the execution environment +(like database connections) to solids during pipeline execution. Resources can also clean up +after execution resolves. They are typically defined using the @resource +decorator or using the ResourceDefinition class directly.

+
+
+

Repository

+../../_images/repository.png +

A repository is a collection of pipelines that can be made available to the Dagit UI and other +higher-level tools. Repositories are defined using the +RepositoryDefinition class, and made available to +higher-level tools with a special repository.yml file that tells the tools where to look for a +repository definition.

+
+
+

Dagster Types

+

The Dagster type system allows authors of solids and pipelines to optionally and gradually define +the types of the data that flows between solids, and so to introduce compile-time and runtime checks +into their pipelines.

+

Types also allow for custom materialization, and are typically defined using the +@dagster_type decorator or the +as_dagster_type API. It is also possible to inherit from +RuntimeType directly.

+
+
+

Environment Config

+

Environment config defines the external environment with which a pipeline will interact for a given +execution plan. Environment config can be used to change solid behavior, define pipeline- or +solid-scoped resources and data that will be available during execution, or even shim solid inputs.

+

Environment config is complementary to data (solid inputs and outputs) – think of inputs and +outputs as specifying what data a pipeline operates on, and config as specifying how it +operates.

+

Concretely, imagine a pipeline of solids operating on a data warehouse. The solids might emit and +consume table partition IDs and aggregate statistics as inputs and outputs – the data on which they +operate. Environment config might specify how to connect to the warehouse (so that the pipeline +could also operate against a local test database), how to log the results of intermediate +computations, or where to put artifacts like plots and summary tables.

+
+
+

Configuration Schemas

+

Configuration schemas define how users can config pipelines (using either Python dicts, YAML, +or JSON). They tell the Dagster engine how to type check environment config provided in one of +these formats against the pipeline context and enable many errors to be caught with rich messaging +at compile time.

+

Config fields are defined using the Field class.

+
+
+

DAG

+

DAG is short for directed acyclic graph. In this context, we are concerned with graphs where the +nodes are computations and the edges are dependencies between those computations. The dependencies +are directed because the outputs of one computation are the inputs to another. +These graphs are acyclic because there are no circular dependencies – in other words, the graph +has a clear beginning and end, and we can always figure out what order to execute its nodes in.

+
+
+

Execution Plan

+

An execution plan is a concrete plan for executing a DAG of execution steps created by compiling a +pipeline and a config. The execution plan is aware of the topological ordering of the execution +steps, enabling physical execution on one of the available executor engines (e.g., in-process, +multiprocess, using Airflow).

+

Users do not directly instantiate or manipulate execution plans.

+
+
+

Execution Step

+

Execution steps are concrete computations, one or more of which corresponds to a solid in a pipeline +that has been compiled with a config. Some execution steps are generated in order to compute the +core transform functions of solids, but execution steps may also be generated in order to +materialize outputs, check expectations against outputs, etc.

+

Users do not directly instantiate or manipulate execution steps.

+
+
+

Dagster Event

+

When a pipeline is executed, a stream of events communicate the progress of its execution. This +includes top level events when the pipeline starts and completes, when execution steps succeed, +fail, or are skipped due to upstream failures, and when outputs are generated and materialized.

+

Users do not directly instantiate or manipulate Dagster events, but they are consumed by the GraphQL +interface that supports the Dagit tool.

+
+
+

InputDefinition

+

Optionally typed definition of the data that a solid requires in order to execute. Defined inputs +may often also be shimmed through config. Inputs are defined using the +InputDefinition class, usually when defining a solid.

+
+
+

OutputDefinition

+

Optionally typed definition of the result that a solid will produce. Outputs are defined using the +OutputDefinition class, usually when defining a solid.

+
+
+ + +
+ + +
+
+ +
+
+ + + + + + +''' diff --git a/python_modules/dagster/docs/test_doc_build.py b/python_modules/dagster/docs/test_doc_build.py index 95d084d2400f5..cfe803d0aef88 100644 --- a/python_modules/dagster/docs/test_doc_build.py +++ b/python_modules/dagster/docs/test_doc_build.py @@ -76,9 +76,9 @@ def test_build_all_docs(snapshot): for dirpath, _dirnames, filenames in walked: # Omit the built source files and autodocs from snapshot testing to avoid test # failure fatigue - if not _path_starts_with( + if _path_starts_with( dirpath, ['.', 'html', '_modules', 'dagster'] - ) and not _path_starts_with(dirpath, ['.', 'html', '_sources', 'sections', 'api']): + ) or _path_starts_with(dirpath, ['.', 'html', '_sources', 'sections', 'api']): continue for filename in filenames: if any((re.match(pattern, filename) for pattern in IGNORE_FILES)):