diff --git a/build/ckeditor.js.map b/build/ckeditor.js.map index 24b533bfa1..03d24c2c88 100644 --- a/build/ckeditor.js.map +++ b/build/ckeditor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///../ckeditor5-engine/src/view/writer.js","webpack:///../ckeditor5-utils/src/lib/lodash/rest.js","webpack:///webpack/bootstrap 32b781da89000b3af43d","webpack:///../ckeditor5-utils/src/ckeditorerror.js","webpack:///../ckeditor5-engine/src/model/position.js","webpack:///../ckeditor5-core/src/plugin.js","webpack:///../ckeditor5-engine/src/model/range.js","webpack:///../ckeditor5-utils/src/mix.js","webpack:///../ckeditor5-engine/src/model/element.js","webpack:///../ckeditor5-ui/src/template.js","webpack:///../ckeditor5-ui/src/view.js","webpack:///../ckeditor5-utils/src/emittermixin.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseIteratee.js","webpack:///../ckeditor5-core/src/command.js","webpack:///../ckeditor5-utils/src/observablemixin.js","webpack:///../ckeditor5-utils/src/lib/lodash/toInteger.js","webpack:///../ckeditor5-utils/src/lib/lodash/isArrayLikeObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/isArray.js","webpack:///../ckeditor5-utils/src/log.js","webpack:///../ckeditor5-utils/src/lib/lodash/isObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/last.js","webpack:///../ckeditor5-engine/src/model/delta/deltafactory.js","webpack:///../ckeditor5-engine/src/model/batch.js","webpack:///../ckeditor5-ui/src/button/buttonview.js","webpack:///../ckeditor5-engine/src/view/position.js","webpack:///../ckeditor5-engine/src/model/writer.js","webpack:///../ckeditor5-engine/src/model/delta/delta.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseFlatten.js","webpack:///../ckeditor5-engine/src/model/text.js","webpack:///../ckeditor5-engine/src/view/element.js","webpack:///../ckeditor5-utils/src/keyboard.js","webpack:///../ckeditor5-engine/src/model/operation/moveoperation.js","webpack:///../ckeditor5-utils/src/lib/lodash/_arrayMap.js","webpack:////workspace/ckeditor5/node_modules/css-loader/lib/css-base.js","webpack:////workspace/ckeditor5/node_modules/style-loader/lib/addStyles.js","webpack:///../ckeditor5-utils/src/lib/lodash/_root.js","webpack:///../ckeditor5-utils/src/isiterable.js","webpack:///../ckeditor5-engine/src/view/text.js","webpack:///../ckeditor5-image/src/image/utils.js","webpack:///../ckeditor5-utils/src/lib/lodash/_isIndex.js","webpack:///../ckeditor5-engine/src/view/range.js","webpack:///../ckeditor5-engine/src/model/documentfragment.js","webpack:///../ckeditor5-engine/src/model/operation/operation.js","webpack:///../ckeditor5-engine/src/model/operation/removeoperation.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseSlice.js","webpack:///../ckeditor5-engine/src/conversion/buildviewconverter.js","webpack:///../ckeditor5-utils/src/lib/lodash/isObjectLike.js","webpack:///../ckeditor5-utils/src/lib/lodash/extend.js","webpack:///../ckeditor5-utils/src/lib/lodash/isSymbol.js","webpack:///../ckeditor5-engine/src/view/containerelement.js","webpack:///../ckeditor5-engine/src/model/operation/insertoperation.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseUniq.js","webpack:///../ckeditor5-utils/src/keystrokehandler.js","webpack:///../ckeditor5-engine/src/conversion/buildmodelconverter.js","webpack:///../ckeditor5-utils/src/uid.js","webpack:///../ckeditor5-utils/src/lib/lodash/eq.js","webpack:///../ckeditor5-engine/src/model/treewalker.js","webpack:///../ckeditor5-utils/src/comparearrays.js","webpack:///../ckeditor5-utils/src/lib/lodash/_getNative.js","webpack:///../ckeditor5-utils/src/lib/lodash/_isKey.js","webpack:///../ckeditor5-utils/src/lib/lodash/_toKey.js","webpack:///../ckeditor5-engine/src/model/selection.js","webpack:///../ckeditor5-utils/src/dom/global.js","webpack:///../ckeditor5-engine/src/view/observer/observer.js","webpack:///../ckeditor5-utils/src/focustracker.js","webpack:///../ckeditor5-utils/src/first.js","webpack:///../ckeditor5-utils/src/lib/lodash/_assignValue.js","webpack:///../ckeditor5-utils/src/lib/lodash/isFunction.js","webpack:///../ckeditor5-engine/src/model/node.js","webpack:///../ckeditor5-engine/src/model/textproxy.js","webpack:///../ckeditor5-engine/src/view/treewalker.js","webpack:///../ckeditor5-utils/src/lib/lodash/clone.js","webpack:///../ckeditor5-utils/src/lib/lodash/keys.js","webpack:///../ckeditor5-engine/src/conversion/model-to-view-converters.js","webpack:///../ckeditor5-engine/src/model/operation/nooperation.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseDifference.js","webpack:///../ckeditor5-engine/src/view/filler.js","webpack:///../ckeditor5-engine/src/view/observer/domeventobserver.js","webpack:///../ckeditor5-upload/src/filerepository.js","webpack:///../ckeditor5-utils/src/lib/lodash/isPlainObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/_isHostObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/_isIterateeCall.js","webpack:///../ckeditor5-utils/src/lib/lodash/isArrayLike.js","webpack:///../ckeditor5-utils/src/lib/lodash/isLength.js","webpack:///../ckeditor5-utils/src/lib/lodash/_isPrototype.js","webpack:///../ckeditor5-engine/src/model/nodelist.js","webpack:///../ckeditor5-engine/src/view/node.js","webpack:///../ckeditor5-utils/src/lib/lodash/_ListCache.js","webpack:///../ckeditor5-utils/src/lib/lodash/_assocIndexOf.js","webpack:///../ckeditor5-utils/src/lib/lodash/_nativeCreate.js","webpack:///../ckeditor5-utils/src/lib/lodash/_getMapData.js","webpack:///../ckeditor5-utils/src/lib/lodash/_arrayPush.js","webpack:///../ckeditor5-utils/src/lib/lodash/_setToArray.js","webpack:///../ckeditor5-engine/src/view/editableelement.js","webpack:///../ckeditor5-engine/src/view/attributeelement.js","webpack:///../ckeditor5-engine/src/view/uielement.js","webpack:///../ckeditor5-engine/src/model/operation/attributeoperation.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseIsEqual.js","webpack:///../ckeditor5-utils/src/lib/lodash/_SetCache.js","webpack:///../ckeditor5-engine/src/model/operation/reinsertoperation.js","webpack:///../ckeditor5-engine/src/model/delta/removedelta.js","webpack:///../ckeditor5-engine/src/model/delta/movedelta.js","webpack:///../ckeditor5-engine/src/model/delta/mergedelta.js","webpack:///../ckeditor5-engine/src/model/delta/splitdelta.js","webpack:///../ckeditor5-engine/src/model/delta/unwrapdelta.js","webpack:///../ckeditor5-engine/src/model/delta/wrapdelta.js","webpack:///../ckeditor5-utils/src/lib/lodash/_castPath.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseWhile.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseSortedIndex.js","webpack:///../ckeditor5-utils/src/lib/lodash/unzip.js","webpack:///../ckeditor5-utils/src/lib/lodash/_arrayFilter.js","webpack:///../ckeditor5-utils/src/dom/emittermixin.js","webpack:///../ckeditor5-engine/src/view/selection.js","webpack:///../ckeditor5-ui/src/viewcollection.js","webpack:///../ckeditor5-utils/src/collection.js","webpack:///../ckeditor5-ui/src/focuscycler.js","webpack:///../ckeditor5-paragraph/src/paragraph.js","webpack:///../ckeditor5-utils/src/lib/lodash/_getPrototype.js","webpack:///../ckeditor5-utils/src/lib/lodash/_copyObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseProperty.js","webpack:///../ckeditor5-utils/src/lib/lodash/isArguments.js","webpack:///../ckeditor5-utils/src/lib/lodash/isString.js","webpack:///../ckeditor5-utils/src/tomap.js","webpack:///../ckeditor5-utils/src/lib/lodash/_Stack.js","webpack:///../ckeditor5-utils/src/lib/lodash/_MapCache.js","webpack:///../ckeditor5-utils/src/lib/lodash/_getTag.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cloneArrayBuffer.js","webpack:///../ckeditor5-utils/src/lib/lodash/_mapToArray.js","webpack:///../ckeditor5-utils/src/lib/lodash/_Symbol.js","webpack:///../ckeditor5-engine/src/view/documentfragment.js","webpack:///../ckeditor5-engine/src/model/delta/attributedelta.js","webpack:///../ckeditor5-engine/src/model/operation/markeroperation.js","webpack:///../ckeditor5-engine/src/model/operation/renameoperation.js","webpack:///../ckeditor5-engine/src/model/operation/rootattributeoperation.js","webpack:///../ckeditor5-engine/src/model/delta/insertdelta.js","webpack:///../ckeditor5-engine/src/model/delta/renamedelta.js","webpack:///../ckeditor5-utils/src/lib/lodash/_arrayIncludes.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseIndexOf.js","webpack:///../ckeditor5-utils/src/lib/lodash/_arrayIncludesWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseUnary.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cacheHas.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseGet.js","webpack:///../ckeditor5-utils/src/lib/lodash/drop.js","webpack:///../ckeditor5-utils/src/lib/lodash/dropRight.js","webpack:///../ckeditor5-utils/src/lib/lodash/head.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseIntersection.js","webpack:///../ckeditor5-utils/src/lib/lodash/_castArrayLikeObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/pullAll.js","webpack:///../ckeditor5-utils/src/lib/lodash/_basePullAll.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseSortedIndexBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/unzipWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseXor.js","webpack:///../ckeditor5-engine/src/model/liverange.js","webpack:///../ckeditor5-utils/src/count.js","webpack:///../ckeditor5-engine/src/view/domconverter.js","webpack:///../ckeditor5-engine/src/view/observer/domeventdata.js","webpack:///../ckeditor5-utils/src/dom/isrange.js","webpack:///../ckeditor5-widget/src/utils.js","webpack:///../ckeditor5-ui/src/panel/balloon/contextualballoon.js","webpack:///../ckeditor5-utils/src/lib/lodash/_apply.js","webpack:///../ckeditor5-utils/src/lib/lodash/toNumber.js","webpack:///(webpack)/buildin/harmony-module.js","webpack:///../ckeditor5-utils/src/lib/lodash/_indexKeys.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseTimes.js","webpack:///../ckeditor5-engine/src/conversion/mapper.js","webpack:///../ckeditor5-utils/src/objecttomap.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseClone.js","webpack:///../ckeditor5-utils/src/lib/lodash/isNative.js","webpack:///../ckeditor5-utils/src/lib/lodash/_toSource.js","webpack:///../ckeditor5-utils/src/lib/lodash/_Map.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseHas.js","webpack:///../ckeditor5-utils/src/lib/lodash/_copyArray.js","webpack:///../ckeditor5-utils/src/lib/lodash/_getSymbols.js","webpack:///../ckeditor5-utils/src/lib/lodash/_Set.js","webpack:///../ckeditor5-utils/src/lib/lodash/_Uint8Array.js","webpack:///../ckeditor5-utils/src/lib/lodash/_arrayReduce.js","webpack:///../ckeditor5-engine/src/view/matcher.js","webpack:///../ckeditor5-engine/src/conversion/modelconversiondispatcher.js","webpack:///../ckeditor5-engine/src/view/emptyelement.js","webpack:///../ckeditor5-engine/src/model/liveposition.js","webpack:///../ckeditor5-utils/src/unicode.js","webpack:///../ckeditor5-utils/src/lib/lodash/_equalArrays.js","webpack:///../ckeditor5-engine/src/model/delta/weakinsertdelta.js","webpack:///../ckeditor5-engine/src/model/delta/transform.js","webpack:///../ckeditor5-utils/src/lib/lodash/chunk.js","webpack:///../ckeditor5-utils/src/lib/lodash/compact.js","webpack:///../ckeditor5-utils/src/lib/lodash/concat.js","webpack:///../ckeditor5-utils/src/lib/lodash/difference.js","webpack:///../ckeditor5-utils/src/lib/lodash/_indexOfNaN.js","webpack:///../ckeditor5-utils/src/lib/lodash/differenceBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/_isStrictComparable.js","webpack:///../ckeditor5-utils/src/lib/lodash/_matchesStrictComparable.js","webpack:///../ckeditor5-utils/src/lib/lodash/get.js","webpack:///../ckeditor5-utils/src/lib/lodash/identity.js","webpack:///../ckeditor5-utils/src/lib/lodash/differenceWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/dropRightWhile.js","webpack:///../ckeditor5-utils/src/lib/lodash/dropWhile.js","webpack:///../ckeditor5-utils/src/lib/lodash/fill.js","webpack:///../ckeditor5-utils/src/lib/lodash/findIndex.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseFindIndex.js","webpack:///../ckeditor5-utils/src/lib/lodash/findLastIndex.js","webpack:///../ckeditor5-utils/src/lib/lodash/first.js","webpack:///../ckeditor5-utils/src/lib/lodash/flatten.js","webpack:///../ckeditor5-utils/src/lib/lodash/flattenDeep.js","webpack:///../ckeditor5-utils/src/lib/lodash/flattenDepth.js","webpack:///../ckeditor5-utils/src/lib/lodash/fromPairs.js","webpack:///../ckeditor5-utils/src/lib/lodash/indexOf.js","webpack:///../ckeditor5-utils/src/lib/lodash/initial.js","webpack:///../ckeditor5-utils/src/lib/lodash/intersection.js","webpack:///../ckeditor5-utils/src/lib/lodash/intersectionBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/intersectionWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/join.js","webpack:///../ckeditor5-utils/src/lib/lodash/lastIndexOf.js","webpack:///../ckeditor5-utils/src/lib/lodash/nth.js","webpack:///../ckeditor5-utils/src/lib/lodash/pull.js","webpack:///../ckeditor5-utils/src/lib/lodash/pullAllBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/pullAllWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/pullAt.js","webpack:///../ckeditor5-utils/src/lib/lodash/_basePullAt.js","webpack:///../ckeditor5-utils/src/lib/lodash/remove.js","webpack:///../ckeditor5-utils/src/lib/lodash/reverse.js","webpack:///../ckeditor5-utils/src/lib/lodash/slice.js","webpack:///../ckeditor5-utils/src/lib/lodash/sortedIndex.js","webpack:///../ckeditor5-utils/src/lib/lodash/sortedIndexBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/sortedIndexOf.js","webpack:///../ckeditor5-utils/src/lib/lodash/sortedLastIndex.js","webpack:///../ckeditor5-utils/src/lib/lodash/sortedLastIndexBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/sortedLastIndexOf.js","webpack:///../ckeditor5-utils/src/lib/lodash/sortedUniq.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseSortedUniq.js","webpack:///../ckeditor5-utils/src/lib/lodash/sortedUniqBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/tail.js","webpack:///../ckeditor5-utils/src/lib/lodash/take.js","webpack:///../ckeditor5-utils/src/lib/lodash/takeRight.js","webpack:///../ckeditor5-utils/src/lib/lodash/takeRightWhile.js","webpack:///../ckeditor5-utils/src/lib/lodash/takeWhile.js","webpack:///../ckeditor5-utils/src/lib/lodash/union.js","webpack:///../ckeditor5-utils/src/lib/lodash/unionBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/unionWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/uniq.js","webpack:///../ckeditor5-utils/src/lib/lodash/uniqBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/uniqWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/without.js","webpack:///../ckeditor5-utils/src/lib/lodash/xor.js","webpack:///../ckeditor5-utils/src/lib/lodash/xorBy.js","webpack:///../ckeditor5-utils/src/lib/lodash/xorWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/zip.js","webpack:///../ckeditor5-utils/src/lib/lodash/zipObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseZipObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/zipObjectDeep.js","webpack:///../ckeditor5-utils/src/lib/lodash/zipWith.js","webpack:///../ckeditor5-engine/src/model/documentselection.js","webpack:///../ckeditor5-utils/src/diff.js","webpack:///../ckeditor5-utils/src/dom/getancestors.js","webpack:///../ckeditor5-engine/src/view/rooteditableelement.js","webpack:///../ckeditor5-engine/src/view/observer/mutationobserver.js","webpack:///../ckeditor5-utils/src/lib/lodash/debounce.js","webpack:///../ckeditor5-utils/src/dom/rect.js","webpack:///../ckeditor5-utils/src/lib/lodash/isElement.js","webpack:///../ckeditor5-utils/src/dom/getborderwidths.js","webpack:///../ckeditor5-engine/src/conversion/model-selection-to-view-converters.js","webpack:///../ckeditor5-engine/src/dataprocessor/htmldataprocessor.js","webpack:///../ckeditor5-utils/src/dom/tounit.js","webpack:///../ckeditor5-ui/src/toolbar/toolbarview.js","webpack:///../ckeditor5-typing/src/changebuffer.js","webpack:///../ckeditor5-undo/src/basecommand.js","webpack:///../ckeditor5-basic-styles/src/attributecommand.js","webpack:///../ckeditor5-image/src/image.js","webpack:///../ckeditor5-image/src/image/imageengine.js","webpack:///../ckeditor5-ui/src/bindings/clickoutsidehandler.js","webpack:///../ckeditor5-ui/src/labeledinput/labeledinputview.js","webpack:///../ckeditor5-ui/src/inputtext/inputtextview.js","webpack:///../ckeditor5-ui/src/bindings/submithandler.js","webpack:///../ckeditor5-ui/src/panel/balloon/balloonpanelview.js","webpack:///../ckeditor5-image/src/image/ui/utils.js","webpack:///../ckeditor5-upload/src/imageupload.js","webpack:///../ckeditor5-upload/src/imageuploadengine.js","webpack:///../ckeditor5-upload/src/utils.js","webpack:///../ckeditor5-link/src/linkelement.js","webpack:///../ckeditor5-link/src/findlinkrange.js","webpack:///./src/ckeditor.js","webpack:///../ckeditor5-editor-classic/src/classiceditor.js","webpack:///../ckeditor5-core/src/editor/standardeditor.js","webpack:///../ckeditor5-core/src/editor/editor.js","webpack:///../ckeditor5-utils/src/config.js","webpack:///../ckeditor5-core/src/plugincollection.js","webpack:///../ckeditor5-core/src/commandcollection.js","webpack:///../ckeditor5-utils/src/locale.js","webpack:///../ckeditor5-utils/src/translation-service.js","webpack:///../ckeditor5-engine/src/controller/datacontroller.js","webpack:///../ckeditor5-utils/src/eventinfo.js","webpack:///../ckeditor5-utils/src/spy.js","webpack:///../ckeditor5-utils/src/priorities.js","webpack:///../ckeditor5-utils/src/lib/lodash/assignIn.js","webpack:///../ckeditor5-utils/src/lib/lodash/_createAssigner.js","webpack:///../ckeditor5-utils/src/lib/lodash/_getLength.js","webpack:///../ckeditor5-utils/src/lib/lodash/toFinite.js","webpack:///../ckeditor5-utils/src/lib/lodash/keysIn.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseKeysIn.js","webpack:///../ckeditor5-utils/src/lib/lodash/_Reflect.js","webpack:///(webpack)/buildin/global.js","webpack:///../ckeditor5-utils/src/lib/lodash/_checkGlobal.js","webpack:///../ckeditor5-utils/src/lib/lodash/_iteratorToArray.js","webpack:///../ckeditor5-utils/src/lib/lodash/_listCacheClear.js","webpack:///../ckeditor5-utils/src/lib/lodash/_listCacheDelete.js","webpack:///../ckeditor5-utils/src/lib/lodash/_listCacheGet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_listCacheHas.js","webpack:///../ckeditor5-utils/src/lib/lodash/_listCacheSet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_stackClear.js","webpack:///../ckeditor5-utils/src/lib/lodash/_stackDelete.js","webpack:///../ckeditor5-utils/src/lib/lodash/_stackGet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_stackHas.js","webpack:///../ckeditor5-utils/src/lib/lodash/_stackSet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_mapCacheClear.js","webpack:///../ckeditor5-utils/src/lib/lodash/_Hash.js","webpack:///../ckeditor5-utils/src/lib/lodash/_hashClear.js","webpack:///../ckeditor5-utils/src/lib/lodash/_hashDelete.js","webpack:///../ckeditor5-utils/src/lib/lodash/_hashGet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_hashHas.js","webpack:///../ckeditor5-utils/src/lib/lodash/_hashSet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_mapCacheDelete.js","webpack:///../ckeditor5-utils/src/lib/lodash/_isKeyable.js","webpack:///../ckeditor5-utils/src/lib/lodash/_mapCacheGet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_mapCacheHas.js","webpack:///../ckeditor5-utils/src/lib/lodash/_mapCacheSet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_arrayEach.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseAssign.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseKeys.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cloneBuffer.js","webpack:///../ckeditor5-utils/src/lib/lodash/_copySymbols.js","webpack:///../ckeditor5-utils/src/lib/lodash/_getAllKeys.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseGetAllKeys.js","webpack:///../ckeditor5-utils/src/lib/lodash/_DataView.js","webpack:///../ckeditor5-utils/src/lib/lodash/_Promise.js","webpack:///../ckeditor5-utils/src/lib/lodash/_WeakMap.js","webpack:///../ckeditor5-utils/src/lib/lodash/_initCloneArray.js","webpack:///../ckeditor5-utils/src/lib/lodash/_initCloneByTag.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cloneDataView.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cloneMap.js","webpack:///../ckeditor5-utils/src/lib/lodash/_addMapEntry.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cloneRegExp.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cloneSet.js","webpack:///../ckeditor5-utils/src/lib/lodash/_addSetEntry.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cloneSymbol.js","webpack:///../ckeditor5-utils/src/lib/lodash/_cloneTypedArray.js","webpack:///../ckeditor5-utils/src/lib/lodash/_initCloneObject.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseCreate.js","webpack:///../ckeditor5-utils/src/lib/lodash/isBuffer.js","webpack:///../ckeditor5-utils/src/lib/lodash/constant.js","webpack:///../ckeditor5-engine/src/view/textproxy.js","webpack:///../ckeditor5-engine/src/conversion/modelconsumable.js","webpack:///../ckeditor5-utils/src/env.js","webpack:///../ckeditor5-engine/src/conversion/viewconversiondispatcher.js","webpack:///../ckeditor5-engine/src/conversion/viewconsumable.js","webpack:///../ckeditor5-engine/src/conversion/view-to-model-converters.js","webpack:///../ckeditor5-engine/src/controller/insertcontent.js","webpack:///../ckeditor5-engine/src/controller/deletecontent.js","webpack:///../ckeditor5-engine/src/controller/modifyselection.js","webpack:///../ckeditor5-engine/src/controller/getselectedcontent.js","webpack:///../ckeditor5-engine/src/model/document.js","webpack:///../ckeditor5-engine/src/model/delta/basic-deltas.js","webpack:///../ckeditor5-engine/src/model/operation/operationfactory.js","webpack:///../ckeditor5-utils/src/lib/lodash/isEqual.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseIsEqualDeep.js","webpack:///../ckeditor5-utils/src/lib/lodash/_setCacheAdd.js","webpack:///../ckeditor5-utils/src/lib/lodash/_setCacheHas.js","webpack:///../ckeditor5-utils/src/lib/lodash/_arraySome.js","webpack:///../ckeditor5-utils/src/lib/lodash/_equalByTag.js","webpack:///../ckeditor5-utils/src/lib/lodash/_equalObjects.js","webpack:///../ckeditor5-utils/src/lib/lodash/isTypedArray.js","webpack:///../ckeditor5-engine/src/model/delta/basic-transformations.js","webpack:///../ckeditor5-engine/src/model/operation/transform.js","webpack:///../ckeditor5-utils/src/lib/lodash/array.js","webpack:///../ckeditor5-utils/src/lib/lodash/_isFlattenable.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseMatches.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseIsMatch.js","webpack:///../ckeditor5-utils/src/lib/lodash/_getMatchData.js","webpack:///../ckeditor5-utils/src/lib/lodash/toPairs.js","webpack:///../ckeditor5-utils/src/lib/lodash/_createToPairs.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseToPairs.js","webpack:///../ckeditor5-utils/src/lib/lodash/_setToPairs.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseMatchesProperty.js","webpack:///../ckeditor5-utils/src/lib/lodash/_stringToPath.js","webpack:///../ckeditor5-utils/src/lib/lodash/memoize.js","webpack:///../ckeditor5-utils/src/lib/lodash/toString.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseToString.js","webpack:///../ckeditor5-utils/src/lib/lodash/hasIn.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseHasIn.js","webpack:///../ckeditor5-utils/src/lib/lodash/_hasPath.js","webpack:///../ckeditor5-utils/src/lib/lodash/property.js","webpack:///../ckeditor5-utils/src/lib/lodash/_basePropertyDeep.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseFill.js","webpack:///../ckeditor5-utils/src/lib/lodash/toLength.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseClamp.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseNth.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseIndexOfWith.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseAt.js","webpack:///../ckeditor5-utils/src/lib/lodash/_parent.js","webpack:///../ckeditor5-utils/src/lib/lodash/_compareAscending.js","webpack:///../ckeditor5-utils/src/lib/lodash/_createSet.js","webpack:///../ckeditor5-utils/src/lib/lodash/noop.js","webpack:///../ckeditor5-utils/src/lib/lodash/_baseSet.js","webpack:///../ckeditor5-utils/src/lib/lodash/array.default.js","webpack:///../ckeditor5-engine/src/model/delta/markerdelta.js","webpack:///../ckeditor5-engine/src/model/rootelement.js","webpack:///../ckeditor5-engine/src/model/history.js","webpack:///../ckeditor5-utils/src/mapsequal.js","webpack:///../ckeditor5-engine/src/model/schema.js","webpack:///../ckeditor5-engine/src/model/markercollection.js","webpack:///../ckeditor5-core/src/editingkeystrokehandler.js","webpack:///../ckeditor5-engine/src/controller/editingcontroller.js","webpack:///../ckeditor5-engine/src/view/document.js","webpack:///../ckeditor5-engine/src/view/renderer.js","webpack:///../ckeditor5-utils/src/dom/insertat.js","webpack:///../ckeditor5-utils/src/dom/remove.js","webpack:///../ckeditor5-utils/src/dom/indexof.js","webpack:///../ckeditor5-utils/src/dom/getcommonancestor.js","webpack:///../ckeditor5-utils/src/lib/lodash/isEqualWith.js","webpack:///../ckeditor5-engine/src/view/observer/selectionobserver.js","webpack:///../ckeditor5-utils/src/lib/lodash/now.js","webpack:///../ckeditor5-engine/src/view/observer/focusobserver.js","webpack:///../ckeditor5-engine/src/view/observer/keyobserver.js","webpack:///../ckeditor5-engine/src/view/observer/fakeselectionobserver.js","webpack:///../ckeditor5-utils/src/dom/scroll.js","webpack:///../ckeditor5-utils/src/dom/iswindow.js","webpack:///../ckeditor5-engine/src/conversion/view-selection-to-model-converters.js","webpack:///../ckeditor5-utils/src/dom/getdatafromelement.js","webpack:///../ckeditor5-utils/src/dom/setdatainelement.js","webpack:///../ckeditor5-engine/src/dataprocessor/basichtmlwriter.js","webpack:///../ckeditor5-editor-classic/src/classiceditorui.js","webpack:///../ckeditor5-ui/src/componentfactory.js","webpack:///../ckeditor5-ui/src/toolbar/enabletoolbarkeyboardfocus.js","webpack:///../ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js","webpack:///../ckeditor5-editor-classic/src/classiceditoruiview.js","webpack:///../ckeditor5-ui/src/editorui/boxed/boxededitoruiview.js","webpack:///../ckeditor5-ui/src/editorui/editoruiview.js","webpack:///../ckeditor5-utils/src/lib/lodash/cloneDeepWith.js","webpack:///../ckeditor5-ui/src/editableui/inline/inlineeditableuiview.js","webpack:///../ckeditor5-ui/src/editableui/editableuiview.js","webpack:///../ckeditor5-ui/src/panel/sticky/stickypanelview.js","webpack:///../ckeditor5-ui/src/toolbar/toolbarseparatorview.js","webpack:///../ckeditor5-ui/src/bindings/preventdefault.js","webpack:///../ckeditor5-utils/src/elementreplacer.js","webpack:///../ckeditor5-editor-classic/theme/theme.scss?651f","webpack:///../ckeditor5-editor-classic/theme/theme.scss","webpack:////workspace/ckeditor5/node_modules/style-loader/lib/urls.js","webpack:///../ckeditor5-essentials/src/essentials.js","webpack:///../ckeditor5-clipboard/src/clipboard.js","webpack:///../ckeditor5-clipboard/src/clipboardobserver.js","webpack:///../ckeditor5-clipboard/src/datatransfer.js","webpack:///../ckeditor5-clipboard/src/utils/plaintexttohtml.js","webpack:///../ckeditor5-clipboard/src/utils/normalizeclipboarddata.js","webpack:///../ckeditor5-clipboard/src/utils/viewtoplaintext.js","webpack:///../ckeditor5-enter/src/enter.js","webpack:///../ckeditor5-enter/src/entercommand.js","webpack:///../ckeditor5-enter/src/enterobserver.js","webpack:///../ckeditor5-typing/src/typing.js","webpack:///../ckeditor5-typing/src/input.js","webpack:///../ckeditor5-utils/src/difftochanges.js","webpack:///../ckeditor5-typing/src/inputcommand.js","webpack:///../ckeditor5-typing/src/delete.js","webpack:///../ckeditor5-typing/src/deletecommand.js","webpack:///../ckeditor5-typing/src/deleteobserver.js","webpack:///../ckeditor5-undo/src/undo.js","webpack:///../ckeditor5-undo/src/undoengine.js","webpack:///../ckeditor5-undo/src/undocommand.js","webpack:///../ckeditor5-undo/src/redocommand.js","webpack:///../ckeditor5-ui/src/icon/iconview.js","webpack:///../ckeditor5-ui/src/tooltip/tooltipview.js","webpack:///../ckeditor5-undo/theme/icons/undo.svg","webpack:///../ckeditor5-undo/theme/icons/redo.svg","webpack:///../ckeditor5-adapter-ckfinder/src/uploadadapter.js","webpack:///../ckeditor5-upload/src/filereader.js","webpack:///../ckeditor5-adapter-ckfinder/src/utils.js","webpack:///../ckeditor5-autoformat/src/autoformat.js","webpack:///../ckeditor5-autoformat/src/blockautoformatengine.js","webpack:///../ckeditor5-autoformat/src/inlineautoformatengine.js","webpack:///../ckeditor5-basic-styles/src/bold.js","webpack:///../ckeditor5-basic-styles/src/boldengine.js","webpack:///../ckeditor5-basic-styles/theme/icons/bold.svg","webpack:///../ckeditor5-basic-styles/src/italic.js","webpack:///../ckeditor5-basic-styles/src/italicengine.js","webpack:///../ckeditor5-basic-styles/theme/icons/italic.svg","webpack:///../ckeditor5-block-quote/src/blockquote.js","webpack:///../ckeditor5-block-quote/src/blockquoteengine.js","webpack:///../ckeditor5-block-quote/src/blockquotecommand.js","webpack:///../ckeditor5-core/theme/icons/quote.svg","webpack:///../ckeditor5-block-quote/theme/theme.scss?df4a","webpack:///../ckeditor5-block-quote/theme/theme.scss","webpack:///../ckeditor5-easy-image/src/easyimage.js","webpack:///../ckeditor5-easy-image/src/cloudservicesuploadadapter.js","webpack:////workspace/ckeditor5/node_modules/@ckeditor/ckeditor-cloudservices-core/src/uploadgateway/uploadgateway.js","webpack:////workspace/ckeditor5/node_modules/@ckeditor/ckeditor-cloudservices-core/src/uploadgateway/fileuploader.js","webpack:///../ckeditor5-image/src/image/converters.js","webpack:///../ckeditor5-widget/src/highlightstack.js","webpack:///../ckeditor5-widget/src/widget.js","webpack:///../ckeditor5-engine/src/view/observer/mouseobserver.js","webpack:///../ckeditor5-widget/theme/theme.scss?451e","webpack:///../ckeditor5-widget/theme/theme.scss","webpack:///../ckeditor5-image/src/imagetextalternative.js","webpack:///../ckeditor5-image/src/imagetextalternative/imagetextalternativeengine.js","webpack:///../ckeditor5-image/src/imagetextalternative/imagetextalternativecommand.js","webpack:///../ckeditor5-image/src/imagetextalternative/ui/textalternativeformview.js","webpack:///../ckeditor5-ui/src/label/labelview.js","webpack:///../ckeditor5-utils/src/dom/position.js","webpack:///../ckeditor5-utils/src/dom/getpositionedancestor.js","webpack:///../ckeditor5-core/theme/icons/low-vision.svg","webpack:///../ckeditor5-image/theme/imagetextalternative/theme.scss?8aba","webpack:///../ckeditor5-image/theme/imagetextalternative/theme.scss","webpack:///../ckeditor5-image/theme/theme.scss?490e","webpack:///../ckeditor5-image/theme/theme.scss","webpack:///../ckeditor5-upload/src/imageuploadbutton.js","webpack:///../ckeditor5-upload/src/imageuploadcommand.js","webpack:///../ckeditor5-ui/src/notification/notification.js","webpack:///../ckeditor5-upload/src/ui/filedialogbuttonview.js","webpack:///../ckeditor5-core/theme/icons/image.svg","webpack:///../ckeditor5-upload/src/imageuploadprogress.js","webpack:///../ckeditor5-upload/theme/icons/image_placeholder.svg","webpack:///../ckeditor5-upload/theme/imageuploadprogress.scss?ba59","webpack:///../ckeditor5-upload/theme/imageuploadprogress.scss","webpack:///../ckeditor5-heading/src/heading.js","webpack:///../ckeditor5-paragraph/src/paragraphcommand.js","webpack:///../ckeditor5-heading/src/headingengine.js","webpack:///../ckeditor5-heading/src/headingcommand.js","webpack:///../ckeditor5-ui/src/model.js","webpack:///../ckeditor5-ui/src/dropdown/list/createlistdropdown.js","webpack:///../ckeditor5-ui/src/list/listview.js","webpack:///../ckeditor5-ui/src/list/listitemview.js","webpack:///../ckeditor5-ui/src/dropdown/createdropdown.js","webpack:///../ckeditor5-ui/src/dropdown/dropdownview.js","webpack:///../ckeditor5-ui/src/dropdown/dropdownpanelview.js","webpack:///../ckeditor5-heading/theme/theme.scss?f3a2","webpack:///../ckeditor5-heading/theme/theme.scss","webpack:///../ckeditor5-image/src/imagecaption.js","webpack:///../ckeditor5-image/src/imagecaption/imagecaptionengine.js","webpack:///../ckeditor5-image/src/imagecaption/utils.js","webpack:///../ckeditor5-engine/src/view/placeholder.js","webpack:///../ckeditor5-engine/theme/placeholder.scss?9710","webpack:///../ckeditor5-engine/theme/placeholder.scss","webpack:///../ckeditor5-image/theme/imagecaption/theme.scss?3012","webpack:///../ckeditor5-image/theme/imagecaption/theme.scss","webpack:///../ckeditor5-image/src/imagestyle.js","webpack:///../ckeditor5-image/src/imagestyle/imagestyleengine.js","webpack:///../ckeditor5-image/src/imagestyle/imagestylecommand.js","webpack:///../ckeditor5-image/src/imagestyle/converters.js","webpack:///../ckeditor5-core/theme/icons/object-full-width.svg","webpack:///../ckeditor5-core/theme/icons/object-left.svg","webpack:///../ckeditor5-core/theme/icons/object-center.svg","webpack:///../ckeditor5-core/theme/icons/object-right.svg","webpack:///../ckeditor5-image/src/imagetoolbar.js","webpack:///../ckeditor5-link/src/link.js","webpack:///../ckeditor5-engine/src/view/observer/clickobserver.js","webpack:///../ckeditor5-link/src/linkengine.js","webpack:///../ckeditor5-link/src/linkcommand.js","webpack:///../ckeditor5-link/src/unlinkcommand.js","webpack:///../ckeditor5-link/src/ui/linkformview.js","webpack:///../ckeditor5-link/theme/icons/link.svg","webpack:///../ckeditor5-link/theme/theme.scss?9387","webpack:///../ckeditor5-link/theme/theme.scss","webpack:///../ckeditor5-list/src/list.js","webpack:///../ckeditor5-list/src/listengine.js","webpack:///../ckeditor5-list/src/listcommand.js","webpack:///../ckeditor5-list/src/indentcommand.js","webpack:///../ckeditor5-list/src/converters.js","webpack:///../ckeditor5-list/src/viewlistitemelement.js","webpack:///../ckeditor5-list/theme/icons/numberedlist.svg","webpack:///../ckeditor5-list/theme/icons/bulletedlist.svg"],"names":[],"mappings":";;;;AAAA,cACA,2BACA,uCACA,sCACA,IACA,aACA,+CAEA,oBACA,GAAC,gCC6hBD,sCCrgBA,eFvBA,kBGTA,cAMA,IACA,iBAGA,mBACA,CACA,IACA,KAIA,2CAGA,aAGA,OACA,OAIA,IAzBA,eA4BA,MAGA,uBACA,GACA,kCACA,CACA,gBACA,cAGA,OAGA,iBACA,YACA,qBAA2B,UAA0B,UACrD,YAAiC,CAAe,QAChD,EAEA,aADA,QAIA,mBAAsD,wCAA+D,SAGrH,MAGA,8BC7DA,aA6EA,aACA,iBAMA,wBAAiC,gBAAuB,QACxD,QA1EA,MACA,KACA,GAWA,sGACA,qBAaA,iBACA,GAGA,qBAGA,cAKA,mBAOA,qBACA,MAQA,0BACA,OACA,eACA,EAOA,oEC5EA,OAoCA,IACA,OAOA,iBACA,4BAQA,kCAGA,iFAOA,mHAAsH,CAItH,uBACA,cASA,UA+BA,YACA,MAQA,aACA,yBACA,KAKA,cACA,4BACA,IAcA,aACA,YAEA,eAAkB,qBAA0B,EAC5C,sCAGA,UACA,QAUA,YACA,uCACA,OASA,eACA,mCAEA,4DACA,IAQA,gBACA,8DACA,IAQA,iBACA,gEACA,IAQA,gBACA,OACA,gBAQA,cACA,iCACA,SAQA,eACA,iBACA,WAGA,4CAGA,YACA,WAEA,OACA,aAEA,SACA,gBAGA,uBACA,QAEA,SAGA,OAuBA,2BAA4C,KAC5C,iBAEA,gBACA,iBAEA,UACA,QAUA,gBACA,2BACA,EAOA,eACA,uBACA,0BAEA,iCAAqC,CAErC,gBASA,iBACA,iBACA,KAIA,yCAEA,qDAEA,iCACA,IASA,qBACA,cACA,mBAEA,qBAEA,mBACA,MAGA,yBACA,EASA,gBACA,8BAEA,UACA,SAGA,oBADA,KAWA,WACA,OACA,4BAiCA,YACA,OACA,6BAQA,WACA,OACA,2BAYA,cACA,OACA,OACA,kBAEA,eACA,cACA,OAEA,aACA,gCACA,UACA,sBAEA,UACA,YACA,6CACA,MAEA,MACA,QAIA,sBAEA,oCACA,MACA,WAGA,wCACA,iBACA,UAGA,gCACA,OACA,SACA,QAAI,KACJ,IACA,aAGA,gCACA,EACA,CACA,CAWA,+BACA,8BAGA,sBACA,KAGA,YAEA,qFAEA,oBAEA,aAGA,QAEA,SACG,wEAEH,uBAEA,4BAEA,oBAGA,cAGA,QAEA,UACA,CAEA,CACA,QAaA,kCACA,8BAGA,sBACA,KAGA,YAEA,kGAGA,eAEG,iFAEH,uBAEA,iBAGA,YAEA,WAEA,CACA,QAgBA,iCAEA,YAGA,+BAaA,WAXA,gDAGA,gBAIA,oBAGA,mCA8BA,kBACA,uBAGA,MAKA,sBAOA,wCAHA,8CAEA,KAsBA,qBACA,IACA,2BACG,0BACH,MAEA,QACA,aACI,kBACJ,wBACI,mBACJ,uBAEA,qBAGA,eACA,8BACA,CAQA,sBACA,OAOA,yFAAkG,CAGlG,0DACA,UAQA,uBACA,OAOA,2FAAoG,CAGpG,0DACA,YASA,sCACA,4BAMA,kCAGA,yGAEA,mBAEA,mBACA,OAQA,6BACA,+BACA,QAQA,qBACA,IACA,iDAGA,sBAOA,eACA,KACA,iHAAK,YAIL,wCACA,KACA,EAOA,4CCpxBA,QAiBA,GACA,OAIA,eAOA,MACA,QAKA,UACA,MACA,eACA,QAEA,cAwHA,kDChKA,QAeA,GACA,OASA,sBAOA,gBAQA,+DACA,qBAcA,qBACA,eAA0B,iBAC1B,qBAQA,kBACA,gCACA,IAQA,aACA,qCACA,MAOA,WACA,mBACA,IASA,oBACA,+CACA,IAWA,sBACA,GACA,cAGA,sEACA,6DAEA,WACA,KAOA,gBACA,aAEA,4DACA,UAQA,WACA,wDACA,IAQA,kBACA,uDACA,MAwBA,iBACA,MAEA,MAoBA,YAjBA,2CAGA,kCAGA,gCAGA,8BAIA,gCAGA,QAmBA,mBACA,2BAGA,YACA,aAEA,mCAGA,aAGA,+BAGA,WAGA,KACA,UAGA,OACA,KAyCA,uBACA,MACA,2CAEA,qCACA,mBAGA,0BACA,uBAEA,OACA,uBAGA,yCACA,KACA,aACA,MAGA,2CACA,qCACA,SAEA,OACA,uBAGA,oBACA,qBACA,EAEA,CACA,QAWA,WAAwB,KACxB,qBAEA,QACA,OAiBA,WAAyB,KACzB,cACA,OAEA,+BAEA,iBACA,gBAEA,IAeA,eAA6B,KAC7B,cAEA,gBAEA,gBAEA,kBACA,gBAEA,YAYA,yBACA,4BAGA,YAEA,6DACA,sBACA,gBAAoB,MAAmB,WACvC,cACA,kCACA,OACA,yBACA,4BACA,YAGA,6BAEA,kBACA,CAIA,CACA,QAYA,0BACA,4BAEA,gBACA,kBAAmB,MAAmB,WACtC,cAEA,sCACA,kBACA,CAOA,WAAkB,MAAmB,WACrC,SAEA,iBAAuB,MAAmB,WAC1C,SAEA,gDACA,wBAEA,EACA,CAEA,CACA,QAQA,oBACA,0CACA,IAaA,2CACA,IACA,wBACG,0CACH,WAGA,gCACA,GACA,iBACA,gEACA,MAWA,mCAEA,sBACA,iBAIA,qDAKA,oBAWA,kBACA,yDACA,iCACA,eACA,WACA,oBAEA,iBAEA,2CAEA,0CACA,WAMA,CACA,qDACA,+BACA,mBACA,YACA,oBAOA,8CAEA,iBAGA,uCACA,WAEA,aACA,4BACA,CAqCA,0CACA,YAKA,0BACA,YACA,SACA,QACA,gFAGG,mBACH,2BAEA,yBACA,SAEA,sCACA,8CAEA,kCACA,GACA,CAYA,6BACA,qBACA,oBAEA,0CACA,SAEA,IAEA,qBAEA,wBACA,uBAEA,kBAEA,mBAEA,cACA,iBACA,wCAEG,gCAEH,gBACA,WACA,eAIA,2CAGA,+BAaA,4CAPA,uBACA,6BACA,8BAIA,YAWA,uCACA,MACA,SAEA,4CACA,UAWA,4CACA,WACA,UACA,mCAEA,+BAQA,0BACA,2BACA,IASA,mBACA,iDACA,UAQA,mBACA,8DACA,WAUA,8BACA,aACA,oBAEA,4BACA,WAiBA,2BACA,IAOA,2BACG,sFACH,0CAMA,cAGA,UACA,mCAIA,aAKA,gCAIA,iBAA6B,EAAQ,yBAErC,OADA,wCAUA,mBAA6B,MAAmB,6BAEhD,KADA,sCAQA,KACA,QASA,qBACA,wDACA,OACA,uBC30BA,aA+BA,IACA,gBACA,gBACA,6CACA,uCACA,aAIA,2BACA,gCAEA,sCACA,eACA,EACA,kCCqQA,aAEA,OACA,uBAGA,iBACA,YAIA,WACA,YACA,2BAEA,oCAlUA,QAmBA,IACA,mBASA,mBACA,CAOA,cAQA,yBAGA,4BAEA,IAQA,iBACA,uBACA,MAQA,gBACA,uBACA,SAQA,cACA,OACA,oBAqBA,aAEA,gCAIA,2BAFA,IAUA,YACA,uBACA,UAOA,cACA,8BACA,WAQA,iBACA,uBACA,eAUA,uBACA,uBACA,qBASA,YACA,4DAEA,iCACA,kBAmBA,iBACA,uBACA,gBAOA,kBACA,0BACA,aASA,oBACA,GAEA,cAEA,QACA,mBAGA,kBAGA,oBACA,gBAUA,sBACA,wBAEA,0BACA,iBAGA,KACA,QAaA,iBACA,OAEA,cACA,uBAGA,kBACA,QAOA,SACA,eAEA,wBAEA,6BACA,GAEA,gCACA,4BAEA,SAEA,CACA,QASA,mBACA,OAEA,mBACA,CAEA,sBACA,WAEA,cAGA,wBAGA,YAEA,uBACA,aACA,EAKY,oCCwnBZ,aAYA,gBACA,YAGA,aACA,cACE,WAKF,gBAQY,CACZ,eACA,cAEA,KACA,iBAMA,cAOgG,CAChG,eAAiD,CAAO,QACxD,OAMA,wBACA,iBAEA,cAGA,IACA,OAEA,WAEA,MAOa,CACb,aACA,OACA,OACA,GACA,aAEA,UACA,eACA,EAEA,EASa,CACb,iBACA,OACA,OACA,GACA,qBAEA,UACA,GACA,sBAEA,EAQa,CACb,eACA,OACA,OACA,GACA,UAEA,UACA,YACA,IAEA,EAKa,CACb,aACA,4BAYA,oCACA,MAEA,QAEA,GACA,QAWmD,CACnD,aACA,IACA,qBACE,OACF,MAGA,OACA,0BAGA,aAGA,YACA,GACA,gBAGA,uBAEA,UACA,gBACA,kBAEA,gCACA,eACA,OAEA,aAMA,YACA,UAEA,CACA,QAsBkB,CAClB,aACA,UACA,aACA,kCAGA,QAEA,MAmBoB,CACpB,aACA,UACA,QAGA,OACA,QAWmD,CACnD,aACA,OACA,MAEA,IAgBiD,CACjD,aACA,iBACA,kBAEA,MAiBkB,CAClB,eACA,eACA,cAEA,MAOa,CACb,eACA,OAEE,QAGF,OAAY,IAAU,KAEtB,EAea,CACb,eACA,UACA,QACA,kBAEA,WAGA,IAMiD,CACjD,eACA,MACA,gBACA,eAGA,gCAGA,eACA,oBACA,mBAGA,wCAGA,mBACA,uBA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cAEA,QACA,mBAGA,kBAEA,6BACA,KACA,IAGA,IACA,QASA,mBACA,sCAGA,MACA,cACA,sCASA,YACA,cACA,oCASA,wBACA,SAUA,sBACA,6BAEA,aAAsB,OAAqB,IAC3C,6BAGA,2BACA,WAUA,aACA,MACA,gBAIA,YACA,SAIA,yBACA,KAIA,8EACA,oCACA,KAIA,+BACA,qCACA,WAKA,6BACA,wBACA,OAKA,+BACA,wCACA,WAIA,SACA,QAWA,eACA,+BACA,mCACA,OAWA,kBACA,+BACA,mCACA,UAWA,eACA,UACA,0BACA,OAIA,SACA,QAOA,gBACA,sBACA,MAeA,cACA,kCAEA,qBACA,gBAEA,iBACA,2BAEA,KACA,mBAEA,QASA,YACA,qBACA,MAOA,gBACA,qBACA,MAWA,eACA,UACA,yBACA,OAIA,SACA,QAWA,kBACA,+BACA,kCACA,UAWA,mBACA,iBACA,qBAEA,UACA,MACA,SAGA,aACA,MAEA,OACA,KASA,uBACA,wBACA,QAQA,qBACA,+BACA,MAQA,wBACA,+BACA,SAQA,uBACA,8BACA,SAyBA,cACA,+CACA,yCAAyD,OAAY,QAAS,gBAC9E,wCAA4D,OAAa,SAAS,iBAElF,iBACA,eAAqC,YACrC,eAAoC,YACpC,eAAiC,KACjC,GAQA,EAMkB,oCCjrBlB,aACA,IAEA,MACA,uBAaA,wBACA,qBACA,uBAGA,iBAhBA,eAOA,2DAAwE,CAGxE,QAOA,QAmBA,CAyEA,aACA,gBACA,WA8BA,WAxGA,WACA,OACA,uBAGA,MACA,8BACA,0BACA,EAQA,MACA,WACA,SAEA,gBACA,KACA,2CAKA,eA3GA,OAyBA,KACA,QAmFA,UACA,SACA,WACA,WACA,cACA,aACA,aACA,SACA,SACA,SACA,OACA,OAIA,OAGA,YACA,cACA,YAIA,mBAAqB,GAAY,UACjC,gBAEA,oBACA,gBAGA,WAAqB,GAAY,MACjC,QAIA,gBAAsB,IAAa,OACnC,aAGA,QACA,SA5HA,GAUA,yECpCA,QAqBA,IACA,mBAWA,qBACA,CAOA,iCAOA,2BAOA,kCAUA,2BACA,WAKA,WACA,OACA,MAOA,QACA,wFACA,aAGA,uBADA,UAiBA,qBACA,+EACA,QAOA,cACA,iFAEA,0FACA,GAGA,uBADA,UAMA,WACA,6BACA,6BACA,6BACA,6BAKA,cAMA,YACA,KAEG,4GAMH,mBACA,KAEG,iHAMH,iBACA,KAEG,wJACH,qGACA,yCAEA,wEAMA,iBACA,KAGA,sGAGA,wFAEA,sBACA,qBACA,eAEA,QAKA,uBACA,OACA,sCASA,qBACA,wBACA,mCAEA,6CAEA,aAKA,SAJA,aAGA,cAEA,uBCzMA,iBACA,aACA,YACA,MACA,SAEA,SACA,cAEA,UACA,QAEA,cChBA,CA6CA,eACA,aACA,OACA,MACA,GAGA,uCACA,OACA,gCACA,uCACA,KAEA,wCACA,KAEA,gBACA,KAEA,CACA,aAEA,6CACA,8BAEA,kEACA,MAtEA,qBACA,IAGA,MAsCA,4BArCA,4BACA,OACA,gBACA,kBAAmC,MAInC,KAAG,QACH,GAGA,mBACA,CACA,gCACA,aACA,QAAgB,WAAiB,OACjC,cACA,GACA,qBAEA,eAAY,MAAoB,WAChC,OAKA,gCACA,YACA,KAEA,mCAEA,OAEA,QACA,CACA,qBC3CA,CA6FA,eACA,WAAgB,MAAmB,WACnC,OACA,WAEA,SACA,GAEA,iBAAiB,YAA2B,OAC5C,iBAGA,UAAQ,eAAuB,OAC/B,qBAEA,YAAG,KACH,QAEA,QAAiB,YAAuB,OACxC,eAGA,sBAA2B,eAC3B,QACA,CACA,EAEA,eACA,QACA,MAEA,OAAgB,MAAiB,WACjC,OACA,4BACA,OACA,OACA,OACA,MAAc,cAEd,6BAEA,qBAFkD,WAClD,KAGA,CACA,SAEA,eACA,WAEA,eACA,mBAGA,mIAEA,MAEA,uBAEA,+BAEA,eAEA,kCALG,cAMD,gBACF,wBAEA,oCAEA,4EAEA,aACA,wBACA,sBAEA,uBACA,WACA,iBAEA,GAEA,aACA,8BAEA,SAMA,oBAJA,iBACA,OAEA,SAGA,aACA,8BAEA,QAOA,oBANA,uBAEA,mBACA,OAEA,SAGA,eACA,mCACA,kBACA,KACA,GAEA,eACA,WAGA,oBACA,IAKA,mBAHA,SAOA,4BAEA,CAIA,iBACA,OAEA,YAEA,eACA,sBAEA,YACA,QACA,WACA,wBACA,wCACA,wCACA,yBAEA,2BACA,cACA,sBACA,CAEA,mCACA,KAEA,MACA,cACA,oBACA,CACA,IAGA,SAEA,iBACA,MACA,CACA,aACA,iBACA,uBAEA,UAGA,SACA,IACA,KAEA,IACA,EAYA,mBACA,cAEA,SACA,gCACE,WACF,gBACA,sBAEA,+BAEA,QACA,wBAEA,QAEA,cACA,EAEA,eACA,SACA,QAGA,2BAGA,aACA,wBACE,cACF,QACA,4BAGA,mCACA,kBACA,EAEA,iBACA,SACA,QAQA,cAEA,qCACA,8BAKA,aAAuD,6GAGvD,0BAA6B,MAE7B,iBAEA,gBAEA,0BACA,mBA3VA,GAEA,mBACA,IAEA,oBACA,CAEA,6CADA,aAEA,CAEA,YAMA,gDACA,IAEA,gBACA,IAEA,wBACA,OACA,uCAGA,SACA,IACA,CAAC,aACD,iBACA,gBAEA,KACA,OACA,EAEA,cAEA,uBACA,+BACA,iDAGA,kEAEA,yCAIA,mCAGA,iCAGA,gCAEA,gBAEA,aAEA,mBACA,QAEA,QAAiB,MAAmB,WACpC,OACA,WAEA,MACA,SACA,OAEA,MACA,OACA,OACA,MAEA,WAAiB,QAAsB,OACvC,SAEA,gBACA,WAAmB,YAA2B,aAE9C,sBACA,GAEA,CACA,GAsLA,gBACA,IAEA,0BACA,OAEA,+BACA,KACA,CAAC,yDCzRD,KAMA,iEACA,SAIA,oCAKA,sCAGA,qDAGA,sCAGA,sCAQA,QACA,aACA,2BAEA,iECxCA,aAcA,IACA,WACA,sBACA,6BCjBA,qBAeA,IACA,mBAMA,eACA,CAUA,aACA,OAOA,QACA,mBACA,KAKA,MACA,OACA,SAOA,WACA,aACA,KAEA,YACA,yBAEA,WACA,OASA,aACA,UAIA,0CACA,KACA,sCCvCA,aACA,wCACA,OAOA,KA5BA,aACA,UAEA,sCAAgC,CAEhC,gBACA,oBACA,oBAEA,gBAAsB,IAAa,KACnC,IACA,GAOA,MAWA,WACA,WAEA,iCACA,KAQA,MACA,WACA,0BACA,yBAnEA,SAUA,GAEA,eAUA,0BCtBA,aACA,MAYA,uBACA,aACA,UACA,QAZA,oBAaA,2BACA,wBACA,GAEA,gCCubA,aACA,iDAKA,qBAldA,QAcA,IACA,OASA,sBAMA,gBAOA,+DACA,qBAaA,qBACA,eAA0B,iBAC1B,qBAOA,kBACA,gCACA,IAQA,aACA,qCACA,MAOA,WACA,mBACA,IAkBA,cACA,4CAAoE,WACpE,wBAGA,yDACA,iCAGA,gCACA,8BAGA,SACA,UAkBA,aACA,kBAEA,kEACA,WAGA,qDAAgE,WAChE,uBACA,cAGA,0BACA,sBAGA,YACA,6BAGA,SACA,UAQA,WACA,iEACA,IASA,oBACA,+CACA,IAYA,sBACA,GACA,cAGA,sEACA,6DAEA,WACA,KA8BA,iBACA,MAEA,MAoBA,YAjBA,2CAGA,kCAGA,gCAGA,8BAIA,gCAGA,QAwBA,mBACA,2BAGA,YACA,aAEA,mCAGA,aAGA,+BAGA,WAGA,KACA,UAGA,OACA,KAWA,WAAwB,KACxB,qBAEA,QACA,OAQA,oBACA,0CACA,IAgBA,WAAyB,KACzB,cACA,OAEA,+BAEA,iBACA,gBAEA,IAeA,eAA6B,KAC7B,cAEA,gBAEA,gBAEA,kBACA,gBAEA,YAQA,kBACA,uDACA,MAWA,4CACA,WACA,SACA,aAEA,UAQA,0BACA,2BACA,IAUA,uCACA,MACA,SAEA,4CACA,UASA,mBACA,iDACA,WAQA,mBACA,4DACA,EAUA,8BACA,aACA,oBAEA,4BACA,WACA,EAEA,oCCrJA,aAEA,OACA,uBAGA,iBACA,YAIA,WACA,YACA,2BAEA,mCArUA,QAqBA,IACA,OAOA,eAQA,iBAQA,uBAGA,4BAEA,IAOA,oBACA,aACA,aAQA,iBACA,uBACA,MAQA,gBACA,uBACA,SAQA,cACA,OACA,oBAQA,WACA,OACA,KAQA,aACA,OACA,KAUA,MACA,OACA,qBAQA,YACA,uBACA,UAOA,cACA,8BACA,WAQA,iBACA,uBACA,eAUA,uBACA,uBACA,qBAOA,UACA,CACA,QAaA,iBACA,OAEA,cACA,uBAGA,kBACA,QAqBA,iBACA,uBACA,gBAOA,kBACA,0BACA,aASA,oBACA,GAEA,cAEA,QACA,mBAGA,kBAGA,oBACA,gBAUA,sBACA,wBAEA,0BACA,iBAGA,KACA,QAQA,SACA,MAEA,0BACA,mBAGA,UACA,QASA,mBACA,MAEA,eACA,UAEA,gBAGA,wBAIA,mBACA,SACA,EAKY,uBCrTZ,qBAeA,IACA,OAKA,eASA,MA8CA,aAQA,SACA,qBAEA,SAMA,sCAHA,mBAEA,OAQA,uBACA,OACA,kCASA,mBACA,mBACA,YACA,8CClHA,QAcA,IACA,mBAIA,WACA,OACA,QAOA,cACA,iFAEA,kFACA,EAKA,uBACA,OACA,wCACA,uBChCA,iBACA,eACA,QACA,MAEA,OACA,eAEA,OACA,QACA,MAEA,oBACA,OAEA,YACA,SACA,cAEA,KACA,QAEA,gCC8dA,mBACA,mBACA,UACA,QAGA,WACA,MAEA,sBACA,6BAEA,aACA,cACA,QACA,sBAGA,kBACA,iCAEA,MAMA,KACA,UACA,OACA,+CA1hBA,OAoFA,IACA,OAIA,cAOA,MAQA,qBACA,QASA,UACA,aAEA,eACA,IAWA,eACA,kBAAqB,CACrB,QAYA,wBACA,MAEA,mBACA,YAEA,UACA,eAGA,2BAEA,+BACA,CACA,UACA,oBACA,KAGA,iBACA,IAgBA,QACA,oBACA,YAGA,yBACA,CACA,UACA,oBAGA,OACA,IA+BA,aACA,sCACA,YAEA,UACA,IAwBA,gBACA,sCACA,YAEA,WACA,IAgBA,aACA,8BACA,kBAGA,8BAGA,OAKA,sBAEA,6CAGA,WACA,GAIA,8BAEA,uCAAwC,mCACxC,UAIA,4CACA,OAKA,mBAGA,oCACA,4BACA,WAGA,sBAGA,QAGA,SACA,KACA,CACA,CAEA,EACA,SAmBA,iBACA,8BACA,kBAGA,8BAGA,OAKA,sBAEA,oCACA,OAKA,WACA,sCAIA,eAEA,oBACA,aAOA,CACA,uCAKA,6BAXA,OACA,GAGA,WAUA,cACA,KACA,CACA,CAEA,EACA,MAmCA,YACA,8BACA,gBAGA,8BAGA,UACA,GAGA,UAGA,oBACA,cAGA,yBAAkD,kCAIlD,kCACA,sDACA,KAKA,6FAEA,0CAIA,UAGA,SAEA,MACA,CAEA,EACA,SASA,kBAEA,2BAGA,mBACA,kCACA,YAEA,6B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,SAEA,WAIA,wCCzCA,SACA,aACA,OACA,mBACA,gBAEA,gDCXA,MACA,qDASA,YACA,aACA,WACA,QAEA,eACA,yCACA,8BAGA,uBACA,sBACA,UAEA,wCCzBA,QASA,WACA,+BACA,QAEA,iBACA,0BANA,GAOA,MAEA,gCCwvBA,eACA,UAIA,WAIA,yDACA,OAGA,CACA,eACA,+BAAkD,gBAClD,+BAIA,QAGA,wBADA,qEAlyBA,SAuBA,IACA,OAQA,iBAOA,MAQA,2BAQA,0BAGA,aAEA,cAcA,aACA,0BACA,0CAEA,0CACA,KAEA,OACA,KAWA,YACA,0BACA,0CAEA,4CACA,GAEA,OACA,KASA,kBACA,sBAEA,eACA,wBAIA,WAOA,iBACA,qBACA,MAQA,iBACA,+BACA,kBASA,WACA,uBACA,WACG,YACH,oBAGA,kEACA,OAGA,qCACA,IAEA,uBACA,wBACA,CACA,KACA,KAGA,IACA,GAEA,QAEA,CACA,QAOA,aACA,qBACA,kBAEA,kBAYA,gBACA,OAEA,yBACA,gCACA,UAIA,qCACA,IAYA,eACA,OAEA,yBACA,6BACA,QAIA,qCACA,IAWA,mBACA,cAEA,yDACA,IAWA,kBACA,cAEA,sDACA,IAkBA,iBACA,MACA,uCAEA,4BAA8B,CAC9B,iBAOA,kBACA,CACA,6BACA,4CAA+B,CAE/B,kBAaA,kBACA,SAGA,4BACA,kBACA,oBAGA,wHACA,QAEA,WAGA,8BAIA,gBAEA,4BACA,aAGA,uCAEA,4BAA8B,CAC9B,kBAUA,SACA,CACA,8CACG,wBACH,oBACG,YAEH,aAGA,gCAEA,SAOA,SACA,qBACA,aAOA,SACA,qBACA,aAYA,oBACA,aACA,mBAEA,yBACA,IASA,kBACA,cAEA,mBACA,6BAEA,WASA,gBACA,cAEA,kBACA,6BAEA,WAYA,iBACA,IAMA,4BACA,KAIA,sHAEA,iBAIA,gDAEA,oBACA,aAGA,YACA,4CAEA,+BAEA,WAQA,gBACA,oBACA,MAUA,gBACA,oBACA,SAOA,mBACA,oBACA,MAQA,gBACA,oBACA,MAUA,kBACA,uBACA,gCACA,oBAEA,qCAAmC,iBACnC,iBACA,CA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ACA,sBAA+D,CAE/D,oBACA,yBAIA,aAAS,CAAM,+BAEf,mDACA,mBACA,CA4BA,MACA,WACA,kBACA,qBACA,OACA,cAEA,4BACA,GAGA,gCACA,OAGA,oCAKA,0DACA,aACA,+BACA,WAEA,KACA,SACA,CAuBA,MACA,WACA,kBACA,qBACA,OACA,cAEA,yBAIA,2BAIA,uCAEA,WACA,YACA,CAQA,MACA,UACA,kBACA,sBACA,UAQA,uCACA,gBAEA,eAOA,uDAEA,4CACA,8BAGA,0BACG,eAGH,oBACA,iBACA,SAGA,cAeA,cACA,kEAEA,KACA,CASA,MACA,WACA,kBACA,SACA,qBAGA,eAEA,4CAIA,4BAIA,SACA,YAGA,oBACA,8BAEA,OACA,sCAEA,cAEA,YACA,CAiBA,MACA,WACA,kBACA,SACA,qBAGA,eAEA,4CAIA,4BAIA,SACA,sBAGA,MACA,YAGA,6BACA,mBACA,qDAEA,+CAEA,oBAGA,yBACA,+BAGA,QACA,yBACA,EACA,CASA,MACA,WACA,kBACA,OAEA,iBACA,UACA,cAEA,cACA,eAEA,WACA,eAGA,UAIA,gBACA,gBAGA,0BAKA,uBACA,wBACA,QAIA,wBAGA,2BAGA,mBACA,0BAEA,kBACA,CAOA,sEAljBA,QAgDA,GAikBA,mBACA,aACA,cACA,2FAIA,wBA+BA,oBCvpBA,qBAoBA,IACA,mBACA,WACA,OACA,MAOA,QACA,mBACA,YAOA,cACA,+BACA,EAKA,WACA,CACA,QAKA,uBACA,OACA,oCACA,yFCjDA,SAaA,iBACA,QACA,IACA,IACA,SACA,OACA,SAEA,UACA,GAGA,oCAGA,eACA,IAEA,QACA,QApBA,QAqBA,IACA,UAEA,SACA,kBACA,OACA,SAEA,uBACA,WACA,QACA,KACA,QACA,iBAGA,SACA,OACA,KACA,aAEA,OACA,CACA,QAEA,gCCmBA,aACA,yCACA,QAUA,CA0DA,eACA,6BACA,+CAEA,6DACA,yBACA,iCAEA,kBACA,mBAEA,EACA,CACA,4CAtEA,WACA,0BACA,IAWA,MACA,WACA,OACA,aAEA,WAEA,IAEA,MAaA,aACA,SAGA,6BACA,Y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ACA,QAEA,+BACA,eAEA,uCACA,WACA,2BACA,iBAQA,0CAjDA,OAqBA,GACA,mBAIA,uBACA,OACA,gCACA,QAqBA,gCACA,qBAEA,kCAEA,mBACA,4CAEA,OACA,iCAGA,SACA,KAAC,GAED,8CCuBA,qBACA,kCACA,WACA,2BACA,iBASA,gDArGA,OAsBA,GACA,mBAIA,WACA,OACA,MAOA,cACA,wDACA,IASA,qBACA,+DACA,IASA,qBACA,+DACA,IASA,qBACA,4BACA,IAKA,yBACA,CACA,QAKA,uBACA,OACA,8BACA,QAgBA,gCACA,SACA,cAEA,6BACA,OAMA,qBAGA,+FACA,SACA,mCAGA,WACA,KAAC,GAED,6GC5HA,QAwBA,GACA,mBAIA,WACA,OACA,OAQA,eACA,mEACA,IAYA,uBACA,4BACA,IAKA,yBACA,OACA,IAKA,uBACA,OACA,+BACA,EAWA,MACA,+BACA,SACA,WAEA,sBACA,eAEA,2BAMA,oBAGA,kGAMA,oBAGA,uHACA,uCAEA,gBAEA,SAEA,0BAGA,WACA,cACA,8BAEA,wCACA,eAEA,0CACA,kBACA,8BAEA,kBACA,IAAC,GAED,4GCnIA,OAwBA,KACA,mBAIA,WACA,OACA,OAOA,eACA,+DACA,IAiBA,sBACA,4BACA,IASA,qBACA,gFACA,IAKA,yBACA,OACA,IAKA,uBACA,OACA,+BACA,EAWA,MACA,+BACA,SACA,WAEA,sBAEA,aAMA,qBAGA,6EAEA,sBACA,SAEA,+BAGA,WACA,8BAEA,6BAEA,qBACA,uCACA,iBAEA,kBAEA,cACA,8BAEA,kBACA,IAAC,GAED,sGCzIA,QAuBA,GACA,mBAIA,WACA,OACA,QAOA,eACA,+DACA,IAQA,qBACA,4BACA,IAKA,yBACA,OACA,IAKA,uBACA,OACA,gCACA,EASA,MACA,gCACA,IAMA,8BAGA,4FACA,WAEA,oDAEA,QAEA,SACA,cACA,8BAGA,WACA,cACA,8BAIA,wCACA,eAEA,4DACA,kBACA,8BAEA,kBACA,IAAC,GAED,oHChHA,QAyBA,GACA,mBAIA,WACA,OACA,MAOA,YACA,cAEA,mFACA,IAOA,cACA,cAEA,2CACA,CAUA,uBACA,4BACA,IAQA,qBACA,4BACA,IAKA,yBACA,OACA,IAKA,uBACA,OACA,8BACA,EAUA,MACA,gCACA,OAMA,qBAGA,uFAEA,WAMA,6BAGA,uEAMA,8BAGA,gGACA,WAEA,kDACA,WACA,8BAEA,0DACA,QACA,OACA,2BAEA,uBAEA,kBACA,8BAEA,kBACA,IAAC,GAED,8DC/IA,SACA,WACA,gCACA,OAEA,wCCFA,QACA,iBACA,aACA,cAEA,SACA,UAEA,kBACA,2BACA,2BACA,MAEA,0DCpBA,QAeA,eACA,OACA,QAEA,0CAlBA,aAaA,EAMA,WACA,aACA,IAEA,uBACA,iBACA,SAEA,EAEA,GACA,CACA,QACA,wBACA,MAEA,2ECdA,QACA,WACA,WACA,QAEA,eACA,oCACA,WACA,QAGA,aAFA,YAGA,4BACA,6BACA,QACA,EAEA,iBCpCA,iBACA,aACA,YACA,MACA,SACA,EAEA,YACA,OACA,KACA,aAEA,OACA,CACA,QAEA,gCCuPA,aACA,2DACA,OAMoB,CACpB,aACA,yBACA,iBAMA,wBAhSA,QAmCA,KACA,eAAkC,YAkBlC,eACA,WAIA,GACA,sCAIA,6BACA,OAmBA,qBACA,WAGA,WACA,cAGA,uBACA,GAGA,SACA,IAGA,yBACA,OASA,qBACA,yBACA,KAGA,IA+BA,MACA,OAKA,eAEA,kBAGA,WACA,UACA,EAEA,4BA0BA,QAAkC,KAElC,gBAIA,uCAIA,yDAGA,mDAEA,iBACA,qBAKA,uBACA,mBAYA,YAEA,cAEA,eAMA,4DACA,8BAEA,gBAeA,yBACA,cACA,MACA,SAKA,EAMA,4BALA,eACA,uCACA,gBAEA,GAQmB,uFC9QnB,SAiCA,IACA,OAQA,iBAOA,MAQA,gBAQA,2BAQA,oCAGA,WAEA,cAeA,cAAoC,KACpC,MACA,iDAEA,aACA,SAQA,aACA,aACA,OAQA,yBACA,aACA,mBAWA,aACA,kBACA,aAEA,+CACA,qCAEA,iBACA,qBAQA,YACA,kBACA,aAEA,+CACA,uCAEA,eACA,qBAQA,kBACA,6CACA,WAOA,iBACA,qBACA,MAOA,iBACA,+BACA,kBAQA,sBACA,aACA,mBAGA,gBACA,IAkBA,cACA,kBACA,oBAGA,qDACA,uCACA,aACA,SAOA,aACA,qBACA,kBAEA,kBAUA,gBACA,OAEA,yBACA,gCACA,UAIA,qCACA,IASA,eACA,OAEA,yBACA,6BACA,QAIA,qCACA,IASA,mBACA,cAEA,yDACA,IASA,kBACA,cAEA,sDACA,IASA,WACA,mBACA,OAGA,oDACA,mBAGA,+BACA,WACG,YACH,oBAGA,kEACA,OAGA,qCACA,IAEA,uBACA,wBACA,CACA,KACA,KAGA,IACA,GAEA,QAEA,CACA,QAUA,aACA,uBACA,WAGA,kCACA,6BAGA,gBACA,KAIA,YACA,KAIA,uCACA,KAEA,gBAEA,qBACA,mBAEA,4DACA,CACA,KACA,KAIA,IACA,GAEA,QAGA,CACA,QAOA,kBACA,cACA,cACA,qBAEA,UAYA,eACA,MAEA,4BACA,kBACA,oBAGA,qDACA,aAEA,0BACA,aACA,SAUA,SACA,CACA,+BACA,mCACA,mDACG,yBACH,oBACG,YAEH,aAGA,gCAEA,SAOA,SACA,qBACA,aAOA,SACA,qBACA,aAYA,oBACA,aACA,mBAEA,yBACA,IASA,kBACA,cAEA,mBACA,6BAEA,WASA,gBACA,cAEA,kBACA,6BAEA,WAYA,iBACA,IAMA,4BACA,KAIA,qHAEA,iBAIA,gDAEA,oBAEA,MACA,4CAEA,+BAEA,WASA,qBACA,IACA,0BAGA,mBACA,0BACA,kBAEA,2CACA,IASA,8BACA,SACA,MAGA,SADA,UAYA,cACA,qBACA,aAQA,2BACA,KACA,4GAAM,cAKN,4CACA,mBACA,QAEA,cAMA,mCC9VA,aACA,qBACA,2CAxRA,SAqDA,GACA,mBAMA,eACA,OAGA,YAIA,mCACA,iBACA,+EAEA,YAGA,2BACA,iBACA,0BAEA,QAQA,QAUA,kBAQA,gCACA,IAQA,OACA,SAMA,oBAGA,oGAEA,aACA,QAMA,UACA,iBACA,UA2BA,SACA,OAEA,wBACA,SAEA,MASA,aACA,MACA,gBAmCA,eACA,gBAMA,mBAGA,mFASA,SAEA,eACA,eACA,sBAKA,2BACA,UACA,sBAEA,KAGA,2BACA,UACA,UAEA,mBACA,EAEA,EAaA,QAEA,gBAMa,yDCrRb,QAyBA,GACA,OAOA,eAOA,MAQA,2BAQA,uCAYA,0CAYA,8CASA,QAOA,aACA,oBACA,MAaA,SACA,IACA,gBAEA,sBACA,MAEA,KAMA,iCAGA,qCAMA,qBAEA,qCACA,oBAIA,UACA,yBACG,qCAMH,kBAGA,iEAEA,mBAEA,mBAEA,WACA,IAQA,OACA,IAEA,MACA,mCACG,eACH,0BAOA,6BAGA,oEACA,IASA,YACA,IAEA,YACA,iCAKA,qBACA,UASA,UACA,IAEA,UADA,eAGA,YA6BA,GA5BA,oBACA,oBACA,SAGA,qBAEG,aACH,oBACA,WACA,YAGA,SAGA,QACA,MACA,mBACA,mCAGA,wBASA,+DACA,iBAEA,oDACA,OAMA,yCALA,4CAEA,oBAEA,aAYA,SACA,oBACA,QAWA,UACA,oBACA,SAWA,YACA,oBACA,WAMA,QACA,UACA,4CACA,0CAGA,WACA,oBAEA,EAiFA,UACA,SAMA,gCAGA,yFAEA,oBAOA,SACA,+BACA,SAUA,aACA,CACA,mDAEA,oCAEA,KAEA,EAQA,uBACA,cAKA,6BACA,8BACA,sCAMA,UACA,uCACA,2CACI,aACJ,SAEA,uCACA,2CAEA,cACA,QACA,CAGA,WACA,UAIA,wBAGA,yCACA,2CAGA,eAEA,SACA,EAKA,oBACA,2BACA,WAeA,QAEA,oCC3fA,aA+RA,aACA,mBACA,gEA3OA,IACA,OAUA,eACA,kBA2CA,qBACA,0CACA,SAEA,WACA,uBAGA,cACA,wCACA,CACA,UACA,GAEA,EAEA,CASA,YACA,iCACA,IASA,WACA,gDACA,IASA,WACA,+BACA,EASA,eACA,gCACA,EASA,cACA,OAGA,WACA,yCAGA,kCACA,uCAGA,eAIA,WADA,MAIA,KAKA,aACA,kBACA,MAKA,YACA,kBACA,KAKA,YACA,kBACA,KAKA,gBACA,kBACA,SAQA,UAEA,MAEA,OAWA,qBAEA,cACA,0BAEA,UACA,SAKA,SACA,mCAIA,eAEA,WACA,yBAGA,UACA,KAIA,YACA,QAAG,OAEH,aACA,KACA,EAMa,oCC3Ib,mBAEA,mBAAqC,cAKrC,8BAKA,2BACA,qCACA,qBAEA,QACA,SAMA,CACA,mBAEA,OACA,OAGA,uEAYA,WACA,aACA,wDAGA,iBACA,GAIA,2BAGA,+BAIA,cAMA,eAAiB,aAA4B,eAC7C,kBAEA,4BAGA,aASA,eARA,uCAKA,YAIA,WAIA,qBAEA,IAGA,cAEA,MAEA,mBACA,iBAIA,0BAAoD,QAKpD,wBAAsB,kBAKtB,sBAAsB,wBAKtB,cAEA,CAGA,eACA,iCACA,WAEA,aACA,WACA,UAGA,WAEA,SACA,CAEA,CACA,YACA,oBAIA,WAEA,aAGA,SACA,MANiB,yBACjB,4BAOA,GAGA,2CACA,aAEA,EACA,wCA7SA,QAuBA,IACA,mBAIA,wBACA,OACA,WAKA,OACA,cACA,WACA,aACA,SAEA,sCAGA,2CAGA,4CACA,yBACA,uBAGA,yBACA,yBACA,eAUA,0CAAiE,UAEjE,kCAA8D,UAO9D,wCAAuD,UACvD,iDAAgE,UAOhE,oCACA,CAIA,uBACA,MACA,wBAAmD,UACnD,gCACA,aACA,gBACA,GAAG,EAAG,UACN,UACA,EAgCA,MACA,2BAmBA,iFAsHA,+BCxQA,aACA,aAQA,mBACA,WACA,UACA,UAEA,wCCHA,QACA,iBACA,KAEA,iBACA,MAEA,cACA,OAEA,OACA,SACA,YAEA,YACA,WACA,CACA,QAEA,iBCxBA,iBACA,WACA,mBACA,uBACA,IACA,CAEA,wCCVA,aAMA,cAOA,mBAGA,aAmBA,yBACA,WAEA,iCACA,mCACA,SArCA,qBAuCA,gDCzCA,aAUA,cAmBA,aACA,WACA,OACA,uDACA,SA9BA,iBAgCA,oCCjBA,WACA,eACA,eAEA,WAEA,iBA5BA,QAqBA,mCCPA,aACA,kBACA,OAEA,qDALA,KAMA,sBACA,0BACA,oBACA,oBACA,gBAEA,wCCZA,aACA,QACA,eAEA,WACA,eACA,OACA,qBACA,GACA,CAEA,6CAZA,KAaA,sBACA,0BACA,oBACA,oBACA,gBAEA,wCCSA,aACA,UACA,OAIA,sDAtCA,OACA,iBAEA,qBACA,iBAEA,qBAGA,6BAOA,cAGA,uBACA,mBACA,mBACA,mBACA,mBAQA,qCAQA,mBACA,qBACA,yBACA,oBACA,yBACA,SACA,aA3CA,oBA4CA,8BAEA,eACA,KACA,iBACA,gBACA,gBACA,gBACA,gBAGA,UACA,QAGA,+CC7DA,SACA,WACA,2BACA,YAEA,yBADA,UAGA,iBCTA,iBACA,WACA,QACA,YAEA,MAIA,8BAHA,QACA,KACA,IAGA,wCCdA,UAEA,2CCsMA,aAEA,OACA,uBAGA,iBACA,YAIA,WACA,YACA,2BAEA,mCA1NA,QAgBA,GACA,OAOA,eAOA,MAGA,oCAEA,IAKA,oBACA,8BACA,WAQA,iBACA,uBACA,MAQA,cACA,OACA,oBAQA,WACA,OACA,KAQA,aACA,OACA,KAUA,MACA,OACA,qBASA,kBACA,iCACA,aAQA,YACA,aACA,YAQA,iBACA,uBACA,UAOA,cACA,8BACA,WAUA,oBACA,6BACA,YAEA,IAEA,cAEA,QACA,mBAGA,kBAEA,6BACA,KACA,IAGA,IACA,QASA,sBACA,6BAEA,aAAsB,OAAqB,IAC3C,6BAGA,2BACA,WAUA,iBACA,WACA,cACA,QAEA,cAKY,mCCtCZ,mBACA,aACA,WAEA,sBAEA,gBAEA,qBACA,WACA,sBAEA,oCAEA,MACA,SAEA,iBAEA,mCAEA,iBAIA,uEAIA,oCAGA,oCAGA,YACA,kBAEA,kBAGA,CACA,qBACA,aAuCA,CACA,2BAGA,uBACA,8BAEA,WACA,kBACA,iBACA,SA9CA,cAIA,MAEA,EAEA,EAEA,WACA,iBAIA,mBAEA,OACA,MAGA,IAGA,SACA,aAKA,4BACA,MAGA,6DApPA,OAwBA,GACA,mBAIA,WACA,OACA,WAQA,UACA,kDACA,IAQA,YACA,uDACA,IAQA,YAEA,SACA,mBAGA,aACA,OAEA,yBACA,uBAIA,mCACA,oBAGA,oCACA,kBAIA,YACA,sBAEA,eAGA,QACA,IAEA,yBACA,CACA,QAKA,SACA,eAEA,SAGA,gBADA,QAMA,uBACA,OACA,mCACA,EASA,MACA,mBAIA,uBACA,OACA,uCAaA,EACA,0CACA,UAEA,YACA,IAWA,GACA,2CACA,iBAEA,QACA,IAAC,GAgGD,gBACA,sDCnQA,QAcA,GACA,mBAQA,uBACA,CAQA,cAQA,8CAQA,4CAQA,UACA,UAKA,WACA,OACA,QAOA,QACA,uEACA,YAOA,cACA,mFACA,EAKA,WACA,6BAEA,gDAEA,UAAU,gBACV,OAKA,SACA,eAEA,SAGA,gBADA,UAMA,uBACA,OACA,wCASA,qBACA,OACA,SACA,2CACA,2CACA,OACA,UAEA,YACA,6DCjIA,OAoBA,GACA,mBASA,qBACA,CAOA,cAOA,gBAOA,eACA,SAKA,WACA,OACA,QAOA,QACA,mFACA,YAOA,cACA,+FACA,EAKA,WAEA,uBAEA,2BAMA,eACA,KAEG,oIAMH,iBACA,KAKA,qHAEA,sBAGA,SAAU,wBACV,QAKA,uBACA,OACA,wCASA,qBACA,+DACA,YACA,8CCrIA,QAuBA,GACA,mBAWA,uBACA,CAQA,cAQA,YAQA,WAQA,gBACA,UAEA,WACA,OACA,sBACG,mBACH,qBAEA,sBAEA,qBAOA,QACA,kEACA,YAOA,cACA,8EACA,EAEA,WACA,kEASA,kBAGA,kIAAK,yBAIL,iFAQA,cACA,KACA,yFAAK,yBAIL,YACA,qDAKA,0CAHA,UAGU,kEACV,SAKA,uBACA,OACA,+CASA,qBACA,iBAOA,eACA,KACA,2HAAK,CAIL,0EACA,YACA,sGCzKA,OAyBA,GACA,mBAIA,WACA,OACA,QAQA,eACA,6DACA,IAQA,YACA,0DACA,IASA,uBACA,4BACA,IAKA,yBACA,OACA,IAKA,uBACA,OACA,gCACA,EAYA,MACA,kCACA,gBAGA,WACA,mBAGA,cACA,kCAEA,iBACA,cACA,8BAGA,8BACA,gCAEA,wBACA,WACA,aACA,wBAGA,wBACA,cAGA,OACA,KAAC,GAED,8CC7EA,iBACA,GACA,2BACA,iBASA,iDA1DA,OAsBA,GACA,mBAIA,WACA,OACA,QAKA,yBACA,CACA,QAKA,uBACA,OACA,gCACA,QAeA,kCACA,kBAMA,oBAGA,8GACA,WAEA,uEACA,kBAEA,UACA,IAAC,GAED,sDCpEA,SACA,aACA,oBACA,oBAEA,wCCLA,SACA,eACA,IACA,oBAEA,sBACA,MAEA,OACA,UACA,SAGA,gBACA,CAEA,iBClBA,iBACA,eACA,YACA,MAEA,OACA,cACA,MAGA,SACA,QAEA,iBCfA,iBACA,WACA,mBACA,OACA,KACA,CAEA,iBCNA,iBACA,aACA,UACA,MAEA,yDCDA,QACA,aACA,+BAEA,kBACA,MAEA,gBACA,uBAEA,iBACA,aAEA,gDCGA,QACA,eACA,kBAIA,qCACA,0BACA,UAEA,gDCVA,QACA,eACA,kBAIA,qCACA,UACA,wBACA,QAEA,iBCrBA,iBACA,WACA,sBACA,SAEA,mFCHA,SACA,eACA,iBACA,WACA,WACA,OACA,MACA,WACA,SAEA,UACA,OACA,KACA,8BAEA,gBACA,+BACA,uBAEA,YACA,KAEA,UACA,MAEA,GACA,8BACA,OACA,SAEA,uBACA,EACA,UACA,WACA,SACA,KACA,SACA,OACA,QACA,UACA,aAEA,kBAEA,MAEA,MAEA,UACA,OACA,CACA,CACA,QAEA,wCCjEA,QACA,WACA,eACA,YAEA,wCCQA,SACA,aACA,0BACA,cAEA,WAEA,kECtBA,aAGA,cAYA,WACA,iBACA,aACA,OACA,MACA,OAGA,mCAEA,UACA,iBACA,IACA,SAEA,QACA,kBACA,kBAEA,cAGA,GACA,QAEA,wCC3CA,QAoBA,iBACA,GAEA,eACA,eACA,IACA,QACA,kBACA,UAEA,gBACA,eACA,OACA,QACA,aACA,WACA,eAEA,QACA,WAEA,kBAEA,kBAEA,oBACK,IAGL,eAGA,UAEA,EAEA,GACA,OACA,KAzDA,WAkBA,EAyCA,yDCvCA,SACA,aACA,WACA,QAEA,sBACA,cAGA,oCACA,eACA,gBACA,EAEA,wDCzBA,QACA,eACA,YACA,MAEA,OACA,aACA,SACA,mBACA,sBAEA,aAEA,+BACA,cAEA,gCCwFA,YAEA,YAEA,iDACA,mBACA,SACA,sBACA,GACA,oCAEA,eACA,EAAG,UAEH,QAaA,CACA,qBACA,8BACA,eAEA,+BAIA,qBAGA,8CAMA,oFAGA,gBAGA,kBAEA,iCAEA,aACA,+DACA,iBAIA,6BAEA,mBACA,iBAEA,+BACA,CACA,OACA,QACA,QAEA,kBAEA,MAfA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eACA,EAEA,eClEA,qBACA,uBACA,cAEA,yBACA,8CACA,CACA,4BACA,UACA,CAEA,iCACA,CACA,4BACA,UACA,CAEA,sCACA,CAEA,kCACA,CACA,CACA,kFCVA,SACA,WACA,WACA,4BACA,iDACA,uBAEA,QACA,IAEA,iBCfA,iBACA,aACA,YACA,IAEA,SACA,YAEA,KACA,QAEA,8ECnBA,OAiCA,GACA,OAIA,cAOA,6BAQA,qCASA,6CAGA,0CACA,OAIA,mEAEA,8DACA,QAAG,EAAG,UAGN,6CACA,MACA,cAGA,4BACA,kCAEA,YACA,QACA,kCAGA,wEAEA,8BACA,8BAAG,EAAG,UACN,OAWA,kBACA,0BACA,kCACA,QAOA,qBACA,cAEA,uBACA,oBAOA,sBACA,cAEA,sBACA,oBAKA,gBACA,6BACA,qCACA,QAUA,kBACA,iCACA,MAQA,iBACA,iCACA,MAQA,gBACA,qEACA,KAQA,eACA,mEACA,KASA,mBACA,SACA,CACA,sBAGA,uBAEA,2BACA,aASA,kBACA,SACA,CACA,uBAGA,uBAEA,2BACA,YA+BA,+BACA,kCACA,QAoBA,sBACA,SAEA,wCACA,gBAEA,4BACA,IAKA,SACA,QAIA,eAEA,YAAkB,EAAgB,IAClC,6BAGA,aACA,QASA,qBACA,0BACA,mCACA,SAwBA,kBACA,iDACA,gDAEA,YACA,KAAG,6BACH,aACG,WACH,sBACG,eACH,mBACG,OACH,OAEA,mBACA,sBAGA,kBACA,QACA,CA2BA,qBAEA,OAIA,IACA,IAGA,EANA,UAOA,kBAMA,eACA,SACA,mBACA,kBACA,KAIA,UACA,0CAMA,qCAEA,KAcA,+BAGA,WACA,eAEA,yBACA,6BACG,2BACH,eAKA,IAuFA,QAEA,kCC9gBA,aAiBA,IACA,WACA,YAEA,cACA,gBAGA,MACA,wCCmDA,yBACA,IAEA,yBAEA,MACA,WAEA,oBACA,QAEA,sBACA,QACA,MAKA,cACA,gBAEA,eACA,sBAEA,+BACA,WACA,cAEA,yBACA,QACA,+BAEA,UAAK,KACL,KACA,WAEA,iBACA,aACA,CAEA,kBA1BA,QACA,iBAEG,mBAwBH,cACA,OACA,KAEA,cAEA,SACA,iCAGA,QAQA,qCANA,KACA,MAEA,sBACA,iBACA,IAGA,qJAvHA,MACA,uBAKA,sBACA,+BAGA,uBAoBA,OA5BA,kBA6BA,EAdA,0BACA,qBAcA,EA7BA,sBACA,iBA6BA,EAdA,2BACA,yBAcA,EAbA,wBACA,uBAaA,EAZA,yBAfA,gBA4BA,EA3BA,wBA4BA,EA1BA,qBACA,gBA0BA,EAzBA,qBACA,mBAyBA,EAfA,yBACA,8BAeA,EAdA,0BAGA,2BAYA,EApCA,uBAoDA,EAzCA,2FC1BA,OAGA,wBAGA,uCAGA,+BAGA,aAGA,wBACA,wBACA,kFAoBA,SACA,WACA,YACA,QAEA,sCACA,iCACA,QAEA,iBCvDA,aACA,yBAQA,aACA,WACA,YACA,IACA,UACA,OAAK,UACL,IACA,UACA,EAAK,UACL,CACA,OACA,EAEA,gDClBA,sBAEA,mDCHA,cAGA,cASA,mBACA,aAIA,UACA,uCACA,qBAEA,iBCjBA,iBACA,aACA,QACA,MAEA,iBACA,UACA,YAEA,KACA,QAEA,iBCnBA,aAUA,aAGA,UACA,UAIA,CAjBA,aAQA,sCAUA,CACA,QAGA,uDCnBA,sBAEA,mDCHA,UAEA,gCCMA,iBACA,iBACA,QACA,MAEA,WACA,WAEA,MACA,aAEA,UACA,QAEA,iBCbA,aAkNA,eAEA,IACA,2BAGA,WAEA,eACA,yBAEA,SACA,MAKA,OACA,4BAEA,gBACA,WAKA,OACA,oBAEA,YAMA,YACA,oBAEA,YAMA,WAMqB,CACrB,eAEA,oBACA,UAGA,QACA,KAOwB,CACxB,eACA,MAEA,uBACA,SAEA,0BACA,WAEA,+BACA,cACA,UAEA,mBAEI,eACJ,QAEA,mBAEA,KACA,YAEA,KAEA,CACA,QAMwB,CACxB,eACA,MAEA,eACA,+BACA,WAEA,yBACA,UACA,WAIA,WACA,mBAEA,KAAG,WACH,cAEA,mBAIA,MACA,QAOwB,CACxB,eACA,MAEA,uBACA,SAEA,sBACA,WAEA,2BACA,cACA,UAEA,mBAEI,eACJ,QAEA,mBAEA,KACA,YAEA,KAEA,CACA,SA9JyB,IAhNzB,KAOA,kBACA,MAEA,sBACA,KAiFA,UACA,QAEA,yCACA,aAAY,CAIZ,+DACA,sBAGA,uBAEA,OA+BA,YACA,UACA,sCACA,SAEA,OACA,WACA,CACA,UACA,UAGA,QAGA,OACA,KAYA,eACA,MAEA,eACA,sCACA,SAGA,iBACA,CACA,UACA,UAGA,SAGA,qBACA,IAQA,iBACA,IACA,gCAGA,6BACA,OAEA,6DACA,IACA,iCCmgBA,iBACA,WACA,0BACA,kBACA,UAEA,8BACA,sBACA,WAEA,6CACA,eACA,CAEA,SACA,iDAxuBA,OA2GA,IACA,OAOA,eAA+C,KAO/C,MAOA,gDAAgC,YAChC,QAkBA,mBAGA,wBAIA,kDAIA,2DAKA,qDACA,sCACG,OACH,8CACG,OACH,kDACG,gDACH,wEACG,UACH,4CAEA,SAeA,oBAEA,cAGA,4CACA,WACA,2DACA,UACA,CACA,OAGA,2BAKA,+BACA,qBACA,mCACA,2BAEA,kCAAuC,iBAEvC,OAEA,4CACA,WACA,eAGA,qDACA,0CAEA,OACA,CAYA,iBAEA,wBACA,MAEA,yBACA,6DAEA,aACA,kBACA,WACA,wBAEA,mBAYA,mBACA,0CAEA,oCAAuC,CAAgB,aACvD,mBAMA,SALA,CACA,iBAGA,UAEA,CAgBA,4BACA,IAMA,iDAGA,wBACA,WACA,2DACA,0BAQyB,IAAU,KACnC,GARA,CACA,OACA,QACA,eACA,oBAGA,uBAEA,EAYA,mBACA,MAMA,mBACA,YAGA,iCAEA,yCAIA,6BACA,OAEA,6DACA,uCACA,aAWA,oBACA,uEACA,4BAEA,sDAA2B,CAAY,oBAEvC,gCACA,WAEA,2DACA,QAGA,iBACA,CACA,yBACA,KAGA,6CACA,oDAEA,cAEA,qCACA,SACA,CACA,YACA,cAIA,kDACA,qDAEA,cACA,CAcA,qBAEA,qBAKA,yCAGA,uBACA,YACA,KAQA,SANA,0BACA,CACA,aACI,sBAEJ,cAIA,cAGA,gDACA,WAGA,WACA,UAGA,iBACA,CACA,iEACA,QACA,aAGA,oCACA,cACA,EAUA,2BACA,YAEA,sBACA,WAEA,aAEA,2BACA,2BAEA,kBAEA,CACA,QAWA,+BACA,YAEA,sBACA,aAGA,SACA,QAUA,gCACA,YAEA,aAEA,sBACA,qCAGA,uBACA,2BAGA,yBACA,QAeA,oBACA,aAKA,8BAEA,mCACA,eAgLA,QAEA,cAQa,mCCnpBb,YACA,OACA,sBAvEA,OAeA,IACA,mBAUA,mBACA,CAQA,kBACA,iBAKA,aAEA,iDAIA,iCAFA,KASA,oBACA,0BAMA,sCAEA,iFACA,EAIa,oCCqEb,YAEA,YAEA,iDACA,mBACA,SACA,kBACA,GACA,gCAEA,eACA,EAAG,UAEH,QAWA,CACA,iBAEA,8BACA,UAEA,GACA,cACA,iBACA,oEACA,WAEA,UACA,WACA,aACA,uBAEA,qDACA,8BACA,sDAGA,oCACA,6BACI,WACJ,SACA,iEACA,UAIA,sBACA,gCAEA,kBACA,iBAEA,eACA,WAEA,+BA1MA,OA6BA,GACA,mBAUA,mBACA,IAEA,yBAMA,wBACA,KAwBA,0HAEA,sBACA,KAOA,SACA,MACA,eAyCA,EASA,MAoEA,cAOA,iCClMA,aACA,+FACA,OAUA,CACA,aACA,2CACA,OAUA,CACA,aACA,2CACA,OAQA,CArDA,IAsDA,aACA,8BACA,UAQA,EAhDA,IAiDA,aACA,YACA,0DC/DA,SAiBA,qBACA,OACA,EAHA,MAIA,WAEA,qBACA,KAGA,iBACA,OACA,WAEA,aACA,EACA,SA/BA,KAiCA,kBAGA,gBACA,OACA,OAEA,KACA,WACA,EACA,eAEA,6BACA,CACA,KAEA,SACA,KACA,KAEA,CACA,qCACA,OACA,gBACA,uBAEA,MAAW,GACX,CACA,KACA,KACK,UACL,EACA,OACA,cACA,CACA,KACA,KACA,CACA,CAEA,SADA,cAGA,iEChFA,QAoBA,IACA,mBAIA,uBACA,OACA,oCACA,EAqBA,MACA,sCACA,SACA,WAEA,qBAEA,iBACA,kDAGA,mDACA,kBACA,8BAEA,kBACA,IAAC,GAED,8CC4PA,eACA,UACA,yBACA,yBAIA,IACA,QAEA,CACA,aACA,iBACA,sBACE,OACF,EAGA,CACA,eACA,oBACA,+BAEA,uBAEA,eAAiB,EAAa,IAC9B,2BAGA,QACA,OAIA,CACA,iBACA,CACA,SACA,SACA,OACA,MAiCA,CACA,iBAEA,yBAEA,+CAEA,4BAEA,kCAEA,WAEA,OAEA,eAEA,eACA,CAWA,CACA,eACA,yBACA,oBAEA,+CACA,iBAeA,CACA,eACA,oBACA,0BAIA,2BACA,gBAGA,CACA,iBACA,eAEA,+BAGA,8BACA,oCAGA,mCACA,kBACA,4CACA,aAEA,CAEA,KACA,KAKA,CACA,KAEA,KAEA,sBACA,QAGA,CACA,eACA,WACA,mBAEA,iDAEA,mCAIA,6BACA,MASA,CACA,iBACA,UACA,sBACA,wBAEA,sCAEA,qBAEA,mBACA,+BAEA,QAOA,CACA,eACA,IACA,QACA,KAEA,EACA,cACA,SAGA,cACA,sBAIA,QAEA,iBACA,QAEA,QAIA,OACA,kBAIA,QACA,aACA,SAKA,cACA,uBACA,qBAEA,oBAGA,QACA,cACA,SAKA,+BAEA,MACA,gCACA,8BAGA,MACA,cAIA,4BACA,QAEA,QAGA,sBAEA,IACA,QAKA,WAAqC,MAA6C,yBAOlF,MANA,UAOA,YAIA,WAGA,KAEA,8BAMA,cACA,UAGA,sBACA,IAEA,UAEA,eACA,UAGA,sBAEA,KAqBA,yHAvpBA,SAwBA,IAEA,WAKA,OAuBA,iBACA,yCAGA,gCACA,uCAEA,kBACA,OAaA,yBAGA,MAGA,cAGA,WAGA,iCAGA,SAGA,aAEA,kBAAoB,MAAgB,WAEpC,SAkBA,cAKA,iDAEA,uBAIA,iBACA,2BACA,0DAGA,4BAIA,iCACA,UAYA,CACA,IAIA,cACA,UAKA,OAEA,YACA,cASA,8BACA,SAGA,gBACA,OAGA,YACA,QAQA,4BACA,eAIA,0CACA,WAEA,gBACA,uDACA,KAEA,OACA,KAEA,CAGA,kBAIA,mBAkBA,gCACA,eACA,gBAEA,UAEA,WACA,CAGA,kBACA,kBACA,wBACA,OACA,aAEA,qBACA,wBAEA,QAEA,WAAkB,MAA+B,WACjD,UAEA,gBAAmB,MAA+B,WAClD,UAEA,gBAAoB,MAAmB,OACvC,cAAqB,MAAmB,WAExC,WAGA,sCACA,gBACA,8BACA,0BACA,2BACA,2BAGA,mCACA,iBACA,8BACA,2BACA,2BACA,2BAGA,gBACA,GAEA,sCAEA,eACA,wBAEA,QAEA,cACA,kBAEA,eACA,kBACA,CAGA,cACA,kBACA,CAEA,cACA,kBACA,CAEA,cACA,YAEA,WACA,SACG,KACH,SAGA,KAAU,WACV,UAGA,GAEA,4DCzTA,WAuBA,SACA,eACA,yBACA,YAEA,mBAEA,oBACA,SACA,IAEA,mBACA,IACA,YAEA,MACA,4BAEA,MACA,QAEA,iBCnCA,iBACA,WACA,YACA,eACA,IACA,EAEA,YACA,OAEA,WAEA,OACA,CACA,QAEA,iECJA,QACA,UACA,qBACA,qBACA,eACA,GAEA,IACA,YAEA,mBACA,+DAEA,MAEA,gECjBA,8BACA,eACA,sCAEA,WAEA,wBCtBA,iBACA,eACA,aACA,iBAEA,gBACA,OACA,QACA,MAEA,QACA,QACA,CAEA,gFCSA,8BACA,cACA,sBACA,UAEA,iBACA,qDAEA,WAEA,+CChCA,QACA,WACA,uBACA,OAEA,iBCNA,iBACA,aACA,mBACA,OAGA,UACA,2BACA,WACA,CAEA,wCCOA,SACA,eACA,6BACA,gBACA,eAEA,iBCjBA,iBACA,WACA,CACA,QAEA,wECOA,8BACA,cACA,sBACA,UAEA,iBACA,sCAEA,oBAEA,uDCCA,SACA,aACA,aACA,mCAEA,YAEA,gDCPA,SACA,aACA,aACA,mCAEA,SAEA,iDCdA,QACA,iBACA,kBAIA,0CACA,gBACA,EAEA,YACA,iBAEA,iDCPA,QACA,aACA,aACA,mCACA,KACA,CAEA,iBCnCA,iBACA,eACA,aACA,cAEA,QACA,YACA,UAGA,gBACA,CAEA,iDCeA,QACA,aACA,aACA,mCACA,QACA,CAEA,4EC5CkB,yCCelB,QACA,WACA,kBACA,yBACA,KAEA,wCClBA,QAgBA,WACA,kBACA,kBACA,SAJA,KAMA,gDCFA,QACA,aACA,kBAIA,kCACA,eACA,aAEA,iBClBA,iBACA,WACA,YACA,eACA,EAEA,YACA,OACA,eACA,EACA,CACA,QAEA,iDCCA,QACA,eACA,kBAEA,qBAGA,QACA,cAEA,WACA,cALA,CAOA,wCC1BA,SACA,WACA,sBACA,EAEA,kECEA,4BACA,qBACA,+BACA,UAEA,UAEA,yFCCA,4BACA,cACA,wBAEA,uBACA,QAEA,WAEA,yBACA,wBAEA,WAEA,iFCjBA,4BACA,cACA,wBAEA,uBACA,QAEA,WAEA,yBACA,UAEA,mBAEA,wBCzCA,aACA,YAGA,cAgBA,SACA,aACA,sBACA,EAEA,iDCEA,QACA,eACA,kBACA,KACA,UAEA,KACA,QACA,sBACA,UACA,CACA,UACA,SACA,IAEA,GACA,oBAEA,kBACA,QACA,SAGA,gBACA,CAEA,iDC9BA,QACA,aACA,yCACA,eAEA,iDCFA,iBAEA,yDCFA,SACA,eACA,0BACA,8BAEA,UAEA,wCCTA,SACA,eACA,0BACA,cAEA,oBAEA,2FCCA,8BACA,iBAEA,oBACA,WAEA,UAKA,8CAJA,yBACA,IAAG,QAEH,OAGA,yFCrCA,YAGA,cAUA,WACA,aACA,sBACA,MAEA,OACA,OACA,oBACA,IACA,eACA,mBAEA,6BACA,cACA,iBAEA,UACA,qCAEA,SAEA,sBAEA,QACA,CACA,CACA,QAEA,gDClBA,SACA,aACA,IACA,gBACA,QAEA,gBACA,EACA,SAEA,2BACA,UACA,OACA,KACA,aACA,UAEA,QACA,CAEA,cADA,WAGA,iBCrDA,aACA,YAGA,cAwBA,YACA,WACA,YACA,SAEA,wDCdA,QACA,eACA,kBAIA,0CACA,eACA,EAGA,yBACA,8BAEA,gBACA,eAEA,wCCfA,SACA,aACA,eACA,SAEA,gDCEA,SACA,eACA,+BACA,QAEA,iDCfA,QACA,aACA,kBACA,OACA,cACA,8BACA,QAEA,QACA,QACA,CAEA,wCCXA,SACA,aACA,eACA,YAEA,gDCDA,SACA,eACA,+BACA,WAEA,iDCVA,QACA,aACA,kBACA,OACA,2BACA,iBACA,QAEA,QACA,QACA,CAEA,wCCdA,SACA,WACA,aACA,cAEA,UAEA,wCCbA,QACA,aACA,YACA,MACA,SACA,EAEA,YACA,OACA,SAEA,gCACA,IACA,kBACA,GACA,CACA,CACA,QAEA,gDCXA,SACA,aACA,aACA,4BAEA,WAEA,wCCVA,SACA,WACA,sBACA,EAEA,gDCOA,QACA,eACA,aAGA,iCACA,4BACA,QAEA,gDCTA,QACA,eACA,kBAIA,qCACA,UACA,sBACA,UAEA,gDCAA,SACA,aACA,aACA,mCAEA,YAEA,gDCPA,SACA,aACA,aACA,mCAEA,MAEA,gECxBA,4BACA,oCACA,QAEA,uFCKA,4BACA,cACA,sBACA,UAEA,qDACA,QAEA,+ECZA,4BACA,cACA,sBACA,UAEA,sCACA,iBAEA,+CChBA,QACA,WACA,aACA,cAEA,UAEA,gDCDA,QACA,aACA,aACA,4BAEA,WAEA,wCCXA,QACA,aACA,aACA,cAEA,mBAEA,wDCLA,8BACA,eACA,eAEA,YAEA,yECLA,4BACA,kCACA,KAEA,yFCGA,4BACA,cACA,sBACA,UAEA,gDACA,QAEA,iFCZA,4BACA,cACA,sBACA,UAEA,oCACA,cAEA,sDCfA,mBAEA,yDCHA,SACA,aACA,gCACA,IAEA,iBCfA,iBACA,eACA,YACA,MACA,WACA,OAEA,YACA,WACA,gBACA,OACA,CACA,QAEA,iDCLA,SACA,aACA,gCACA,IAEA,+CCAA,8BACA,SACA,iBAEA,2CACA,uBACA,SAEA,uCCkqBA,aACA,sCACA,OAGA,gBACA,IAEA,CACA,iBAIA,QACA,sBAGA,sCAIA,aAIA,8BACA,wDAEA,wBACA,UAEA,oBACA,kEAhuBA,QAkBA,IAEA,QAEA,kBA0BA,0HACA,mBAMA,eACA,CAQA,aAYA,uCAEA,sDAGA,GACA,aAKA,iCACA,UACA,EAKA,kBACA,sBAEA,wEACA,WAKA,aACA,wDACA,KAKA,YACA,uDACA,GAKA,iBACA,gDACA,CASA,kBACA,OACA,sBAKA,UACA,WAAkB,iBAAyB,OAC3C,oBAGA,cACA,eAKA,aACA,cACA,mBAEA,iCAEA,kBAKA,gBACA,8CACA,kBAKA,eACA,6CACA,kBAKA,iBACA,OACA,mBACA,mBAKA,kBACA,OACA,uBACA,mBAKA,kBACA,OACA,oBACA,mBAKA,kBAEA,yCACA,cAGA,6CAEA,8BACmC,eAAnC,IACA,iBACA,CAKA,mBAEA,yCACA,cAGA,mDAEA,8BACmC,eAAnC,IACA,i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A,EACA,EACA,EACA,EACA,KAOA,8BAEA,WAhBA,uBA2HA,yBA1GA,SACA,gBACA,UACA,4CACA,4BAGA,cAiGA,iBApCA,CACA,YAEA,oBACA,MACA,QAEA,IA8BA,gBA7BA,8BACA,OAEA,GA6BA,gCCqMA,eACA,UACA,aAEA,IAMa,CACb,aACA,gBAIA,6BACA,wCA/YA,SAmBA,IACA,OA4BA,eACA,gBASA,gDAEA,SACA,WACA,YAGA,kCACA,aAEA,uDAaA,iBACA,KACA,4FAAM,CAKN,0CAEA,aAEA,wBAAG,wBACH,MAAU,cAEV,wBACA,KACA,EACA,QACA,cACA,EACA,QAEA,UACA,QA4CA,OAOA,QACA,cACA,KASA,YACA,aACA,wBACA,yBACA,YAEA,OACA,IASA,YACA,aACA,YACA,cACA,aAEA,UACA,IAQA,mBACA,SACA,kBACA,0BACA,8BACA,2BAGA,gCACA,yBAEA,eACA,WAEA,KAEA,QAQA,uBACA,cAGA,8BAEA,UAEA,CAOA,UACA,wBACA,MAYA,aACA,cACA,mBAGA,YACA,+BAGA,kCACA,SACA,aAEA,mBACA,mBAEA,YAIA,gBAGA,UACA,UAGA,CACA,QAUA,WACA,UACA,qBACA,KAIA,SACA,QAQA,YACA,cAEA,iCACA,WAUA,8BACA,cACA,cAEA,YACA,kDACA,uDACG,iBACH,0BAEA,2BACA,+BAEA,kCACA,IAGA,aACA,cAEA,cACA,eAEA,UACA,IAQA,2BACA,MAEA,qBAEA,uBACA,gBACA,eAMA,cACA,gCACA,mCACA,aAEA,IACA,OAEA,CACA,QACA,QAEA,KAMwD,kGCzWxD,QACA,WACA,oDACA,OAEA,iBCzBA,aAeA,IACA,WAEA,qCAEA,0BACA,+BACA,sCACA,wCACA,oCAEA,oCCoKA,qBACA,OACA,YAGA,aACA,aAGA,eAMA,uBACA,qDAIA,qBAEA,oBACA,gCACA,WAEA,aACA,UACA,WAGA,0BACA,uBACA,aAIA,SACA,QAyBA,KAlOA,UACA,kBACA,WAEA,gBAIA,yBAIA,8BAEA,+CACA,kBACA,4CACA,WACA,EACA,CAyBA,MACA,UACA,kBACA,WAEA,eAIA,yBAIA,wBACA,8BACA,wBAEA,mCACA,8CACA,WACA,CAiDA,MACA,WACA,kBACA,qBACA,OACA,wBAEA,eAIA,sCAEA,oBACA,qBACA,CAYA,MACA,WACA,kBACA,SACA,qBAGA,WAIA,QACA,YAGA,2BACA,+BAEA,2BACA,qBACA,CAEA,MAiEA,UACA,kBACA,gCAEA,cAEA,0BACA,gCAIA,uBACA,iBACA,CAKA,MACA,UACA,kCACA,qCAnRA,QA0BA,mDC1BA,SAoBA,IA+EA,IA9EA,KAIA,cAOA,oBAQA,sCAA0C,aAQ1C,0BACA,IASA,UAEA,wCAGA,kCACA,UAQA,UAEA,cAGA,oCACA,YAUA,UACA,2CACA,iBACA,kCAEA,gBACA,4BAGA,IACA,QACA,kBCnGA,aAeA,IACA,WASA,YACA,2FC1BA,SAsBA,IACA,mBAIA,eACA,CAQA,yBAQA,wCAQA,wBASA,+BACA,iBACA,wBACA,mCACA,mBAEA,CAGA,sCAIA,8DACA,KACA,iBACA,CAKA,oCAEA,SAEA,uBAIA,oCACA,yBACA,QAEA,iCACA,4BACA,QACA,EAKA,OAEA,+BAEA,eACA,MAKA,QACA,mBACA,YASA,oBACA,YACA,CACA,yBACI,QACJ,wBAeA,eACA,KACA,2EAAM,CAGN,QACA,EACA,yBCtJA,qBA4BA,KACA,OAOA,oBAOA,MASA,qBAQA,OAQA,aAEA,4CACA,MACA,WAEA,oCACA,MACA,QAEA,qBAEA,oDAEA,iEAsBA,yBAQA,YACA,aACA,mCAGA,cACA,MAQA,SACA,MAEA,wBACA,YAEA,UAKA,OACA,MACA,WAKA,SACA,MACA,WAKA,UACA,iCACA,iEACA,8EACA,yBAaA,YAEA,yCACA,wCAEA,UAQA,UACA,QACA,2BACA,eAEA,EACA,yBC3LA,aAuKA,eACA,WAKA,kDAGA,aAAiB,MAAwB,WACzC,aACA,KAEA,wBAEA,iBACA,eACA,GAEA,IAEA,CACA,QAEA,CACA,eACA,UACA,yBAGA,qBAAmB,MAAmB,WAEtC,IAEA,YACA,UACA,gBACA,6BACA,iBAGA,cAEA,UACA,WACA,aACA,kBACA,wBACA,iBACA,iBASA,8BAGA,mBAEA,EAIA,CACA,iBA3NA,IACA,mBACA,eACA,CAWA,cAQA,kCAGA,cACA,SAKA,UACA,gBACA,oBAQA,YACA,8BAEA,YACA,mCACA,6BAGA,6BAAqB,SACrB,mBACA,SAKA,aACA,MACA,eACA,SAUA,yBACA,qBAGA,SAGA,sBACA,SAMA,WACA,0BAKA,gBAEA,OAGA,GACA,oBAEA,cASA,SACA,qBAGA,aACA,6BAEA,wBACA,UAIA,2BAGA,oCAGA,8BACA,qCACA,yBAGA,yBAEA,iBAGA,UAGA,6BACA,aAGA,4BACA,qBACA,CAEA,CACA,QACA,EAGA,uBCtKA,qBAsBA,IACA,mBAKA,iBACA,CAQA,cAcA,cAKA,UACA,qBAEA,kDACA,iFACA,aAuBA,SAAsB,KACtB,qBACA,aACA,gDAEA,gCACA,MAEA,kCAEA,wCAEI,kBACJ,oDACA,2BAEA,iBAEA,gCAEA,yCAGA,aACA,CACA,EACA,gFC9GA,iBAuBA,KACA,mBAIA,sBACA,gBACA,IAKA,wBACA,OACA,OAKA,OACA,cACA,uBAMA,oDACA,4BACA,cAEA,MAAI,EAAG,UAEP,QACA,EAuBA,oCCgCA,YACA,yBAA+C,OAAiB,iBAChE,O,wDAlHA,QA2BA,KACA,mBAIA,OACA,cACA,WACA,aACA,WACA,SACA,YAEA,iBACA,6BACA,yBACA,MACA,QAKA,yCAEA,wBAEA,6EAEA,2FACA,8BACA,GACA,cACA,aACA,mBACA,GACA,cACA,aAEA,mBACA,GACA,cACA,sBAEA,2CACA,MACA,gBAAwB,KACf,sCAAoD,oBAC7D,6CAAmE,UACnE,uCAAkE,UAIlE,8CACA,MACA,gBAAwB,KACf,iBAAa,CAAqB,sCAC3C,KACA,2BAGA,gDACA,MACA,gBAAwB,QACf,iBAAa,CAAwB,wCAC9C,SAA2B,qBAC3B,iCACA,kCAEA,UACA,KACA,SAEA,QAEA,4CACA,OACA,EAQY,qBC/GZ,aAyBA,IACA,SAA8C,kCAAgD,mBAC9F,oCAAkD,CAAS,YAC3D,IAIA,cACA,aACA,YAIA,OACA,IACA,wDCxCA,QAmBA,KACA,mBAOA,iBACA,CAEA,iBAAyB,yBAQzB,YAQA,kBAQA,kBAOA,qCAOA,wCAEA,mCAEA,mCACA,KACA,iBACA,OACA,mBAGA,0BACA,MACA,eAGA,YASA,oBACA,sBAEA,QAIA,SAHA,6BAEA,UAWA,sBACA,oBAEA,QAKA,SAJA,wBACA,8BAEA,OAMA,SACA,gBACA,QAKA,QACA,gBACA,OACA,8CCrIA,OAgBA,GACA,mBAIA,eACA,CAQA,kBAQA,kBAQA,eAQA,wBAEA,8BAEA,mCACA,KACA,mBACA,MACA,OAIA,2CACA,uBACA,6BAKA,iDACA,uBACA,EACA,EAKA,SACA,cACA,QAKA,QACA,cACA,OACA,uBC3FA,aA2CA,IACA,SAAwC,CAAO,QAC/C,sCACA,GACA,wBACA,SAAE,EAAG,CACL,+CCuTA,aACA,eAIA,iBACA,UAGA,wBACA,uBAGA,KACA,IAiBA,CAiUA,eACA,yBACA,mBAOa,CACb,aACA,mBACA,qEAptBA,SAeA,IAEA,oBACA,qBAwCA,KACA,mBAIA,eACA,CAEA,sBASA,4BASA,mBAiBA,uBASA,qBAUA,yBAQA,yBAgBA,+BAEA,yCACA,KACA,iBACA,OACA,CACA,wCAAuD,qBACvD,qBACA,6CACA,oCAGA,oBACA,UACA,mBAIA,0BAEA,SAOA,OACA,MACA,YAOA,OACA,MACA,YAiCA,YACA,MAEA,iBACA,0BAA2C,UAC3C,cACA,kBACA,GACA,sBACA,sBACA,sBAEA,qBACA,UAGA,qBAAS,cAA4B,eAErC,2BAAwB,cACxB,YAmCA,OACA,MAEA,2CACA,MACA,eAEA,sBAEA,cAEA,OAKA,4DACA,0BAKA,QACA,MAEA,iCAIA,+DAEA,0DAEA,UAEA,OASA,iBACA,MAEA,wBACA,wBAGA,sDACA,WAGA,cAGA,mBAIA,uBACA,UAEA,WAAG,EAAG,CAGN,sDACA,MACA,WACA,EAOA,eACA,iCACA,wCACA,SACA,EAOa,MAiCb,wBAkBA,GACA,sBA4KA,GACA,mBAGA,yBACA,KACA,qCACA,OAGA,wCACA,KACA,uCACA,2BAGA,yCACA,KACA,+BACA,2BAKA,yCACA,KACA,2BACA,OAGA,4CACA,KACA,qBACA,2BAGA,6CACA,KACA,6BACA,2BAKA,yCACA,KACA,4BACA,OAGA,4CACA,KACA,8BACA,2BAGA,6CACA,KACA,sBACA,2BAKA,qCACA,KACA,qCACA,OAGA,wCACA,KACA,uCACA,2BAGA,yCACA,KACA,+BACA,2BAKA,yCACA,KACA,2BACA,OAGA,4CACA,KACA,qBACA,2BAGA,6CACA,KACA,6BACA,2BAKA,yCACA,KACA,4BACA,OAGA,4CACA,KACA,8BACA,2BAGA,6CACA,KACA,sBACA,2BASa,4CClqBb,aACA,mBACA,WAEA,uBACA,6CACA,gCACA,GACA,kBAGA,sBA7BA,WACA,uBAEA,8DACA,SAEA,OACA,iBACA,CASA,gBApCA,SAkBA,iDClBA,SAoBA,KACA,mBAIA,wBACA,OACA,aAKA,sBACA,YACA,IACA,+ECnCA,QAoBA,KACA,mBAIA,sBACA,OACA,CACA,IAEA,IAIA,OACA,cACA,WACA,aACA,uBAEA,aACA,MACA,QACA,+BAEA,kBACA,MACA,QACA,mCAEA,8BAEA,sDAEA,mDACA,wDACA,sDACA,gBACA,eACA,kCACA,CACA,OAEA,eAIA,YACA,SACA,CAEA,uCACA,GACA,gBACA,0BAIA,kCACA,8BACA,wDACA,WACA,sBACA,iBACA,mBAEA,yBACA,uBAEA,UACA,gBAGA,QACA,CAGA,CACA,EASA,UACA,aAyDA,sBACA,0CACA,qDACA,eACA,KACA,gBACA,cA9DA,kBACA,MACA,yBACA,qBACA,0BACA,sDACA,UACA,sBACA,0BACA,8BACA,OACA,SAMA,sBALA,wBACA,8BACA,sDACA,YACA,IACS,aACT,sBACA,sDACA,0DAEA,eACA,iBACA,oBACA,oBACA,QACA,SAGA,SAFA,SAGA,YAAe,OAAe,KAC9B,UACA,MACA,sDACA,CACA,OAGA,SACA,GACA,GAAS,cAET,CACA,mCACA,SACA,2BAGA,WAEA,yBACA,wBACA,SACA,EACA,EAQA,0CC3JA,WACA,SAEA,8CACA,KAgBA,EArCA,IAsCA,WACA,WAEA,qBACA,gBAGA,oDAEA,WAGA,MACA,mBAGA,wBAGA,8BAKA,oBACA,eAEA,UACA,eAlDA,oBChBA,qBAiBA,IACA,mBACA,sCCYA,iBAGA,qCAEA,aAEA,4BACA,gBACA,4BAGA,+CACA,eAxBA,aACA,0BACA,UAQmD,UA9BnD,OAmBA,iOCnBA,SAqBA,KAEA,oCAEA,QACA,SACA,CACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IAEA,YACA,SACA,CAYA,0GACA,CAQA,oJCnEA,kBAwCA,KACA,mBAYA,iBACA,CAEA,yBACA,oCACA,uCAQA,kCACA,IASA,UACA,aACA,4CACA,kBAEA,gBACA,SA0CA,mBACA,yBACA,YAEA,WACA,IACA,8DACA,mBACA,MACA,cACA,UACA,mDACA,6BACA,sCACA,QACA,oBACA,QACA,QAEA,OACA,EACA,iFCjJA,SAsBA,KACA,mBAQA,iBACA,CAQA,cAGA,oCACA,kDAQA,8BAaA,4CAEA,WACA,eAKA,UACA,gBACA,mCACA,iCACA,sBACA,UAOA,WACA,WACA,MAKA,UACA,kBACA,KAKA,sBACA,+BACA,UAKA,4BACA,+BACA,SAQA,gBACA,cAGA,2DACA,IACA,aACA,gBAIA,oCACA,cAEA,oBACA,CACA,MACA,QAIA,sBAIA,kCACA,uBAGA,kBAEA,SACA,EACA,CAWA,mBACA,yBACA,YAEA,WACA,IACA,uBACA,QACA,oBACA,QACA,QAEA,OACA,EACA,oGC9KA,QAyBA,GACA,OAMA,eACA,wDAQA,6EAEA,2BAQA,kCAQA,yBAMA,yCAQA,4BAmBA,mBAQA,4BAWA,mBAcA,gBAOA,cACA,gBAkBA,iBACA,OAIA,iBACI,mBACJ,UACA,SAzBA,YAEA,wBAQA,eACA,uBAEA,sCACA,SAEA,CAbA,QACA,SACA,qBAEA,kCAEA,gBAwBA,UACA,kBAEA,gBAEA,8BAEA,uBACA,mBACA,eACA,oBACA,SACA,EAYA,cACA,uBACA,KAUA,iBACA,yBACA,YAEA,SACA,IACA,uBACA,QACA,oBACA,QACA,QAEA,OACA,EACA,QAEA,cA+CA,sBC1QA,qBAaA,IA2MA,IA1MA,KAOA,iBAOA,MAIA,mBAKA,0CAEA,UAuCA,SACA,wBACA,YAaA,YAGA,wBACA,eAcA,OACA,iCACA,UAYA,yBAEA,WACA,QAMA,iBAJA,0CAOA,SAGA,eAEA,oBACA,QAIA,WAIA,mBAEA,qBACA,QAGA,WAGA,eAMA,mCAIA,2BACA,QAUA,oBAEA,iBAGA,SAGA,uBACA,uBACA,GACA,KACA,KAGA,GACA,IAGA,UACA,WAUA,0BACA,6BACA,uBACA,OACA,EACA,yCCxNA,OAcA,IACA,OAWA,oBAKA,MAQA,oCAMA,sBAEA,cACA,+BAEA,WACA,yCAGA,aAKA,qBACA,qBACA,SACA,0BAGA,QAQA,OACA,sBACA,MAcA,aACA,cAkCA,UAKA,yBAIA,cACA,gBAOA,CAGA,iFAHmF,CAEnF,YAEA,EAEA,cACA,yBACA,GAEA,SACA,kCACA,SAEA,UAQA,qBAGA,+HAAS,UAIT,eACA,IAGA,WACA,WACA,YAEA,QACA,GACA,EAEA,cACA,OAIA,2CACA,MAEA,cAaA,OACA,YACA,mBACA,GACA,SApHA,YACA,aACA,KAEA,OACA,OACA,kBA8FA,MAEA,eACA,QACA,QAIA,0BACA,IAEA,CAvGA,SAaA,SAGA,gHAAyB,CAEzB,qCAAwD,CACxD,YAEA,sBACA,aAEA,MA2FA,UACA,oBACA,WACA,sBACA,yCAEA,0BACA,MASA,UACA,eAEA,mBAMA,6BAWA,WACA,KACA,qFAAK,uDAGL,0BAEA,SACA,yBClQA,qBAaA,GACA,OAIA,cAOA,mBACA,IAQA,SACA,gBACA,QAQA,OACA,uBACA,MAOA,gBACA,cAEA,UAOA,gFAA6F,CAG7F,0BACA,KAOA,SACA,sBACA,MAOA,YACA,sBACA,QAKA,oBACA,8BACA,WAKA,UACA,qBACA,aAEA,SACA,yBCtGA,qBAaA,KAsDA,IArDA,KAMA,eAOA,cAqBA,4BACA,KAOA,QACA,wBAGA,QAMA,iCALA,kBAIA,UAEA,+BCbA,eACA,CACA,MACA,aAEA,KASA,CA7DA,IAsCA,aACA,OACA,QAIA,0CADA,GAGA,EA5CA,GAmCA,uJC5CA,SA0CA,KACA,OAOA,iBAOA,MAQA,aASA,2BAeA,yCACA,aAEA,0DAAsD,UAetD,oCACA,UAQA,kDAA+C,UAC/C,uDAA6D,UAC7D,gEAAsE,UAEtE,WACA,2FACA,YASA,cAEA,kCACA,WAYA,aAEA,cAGA,gCACA,SAYA,UACA,aAEA,iBACA,KAOA,mBALA,mCAEA,gCAEA,iBAaA,gBAEA,oBAEA,yCAGA,sBACA,uCAGA,mCACA,0BACA,2CACA,SACA,EAYA,mBAEA,wBAGA,sBACA,YAiBA,qBACA,mCAA2D,SAC3D,KAKA,WAWA,qBACA,aACA,WAkBA,qBACA,QACA,WASA,qBACA,aACA,SASA,sBACA,eACA,OAWA,cACA,gBACA,aAGA,eACA,YAGA,0BAEA,iEACA,MAIA,SACA,QACA,QAEA,cAwCA,sBClXA,qBAcA,KAgEA,IA/DA,KAKA,iBAOA,MAQA,cAQA,YASA,yBAOA,uBAkBA,MACA,kBC7DA,iBACA,UACA,oBACA,GACA,SACA,CAEA,iBCLA,aACA,QAQA,OACA,OACA,mCAIA,MAEA,EACA,YACA,gBACA,MACA,YAGA,4FCnCA,cAGA,cAGA,0BAAgE,iBAiChE,sCACA,8BACA,QAGA,iCAFA,kBAGA,wBAEA,KAEA,uDChDA,OACA,WACA,iCACA,QACA,MACA,iBACA,kBAEA,4BACA,sBAGA,oCACA,UACA,eAEA,KACA,iBACA,OAEA,QAEA,UACA,CACA,QACA,EAEA,wCCvBA,mBAEA,sDCZA,SAyBA,MACA,WACA,IACA,kBAEA,cACA,sBACA,cACA,QACA,yBACA,gBACA,CAEA,kECnCA,aAGA,cAwBA,mBACA,WACA,YACA,WACA,iBACA,YACA,gBACA,UAEA,UAEA,cACA,OACA,MALA,yBAMA,qCACA,cAEA,OACA,CACA,QAEA,gCCpCA,aACA,aAEA,aACA,aACA,UAEA,QACA,QAGA,kBAzBA,cAGA,oBACA,qBASA,2BAY4D,iBAC5D,0BACA,oBACA,KAGA,+CChCA,UAEA,2BCLA,GAGA,aACA,OACA,KAAC,IAED,GAEA,0CACA,OAAC,SAED,CACA,4BACA,OAI4C,CAE5C,2BCdA,iBACA,WACA,+BACA,IAEA,iBCLA,iBACA,WACA,QAGA,MAFA,gBAGA,eAEA,OACA,QAEA,iBCXA,iBACA,UACA,MACA,WAEA,wCCRA,YAGA,cAUA,WACA,WACA,YACA,kBAEA,aACA,IAEA,wBACA,EAMA,MALA,QAEA,iBAEA,KAGA,wCCvBA,QACA,WACA,YACA,kBAEA,iCACA,EAEA,wCCRA,QACA,WACA,QACA,8BAEA,wCCJA,QACA,aACA,YACA,kBAEA,gBACA,YAEA,YAEA,KACA,IAEA,wCChBA,QACA,UACA,kBACA,IAEA,iBCLA,iBACA,WACA,sBACA,YAEA,iBCLA,iBACA,WACA,sBACA,MAEA,iBCLA,iBACA,WACA,sBACA,MAEA,gDCTA,SAYA,aACA,YACA,6CACA,QAJA,gCAMA,aACA,SACA,IAEA,yDCfA,SACA,UACA,eACA,SACA,kBACA,eAEA,KAEA,gCCNA,aACA,QACA,eAEA,WACA,eACA,OACA,qBACA,GACA,CAEA,6CAZA,KAaA,sBACA,0BACA,oBACA,oBACA,gBAEA,gDCvBA,QACA,UACA,+BACA,QAEA,iBCJA,iBACA,WACA,iCACA,WAEA,wCCXA,aAMA,cAUA,mBACA,WACA,YACA,gBACA,OACA,WACA,KAnBA,oCAoBA,oBACA,WAEA,wCC1BA,aAGA,cAUA,mBACA,WACA,YACA,oCACA,SAEA,wCCnBA,QAYA,aACA,YACA,0BACA,WAJA,8BAKA,IAEA,wCCXA,QACA,WACA,4BACA,YAEA,iBCTA,iBACA,WACA,OACA,sDACA,aACA,gBACA,QAEA,wCCJA,QACA,WACA,4BACA,MAEA,wCCLA,QACA,WACA,4BACA,MAEA,wCCJA,QACA,aACA,4BACA,SACA,IAEA,iBCTA,iBACA,aACA,YACA,MAEA,OACA,gBAIA,aACA,QAEA,iDCVA,QACA,aACA,gCACA,UAEA,iBChBA,aACA,aASA,SACA,WACA,UACA,UAEA,iBCRA,iBACA,aACA,CACA,cAEA,kCACA,QAEA,SADA,SAGA,iDCPA,SACA,aACA,6BACA,UAEA,0DCLA,QACA,WACA,0BACA,IAEA,gDCFA,QACA,eACA,OACA,2CACA,KAEA,gDCfA,sBAEA,gECFA,sBAEA,+DCFA,s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ACA,kBAEA,6CACA,SAEA,CACA,QAQA,CACA,eACA,QAEA,UACA,IAEA,OACA,WAEA,SACA,OACA,UACA,CACA,iBAGA,OAEA,MACA,WAEA,SACA,OACA,UACA,CACA,iBAGA,OACA,CACA,sIAxgBA,OA6BwD,KAExD,QAcA,aACA,OAKA,cAUA,cAOA,iBAUA,0BAQA,sBAQA,4BAQA,WASA,iCAGA,0CACA,+BACA,qBAQA,oCACA,8GAA8E,CAG9E,SAGA,mBACA,UAQA,gBACA,aACA,UAUA,kBACA,yBAOA,iBACA,KACA,sGAAK,CAGL,wBAEA,gBAEA,kCAEA,yDACA,KAQA,SACA,gBACA,OAWA,+BACA,eAQA,gBACA,KACA,kFAAK,CAIL,yBACA,UAGA,kBADA,UAMA,UACA,gBACA,eACA,eAaA,kBACA,yBAEA,uCACA,2BACA,6BACA,0BAGA,kBACA,cACA,CAQA,kBACA,gBAOA,gBACA,KACA,kFAAK,CAIL,2BACA,MAQA,WACA,mBACA,MAOA,eACA,kDACA,KAqBA,qCAEA,sBAA2B,cAC3B,qBAGA,cAEA,cACA,2BAAqC,2BAGrC,0BACA,0BAAoC,CAGpC,yCACA,kCACA,mBAEA,mDACA,4BAGA,2BAA4B,uBAC5B,gCAEA,aAEA,OACA,KAkBA,0BACA,0CACA,KAOA,SACA,qBAGA,MAGA,mBADA,oCAUA,kBACA,2BACA,qBACA,UAIA,qBACA,SASA,mBACA,cAGA,uBACA,mBAGA,yCACA,OAUA,2BACA,wBACA,IA8CA,QAEA,cAGA,kHCrdA,SAyBA,4GCzBA,SAkBA,KAEA,WACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,iBAMA,IAYA,IAXA,KAQA,qBACA,yBACA,aACA,yCClBA,QACA,aACA,eACA,SAEA,qGCzBA,OAIA,uBACA,mBAGA,2BAGA,cAgBA,mBACA,qBACA,cACA,iBACA,QACA,IAGA,iBACA,UAGA,uBACA,UAEA,8BACA,wBACA,UAEA,WACA,mBACA,gBACA,eACA,yBAEA,2BAjDA,GAkDA,mBACA,6BAEA,uBACA,WACA,gBAEA,0BACA,MACA,YAC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ACA,IAbA,sBAeA,QACA,GARA,sBAUA,sBACA,KACA,CAEA,wCCnBA,QACA,aACA,iCACA,UACA,KACA,EAEA,iBCXA,iBACA,WACA,QACA,YAEA,MAIA,4BAHA,QACA,KACA,IAGA,4FCRA,QAWA,aACA,+BACA,2BAEA,sBACA,cACA,6BACA,aACA,iCAlBA,CAmBA,CAVA,EAWA,CAEA,iDC5BA,OAGA,wEASA,oCACA,IACA,MAIA,iDAHA,4BACA,KACA,IAGA,uCCyBA,eACA,6BACA,8BAEA,8BACA,OACA,gCACA,OAEA,WACA,gBAEA,qBACA,QAEA,iBADA,UAEA,EAEA,4BADA,MAGA,SAlEA,OA6CA,sBAsBA,QAEA,gDClDA,SACA,WACA,0BACA,OAEA,iDCvBA,cAIA,uBASA,oBACA,WAEA,IACA,mBAEA,mBACA,2BAEA,WACA,0BApBA,GAqBA,MAEA,iDCFA,SACA,aACA,iCACA,IAEA,iBC1BA,iBACA,aACA,YACA,UAEA,mGCKA,QACA,eACA,+BAEA,mBAEA,MAEA,OAHA,SAIA,mBACA,sBACA,QAEA,QACA,IACA,CACA,KAEA,0BACA,oCACA,mDACA,QAEA,kECdA,QACA,WACA,0DACA,OAEA,wCCvBA,SACA,WACA,mBACA,eACA,SACA,CAEA,gDCHA,SACA,iBACA,SAEA,oBACA,QACA,eAEA,gCACA,QACA,MAEA,qBACA,QACA,OAEA,OACA,QAEA,iDC3BA,QA6BA,WACA,uCAFA,YAGA,CAEA,iBC7BA,iBACA,eACA,CASA,MARA,SACA,eAEA,UACA,eAGA,YAGA,wCCZA,QACA,aACA,SACA,OAGA,qBACA,mBACA,WAEA,iBCVA,iBACA,iBACA,aACA,MAEA,OACA,YACA,QAGA,gBACA,CAEA,wCCbA,SACA,aACA,YACA,MAEA,SAEA,SACA,YAJA,6BAMA,MACA,QAEA,iDCZA,QACA,aACA,qDACA,GAEA,wCCNA,QACA,aACA,UACA,OACA,aACA,WACA,eAEA,UACA,aACA,WACA,eAEA,uBACA,kBACA,IACA,SACA,OACA,SAEA,kBACA,kBACA,IACA,SACA,OACA,UAEA,CACA,OACA,EAEA,0DCnCA,+CASA,aACA,WACA,OAEA,2BCJA,iBACA,UAEA,CAEA,iFCHA,QACA,iBACA,+BAEA,mBACA,MACA,OAGA,oBACA,mBACA,wBACA,IACA,aANA,EAOA,OACA,SACA,gBACA,eACA,wBAGA,YACA,QACA,WACA,GACA,IACA,CACA,QAEA,qnBCmBA,SAGA,8DACA,2EACA,+DACA,oEACA,8EACA,sDACA,gEACA,kFACA,qFACA,kEACA,8DACA,2DACA,qEACA,oCCuCA,mBACA,WACA,WAEA,kCAEA,WACA,cACA,kBACA,kDAhIA,SAqBA,GACA,mBAIA,WACA,OACA,QAQA,yBACA,CACA,QAKA,uBACA,OACA,gCACA,EAmBA,MACA,qCACA,gCACA,6BAEA,cAMA,iBAGA,0GAKA,gBAMA,qBAHA,QAIA,IAQA,GACA,sCACA,gCAEA,+BAMA,qBAGA,oHAEA,6BAEA,MACA,IAAC,GAaD,iCClIA,qBAcA,GACA,mBASA,0BACA,CAQA,cAQA,YACA,UAUA,eACA,aACA,IAKA,QAEA,gDAIA,gCAFA,KASA,SACA,aACA,QACA,yBC3EA,qBAaA,GAiLA,IAhLA,KAIA,cAOA,MASA,kCAYA,wBAQA,2BACA,IAOA,YACA,mEACA,sBAEA,YACA,uCACA,cACA,CAWA,oBAEA,IAKA,oCAGA,iBAKA,iCACA,sBAEA,UACA,eAGA,MACA,OACA,EAQA,YACA,6BAEA,mCACA,UASA,sBACA,iBACA,4BACA,MAQA,kBACA,wBACA,MAQA,iBACA,2BACA,MASA,kBACA,wBACA,MAQA,aACA,6BAGA,qBACA,0CACA,gCAEA,eAEA,YAQA,gBACA,mFAEA,CACA,QACA,kBC9LA,aAaA,IACA,aACA,cACA,KAGA,oCACA,0BACA,6BAEA,QACA,MAEA,QAEA,CACA,wCCmrBA,iBAEA,oBACA,aAGA,cACA,SAGA,WACA,WAGA,oCAEA,qBACA,MACA,IAEA,QAEA,SAEA,CACA,QAMA,uDA/uBA,SAqCA,GACA,OAIA,cAQA,iBASA,oBAQA,oBAQA,8BAGA,uBACA,2BACA,4BACA,qCAEA,sBAAe,sBACf,qBAAe,uBAEf,2BAMA,8CACA,oBAAe,uBACf,oBAgBA,SACA,+DACA,WAQA,YACA,kEACA,WAgBA,uBACA,kBACA,oBAoCA,SACA,oBACA,MAIA,uBACA,YAKA,sCAIA,6BARG,4CAWH,gDACA,UAIA,kEACA,YAIA,0BACA,oBACA,8BACA,gBAWA,qCAIA,WACA,wBAGA,YAEA,eACA,2CACA,CACA,KACA,KAKA,IACA,GAEA,QAEA,CACA,QAQA,WACA,oBACA,MAWA,kBACA,SAMA,yBAGA,8FACA,yBAIA,oGAOA,sEACA,0BACA,QASA,iBACA,4BACA,yBAGA,0GAEA,0BACA,KAaA,+BACA,MAEA,8BAAuB,0CACpB,mBACH,WAGA,qBACA,yBAEA,sBAIA,gDAEA,wBAAuB,kCAEvB,eAEA,QAEA,CAGA,CACA,QASA,oBACA,MAEA,uBACA,SACA,UACA,gBAEA,iCACA,sBACA,6BAEA,iBAAuB,iBACvB,oBACA,sBAGA,eAGA,kBACA,YAEA,OACA,sBAEA,UAEA,CACA,QASA,mBAEA,oBACA,oBAEA,+BAII,uBADJ,oBAGA,8BACA,SACA,YAMA,OACA,QAYA,kCACA,kBACA,gCACA,oBACA,wBAGA,sCAAsB,qBAGtB,4BACA,8BAAwB,qBAExB,iBAEA,uBAMA,yBACA,uEAEA,QACA,CAUA,YACA,UACA,yBAGA,+FACA,MASA,8BACA,IAEA,gBACA,iBACA,oBACA,cACK,aACL,WAGG,iCACH,aAEA,OACA,mBACA,UAGA,SACA,SAAG,aACH,oBAGA,MACA,QACA,EAQA,MACA,OAMA,eAOA,MAQA,eAQA,iBAQA,oBACA,sBAQA,WACA,eACA,eAQA,cACA,eACA,kBASA,qBACA,0BACA,OAOA,SACA,qBAGA,MAGA,iBADA,kBAWA,gBACA,KAEA,eACA,YAGA,cACA,qBAAyB,QAEzB,aAUA,eACA,wCACA,YAEA,cACA,UACA,wBAIA,MACA,QAUA,4BACA,IAEA,8CACA,CAEA,cACA,4BACA,CACA,KACA,KAGA,CACA,KAEA,KAEA,CACA,QAWA,wBACA,cAEA,wBACA,kBACA,aAIA,SACA,QAmC0B,uEC/sB1B,OAyBA,GACA,O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AEA,6EAMA,sBAKA,8BACA,YAEA,8BACA,4BAEA,wBAQA,wBACA,WAGA,mBACA,uEACA,mDACA,+CACA,0CACA,oEAIA,uCACA,kCAIA,oEACA,+CAGA,iBACA,iBAEA,4BACA,wCACA,2BAGA,kFACA,UAQA,uBACA,qCAGA,uBASA,wFACA,6DAEA,6BACA,4BACA,QASA,4BACA,uBAEA,yBAGA,sCAEA,2CACA,WAIA,qEACA,SACA,CACA,qCAGA,WAOA,WANA,KAKA,sHAIA,CACA,QAOA,sBACA,kCACA,WAEA,+BACA,WACA,kCAEA,gBACA,uBAEA,iBACA,CACA,CAOA,uBACA,cAGA,6BAEA,QAOA,eACA,mBACA,wBAGA,qCAEA,QACA,CACA,QAEA,kCCrsBA,aAeA,IACA,eACA,mCACA,sBClBA,aAaA,IACA,WACA,WAGA,gBAEA,+BCpBA,aAcA,IACA,WACA,OAEA,SACA,qBACA,gBAGA,IACA,wCCxBA,IAkBA,aACA,gBACA,iBAEA,cAGA,mBACA,MAGA,yBACA,YAbA,2CCiBA,QACA,eACA,GACA,sCACA,oDACA,EAEA,yDCzCA,QA2BA,KACA,mBACA,eACA,CAWA,6CAQA,UAQA,4BAUA,8BASA,gCASA,6GAEA,0DAQA,gDACA,CAKA,WACA,WAGA,8BAIA,+CACA,MACA,yBAEA,mBACA,OAKA,UACA,OAEA,6BACA,mEACA,QAUA,0BAIA,4DAKA,mCAIA,8BACA,mCAEA,wEAOA,8BASA,2BAKA,qBAHA,mHAMA,2BACG,aACH,SACA,mBACA,UACA,eAIA,mCAMA,0BACA,oCACA,GAOA,qBACA,uBACA,CACA,EAqCA,qBC9NA,aACA,WAEA,2BCnBA,qBAsBA,IACA,mBACA,eACA,CAEA,cACA,mCAEA,+BACA,GAMA,6DACA,EAEA,sBACA,qBAEA,iCACA,YAGA,eAEA,SAQA,EAEA,cACA,aACA,OAKA,UACA,MACA,oCAGA,wBACA,SACA,EA4BA,4CCrGA,QAkBA,IACA,mBACA,eACA,CAEA,cACA,gCAEA,cACA,oBACA,WAEA,iBACA,4BACA,mBAEA,wBACA,oBACA,KAEA,GACA,EA4CA,oCCoCA,aACA,eACA,mBACA,kBACA,gBACA,mCA5HA,QAsBA,KACA,mBAMA,eACA,CASA,6GACA,IAKA,UACA,cAEA,+BACA,WAEA,uCAEA,cAEA,6CAEA,SAAG,EAAG,UACN,UAKA,UACA,OAEA,iDACA,QAeA,wBACA,uBACA,gBACA,yBAGA,sCACA,YAIA,6CACA,cAGA,wBACA,CACA,eACA,4BAIA,yBAMA,0BACA,oCACA,EAMa,oCC3Fb,WAA6C,2BAA6B,GAC1E,SACA,YACA,OAGA,QACA,IAQA,KACA,KAEA,KAIA,SAMA,IAKA,gBAEA,OAEA,WAKA,YAKA,UAJA,iBAEA,OAGA,CAOA,CAyDA,iBACA,0BACA,0BACA,iBAEA,kCAEA,gCACA,IAAO,WAEP,aACA,kBACG,MACH,uBAKA,UACA,mBACG,OACH,sBAGA,WACA,aACA,CAMoB,CACpB,eACA,SACA,eAEA,gBACA,QACA,iBAEA,gCACA,cACA,4BACI,IACJ,iCAGA,QACA,8BACI,KACJ,iCAIA,YAEA,UAMsC,CACtC,eACA,mBACA,MAMsC,CACtC,eACA,gBACA,GAMsC,CACtC,eACA,iBACA,IAMsC,CACtC,eACA,kBACA,KAMa,CACb,aACA,eACA,uCAEA,4BAEA,WAMa,CACb,aACA,mBACA,SAGA,wBAKA,wBAJA,gBAGA,aAEA,UAEA,UAQa,CACb,eACA,SACA,UAEA,WACA,MAEA,gBAEA,WACA,WACA,0BAEA,gDAEA,SACA,MAGA,CACA,uBAtSA,SA0BA,KAmEA,iBACA,CACA,6BA2CkB,4BAvDlB,WACA,SAEA,SACA,OAEA,QAGA,mBC5FA,aAcA,IACA,WACA,OACA,qFCjBA,IA4BA,aACA,cACA,WACA,kBAEA,KAEA,sBACA,qBAGA,iCAEA,wBACA,iCACA,aACA,QAEA,EACA,WApBA,mBC3BA,aAgBA,IACA,WACA,oBACA,uBAGA,QACA,0BCvBA,aAgBA,IACA,aACA,aACA,yBAGA,WACA,4BCPA,aAeA,IAdA,KAOA,WACA,oDACA,sBACA,gBAEA,iBACA,SACA,0DC/BA,SAkBA,KAmFA,IAlFA,KAOA,iBAIA,MAKA,cAKA,gCAKA,6BAQA,kDAGA,uCACA,yCAGA,kEACA,4CAEA,iDACA,wEAIA,gDACA,qCACA,gDACA,wBACA,iCACA,gBAKA,OACA,cAEA,iBAEA,YACA,gFAGA,8BACA,kBACA,6BACA,sCACA,6BAEA,SAKA,UACA,WACA,SACA,oBCrGA,qBA4BA,GAiGA,IAhGA,KAOA,eAOA,MAQA,6BACA,IAOA,SACA,wBACA,MAWA,SACA,SAOA,gBACA,uFAAwF,CAIxF,0BACA,QAYA,UACA,UASA,gBACA,+FAAgG,CAIhG,oDACA,OAQA,OACA,yBACA,MACA,kBC7HA,aAyBA,IACA,SACA,CACA,SACA,yBACA,qBACA,UACA,cACC,aAGD,SAGA,gCACA,8BAEA,eAGA,MAEA,QAEA,IAGA,iCACA,gBACA,cAGA,WAGA,IAEA,IACA,mBC/DA,aA6BA,IACA,WACA,cACA,WACA,CAKA,yBAMA,CAEA,aAPA,CAIA,4EC3CA,SAoBA,GACA,mBAMA,eACA,CASA,6BAQA,wBAEA,yCACA,YACA,OAKA,yDAQA,0BAEA,0BACA,gCACA,SAKA,sBACA,sBACA,OACA,uDC1EA,QAeA,GACA,mBAMA,eACA,CACA,sBACA,WAOA,wBAOA,wBAQA,oBAQA,kCACA,yCACA,KACA,iBACA,CAKA,yDACA,kBACA,aACA,uBAA6D,2BAE7D,aACA,CACA,KACA,kBACA,IAAsD,2BACtD,SAEA,4BACA,GAEA,sBACA,KACA,iBACA,OACA,mCAEA,8BAEA,KACA,KACA,iBACA,OACA,uBAEA,8BAIA,QACA,8CClGA,OAkBA,GACA,mBAMA,eACA,CASA,wBAQA,kBAKA,OACA,MACA,8BACA,MAKA,UACA,sCAEA,eACA,SAOA,wBACA,+CACA,KACA,iBACA,CAMA,qEACG,OAEH,uBACA,cACA,8CCrDA,SACA,aACA,eACA,eAEA,wCClCA,SAaA,GACA,mBASA,iBACA,CACA,wBACA,oBAOA,kBACA,+BAIA,YACA,MACA,4BACA,OANA,8BAEA,YAOA,+BACA,8CC7CA,OAgBA,GACA,mBAQA,iBACA,CAEA,sBAGA,mCAGA,yCACA,KACA,iBACA,OACA,sCACA,cAC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A,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GAGA,KACA,UAAqB,IAAa,OAClC,MASa,uBCjVb,aA+BA,IACA,aACA,aA4CA,OACA,UAEA,KAEA,cACA,aACA,OACA,MAnDA,YACA,EAEA,EAsCA,sBArCA,CACA,YAEA,IACG,KACH,eACA,wBAEA,OAEA,MACA,MACA,SACA,gBAIA,QAEA,OACA,YAEA,WAEA,MACA,MACA,SACA,gBAIA,GAEA,GAEA,6CCzEA,QAgBA,KACA,mBAQA,iBACA,CASA,gCACA,WAOA,aACA,aACA,OAKA,UACA,OAEA,uBACA,SAgBA,SAAsB,KACtB,qBACA,mBACA,OACA,8BACA,oBAEA,iCACA,WAEA,yBAGA,6BAIA,6CAIA,sDAGA,gEAGA,8BAEA,sBACA,QACA,EACA,qDCtGA,SAiBA,KACA,mBAIA,wBACA,OACA,QAEA,OACA,cACA,mBAEA,mBAEA,8CACA,8CAEA,6CACA,2DAA8E,wBAC9E,aACA,mBACA,sBACA,EACA,mFCzCA,SAsBA,KACA,mBAQA,iBACA,CASA,cASA,yDACA,mBAYA,SAAsB,KACtB,qBACA,uBAEA,0BACA,cAEA,yCAOA,eAGA,iBACA,iCAAgD,iCAIhD,oEACA,GAMA,iBAJA,0CAKA,YAGA,aAEA,wDACA,WACA,iBAAuB,yCAEvB,aAEA,wCAAiE,CACjE,yCAEA,+CAEA,yBACA,QACA,EAoBA,+CAEA,IACA,IAGA,6BACA,aACA,qBAIA,sCAEA,4BACA,GAGA,4BAAgC,2BAChC,OAGA,4BAKA,aAKA,0BAOA,qCACA,qBACA,aACA,qBACA,6BAEA,2CACA,2CAEA,iBACA,iBACA,sDCrLA,SAiBA,IACA,mBACA,eACA,CAEA,eAEA,sBACA,wCACA,eAEA,EAEA,yBACA,MAEA,wBACA,mBACA,iBACI,mCACJ,sBACA,kBAEA,gBAGA,iCACA,gBAEA,gCACA,YACA,EAKA,WACA,EAcA,6ECpEA,kBAkGA,KACA,mBAIA,sBACA,QACA,IAIA,wBACA,OACA,MAIA,OACA,cACA,WACA,8CACA,+CACA,6BACA,kCACA,wCACA,OAUA,oBACA,cACA,oBACA,wCACA,YACA,QASA,aARA,CACA,QACA,OACA,YAEA,sCACA,6CACA,aAEA,EACA,qDCrJA,SAoBA,KACA,mBAIA,eACA,CAwBA,gCACA,QAKA,OAEA,gCACA,uCAGA,6CACA,mDAEA,qEAEA,6BAGA,0DAEA,yBACK,+CAGL,2BACA,8BAKA,kCACA,OAAG,EAAG,UAEN,8DACA,mBACA,WACA,EACA,yBCzFA,qBAmBA,KACA,mBAUA,gBAEA,qEAEA,4BAIA,2CACA,sBAEA,wDACA,mEAEA,mCACA,QAEA,QACA,SACA,EAMA,uBCvDA,qBAoBA,KACA,mBASA,UACA,qBAIA,8CACA,8CACA,gCACA,sCAEA,mEACA,2BACA,MAEA,QACA,SACA,8CC9CA,OAkBA,GACA,mBAIA,cACA,CAEA,qBAQA,sBAUA,8BAEA,mCACA,KACA,SACA,wCACA,OACA,uBAMA,gDACA,gBACA,sCACA,iBAEA,WACA,6DAEA,GACA,EACA,8CCnEA,OAgBA,GACA,mBAIA,eACA,CAQA,yBAqBA,wBAEA,kBAEA,mCACA,KACA,kBACA,OACA,CACA,kCACA,iDAGA,mBACA,CACA,KAEA,kBACA,CAKA,qCACA,CACA,WAMA,aACA,qBCnFA,U,yPCAA,U,0RCAA,QA8BA,KACA,mBAIA,sBACA,QACA,IAIA,wBACA,OACA,uBAIA,OACA,gCAKA,gGACA,GACA,EAMA,MACA,OAQA,mBAMA,MAMA,cAMA,WACA,GAOA,SACA,2BACA,MACA,oBACA,yBACA,cACA,EAOA,QACA,MACA,cAEA,OAMA,eACA,qBACA,mCACA,uBACA,MAQA,oBACA,cACA,WACA,cACA,6BAA4D,eAC5D,mCACA,qCACA,mCACA,WACA,qBACA,gBAEqB,WACrB,4CADA,UAIA,KACA,kDACA,GACA,mCACA,mBAEA,OAEA,EAMA,eAEA,YACA,wCACA,oCAEA,iBACA,OA4BA,yCCpMA,QAgBA,GACA,OACA,cACA,oBAQA,gBASA,4BAEA,qBACA,eACA,MACA,CAOA,YACA,qBACA,KASA,QACA,cACA,4BAEA,wBACA,cACA,KACA,OAEA,gBACA,GACA,QAEA,gBACA,GACA,UAEA,eACA,gBACA,EAKA,QACA,cACA,OACA,QAEA,+CCjDA,aACA,KACA,4CAEA,sBACA,iBACA,sCAEA,kBACA,kCAEA,GAEA,OACA,KAOA,CACA,eACA,iEACA,SAMa,CACb,aACA,OACA,cAEA,6BAEA,6BAAiB,MAAuB,WACxC,yBACA,+BACA,eAEA,CACA,SAzEA,IAaA,UACA,OAEA,KAMA,YALA,cACA,KAGA,SAQA,EA3BA,QACA,gBACA,KAQA,sFCrBA,SAkBA,GACA,mBAIA,wBACA,OACA,YAKA,YACA,MACA,2BACA,kCACA,8BACA,2BAWA,sBACA,qBAEA,eAEA,gDAGA,sBAEA,qDAEA,eAeA,6BACA,qBAEA,eAEA,sDACA,gDAIA,eAKA,+DACA,0DAIA,iBAEA,+CAGA,OAaA,yBACA,iCACA,6BACA,gCACA,WACA,gBAAuC,QAGvC,qCACA,MAAY,CAEZ,iCAAwC,CACxC,SACA,EACA,EAUA,4BACA,0BAEA,2CAEA,aACA,8CC7IA,OAsBA,IA8FA,IA7FA,KA+BA,mBACA,IAEA,MACA,qBACG,QAIH,QACA,MAAW,CAGX,uBAA8B,CAC9B,SACA,CAEA,mCACA,IACA,sBAGA,UACA,YAKA,yCAEA,uBACA,MAGA,iBACA,aAGA,qCACA,GAGA,iBAMA,yCAEA,oBAGA,mEAGA,UAEA,YAAe,YACf,SACA,EACA,EACA,oBCpHA,aAmNA,aACA,2DACA,YAhMA,KA6La,IA5Lb,KA8CA,mBACA,IACA,GACA,EACA,EAEA,cACA,QAEA,IAGA,IACA,mBAEA,IAIA,eACA,IACA,QACA,MAEA,UAEA,2BAIA,iBACA,CACA,QACA,IACA,IAIA,uBACA,OAGA,eAEA,OAEA,UACA,cACA,6BAGA,UACA,UAEA,wCAGA,eACA,CACA,SAEA,SAGA,gBACA,UACA,UAEA,oBAEA,qCACA,IACA,sBAGA,UACA,aAGA,0BAEA,gDACA,OAGA,uBACA,8BACA,UACA,KAGA,2BACA,2BAIA,eACA,gCACA,OAEA,IAEA,QAGA,8CACA,2BAIA,eACA,gCACA,OAEA,IAEA,eAIA,sCAEA,oBAEA,4BAGA,oBAGA,gBACA,UAEA,SACA,EACA,EACA,yDC5MA,iBAiBA,KACA,mBAIA,sBACA,QACA,IAIA,wBACA,OACA,MAIA,OACA,cACA,WACA,mBACA,UAEA,+CACA,YACA,QAUA,aATA,SACA,eACA,EACA,YAEA,qDAEA,qDACA,UAGA,sBACA,OACA,6DCxDA,QAYA,KAEA,QASA,OACA,mBAIA,OACA,cACA,WACA,SAGA,gCAAiC,oCAEjC,mCAAiC,oCAGjC,uDACA,aACA,2BAGA,8BACA,yBACA,sBACA,mBACA,gCAGA,sCACA,UACA,qBCrDA,U,8qCCAA,iBAiBA,KACA,mBAIA,sBACA,QACA,IAIA,wBACA,OACA,QAIA,OACA,cACA,WACA,mBACA,YAEA,iDACA,YACA,QAUA,aATA,SACA,iBACA,EACA,YAEA,qDAEA,qDACA,YAGA,sBACA,SACA,6DCxDA,QAYA,KAEA,QASA,SACA,mBAIA,OACA,cACA,WACA,SAGA,gCAAiC,oCAEjC,mCAAiC,oCAGjC,uDACA,aACA,2BAGA,yBACA,yBACA,kBACA,mBACA,iCAGA,sCACA,UACA,qBCrDA,U,iuBCAA,kBAoBA,KACA,mBAIA,sBACA,QACA,IAIA,wBACA,OACA,YAIA,OACA,cACA,WACA,mBACA,0DACA,YACA,QAUA,aATA,SACA,sBACA,EAGA,qDAEA,qDACA,gBAEA,EAIA,YACA,cACA,wBAMA,oEACA,qBACA,yCACA,6CACA,4BACA,uCACA,yBACA,mBAEA,OACA,EACA,8DC7EA,QAsBA,IACA,mBAIA,OACA,cACA,oBAEA,sCAEA,wBACA,sBAAiB,0BACjB,kBAAiB,sBAEjB,wCACA,yBACA,wBAEA,6DACA,yBACA,wBACA,aAKA,YACA,8BAIA,iBACA,qBACA,MACA,kBACA,aAGA,8BACA,sCC6HA,aACA,4CACA,IASa,CACb,aACA,OAEA,EADA,OAGA,uBACA,SACA,WAGA,aAGA,sBACA,sCACA,mBAGA,MACA,GAEA,CACA,QAEA,CACA,eACA,iBACA,MACA,wBAEA,4BACA,QACA,6BACA,2BAGA,qBACA,oCA5OA,OAoBA,IACA,mBAYA,UACA,iBACA,gCACA,eAYA,SAAsB,KACtB,qBACA,aACA,oBACA,iCAEA,0CACA,SACA,4BACI,eACJ,kBAGA,WAGA,aACA,gBACA,CACA,EAQA,YACA,oDAGA,iCACA,KAQA,gBACA,SACA,MAGA,sCACA,iCAEA,uBAMA,gCACA,MAaA,kBAEA,6BACA,6BACA,QAMA,6BAJA,6BAKA,kCAEA,QAGA,cADA,SAKA,OACA,mBAKA,mCAEA,UACA,SACA,EASA,iBACA,MAGA,kCACA,WAGA,qBAEA,gBAGA,aACA,OAMA,sBACA,SACA,4BAOA,qBACA,qBCzLA,U,g+BCEA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAAkI,2GAElI,2DCPA,SA2BA,KACA,mBAIA,sBACA,OACA,CACA,IACA,IAEA,IAKA,wBACA,OACA,WACA,qDC9CA,QAsBA,KACA,mBAIA,sBACA,QACA,IAKA,OACA,cACA,WAEA,0CAEA,kDACA,+BAEA,2BAIA,iCAEA,qDACA,gBAEA,kBACA,EAIA,MACA,OACA,iBACA,MAEA,qBACA,QAEA,SACA,gEAEA,6CACA,2BACA,6BACA,QAEA,qBACA,MAEA,QACA,mBACA,OAIA,EACA,iBA2CA,qBC9HA,qBAWA,KA2DA,IA1DA,KAOA,iBACA,IACA,mBAGA,6BACA,mBASA,qCAQA,cACA,aAwBA,UACA,mCACA,YACA,iCCkJA,mBACA,IACA,oBACA,sBAEA,KAEA,eAAuB,MAA4B,YACnD,mBACA,eAEA,kBAAmB,MAAkB,OACrC,WAGA,wBACA,eAEA,mBAAgC,CAChC,QAAE,SACF,iBACA,2CACA,CAQA,CACA,aACA,IACA,mBAGA,mBACA,uBACA,OAEA,SAhQA,OAUA,GAEA,QAIA,uBACA,OAQA,mBACA,IACA,mBAGA,4BACA,mBAGA,6BACA,mBAQA,+CAQA,YAQA,cACA,aASA,cACA,kCAEA,MACA,IASA,WACA,iCAEA,MACA,IAKA,QACA,UACA,OAQA,OACA,aACA,uBAEA,2BACA,cAOA,kBACA,YAEA,mCACA,qDACA,uBAEA,YACA,KAOA,sBACA,cA4BA,kBACA,UACA,SA7BA,YAEA,iCACA,+CAGA,YACA,kDACA,GACA,uCACA,SACA,iBAGA,QAGA,iCACA,WACA,WAEA,mBACA,4CAEA,MAEA,EAUA,eACA,YACA,iBAEA,gCAEA,yBACA,+BACA,WACA,WAEA,uBACA,qBAGA,OACA,IAEA,oCACA,mDAEA,YACA,OACA,EAeA,EAEA,cASA,yCCpFA,YACA,kBACA,sBACA,kBACA,OAEA,UAIA,+BACA,8BACA,OAEA,GACA,yCAEA,8CAEA,mBACA,CAEA,CAgDA,iBAEA,KAIA,oBACA,QACA,kBACA,WAIA,iCACA,WACA,+BAGA,iBACA,aAEA,KAIA,mBACA,IAiBA,KAzNA,UACA,kBAEA,mBAAsC,eAKtC,0BAAqC,0CAKrC,kEAGA,8CAAuF,CAKvF,qBAIA,6BAEA,oCAEA,qBAGA,qBAGA,iBACA,UACA,CASA,MACA,iBACA,UACA,aAAiC,iBAAgB,SACjD,UAAoC,oBAAgB,SACpD,UAAoC,oBAAgB,SAEpD,IAMA,MACA,UACA,kBACA,sBACA,kBACA,OAEA,UAIA,+BACA,8BACA,OAEA,2BACA,WAEA,oBACA,yBACA,4BAEA,WACA,yBAGA,SAAG,KACH,WAEA,oBACA,iCAEA,6BAEA,WACA,gCAGA,OACA,EACA,CAIA,MAkCA,iBACA,WAGA,kBAA8B,SAO9B,+BAA8C,cAAuC,gCAErF,QAKA,qBACA,eAEA,qBAGA,2BACA,SAWA,MA6CA,aAEA,MAOA,oBAKA,iBAIA,oCAA0C,EAAQ,SAClD,kBAEA,wBAoBA,+BACA,QAGA,KACA,iBACA,qDAIA,SAIA,WAIA,aAIA,aAGA,WACA,mCAEA,OACA,CAGA,GACA,qBAEA,0BAjUA,QA0BA,IAgIA,WASA,uCCjCA,eACA,sDACA,MAMa,CACb,eACA,iBACA,SACE,8BAKF,0BACA,MAMa,CACb,aACA,uCACA,MAWA,SAxKA,OAoBA,GACA,OAIA,cACA,MACA,SAQA,OACA,cAGA,WACA,QACA,+BAGA,UACA,+BACA,CACA,gBAGA,iBAQA,UACA,cAEA,WACA,QACA,+BAGA,UACA,+BACA,CACA,gBAGA,iBASA,qBACA,cACA,mCAGA,YAKA,QACA,gBAKA,SAEA,eACA,SAGA,eACA,KAQA,qBACA,cACA,mCAGA,KACA,gBAEA,EACA,QAEA,cAMqB,mCC4KrB,aACA,eACA,mBACA,kBACA,gBACA,SAKa,CACb,aACA,8BACA,SAKa,CACb,aACA,eACA,UAKa,CACb,aACA,SACA,oCACA,MAGA,aACA,MAEA,CACA,iFAlVA,iBAmBA,KAEA,oBAUA,UACA,mBAIA,wBACA,OACA,QAKA,OACA,6BAEA,QAIA,6DAEA,eACA,oBAGA,eAGA,kBAEA,+BAIA,uBAAiC,cACjC,qBACA,KACA,IAAG,EAAG,UAGN,sBACA,2DAGA,+DAAsF,UACtF,QASA,kBACA,cACA,mBACA,aAGA,UACA,KAIA,kBACA,2BAEA,KACA,IAIA,SAGA,mBACA,aAIA,iCAEA,gDACA,MACA,2BACA,EASA,gBACA,WACA,kDACA,cAIA,MACA,YACG,iBACH,YACG,oBACH,cAIA,yCACA,mBAEA,OASA,iBAEA,gBACA,WAGA,2BACA,aAGA,gBACA,YAGA,oBAEA,oCACA,KAiBA,4BAhBA,WACA,2BAGA,kBACA,MACA,SAEA,SACA,SAEA,MACA,2BAEA,KAUA,oBACA,qBACA,aACA,WACA,cAGA,iDACA,iCACA,8DAGA,YAMA,+BALA,aACA,IAGA,KAKA,OACA,YAGA,oBAEA,gFACA,MAMA,4BALA,MACA,2BAEA,KAYA,kCACA,qBACA,aACA,cACA,WAEA,4CAIA,+BACA,GACA,QAGA,MAQA,4BACA,+CACA,aAWA,oCACA,qBACA,aACA,WACA,wBAIA,WACA,2CAA0C,uBAC1C,kDAEA,mDAIA,QACA,IACA,EAKa,uBC5Sb,qBAmBA,IACA,mBACA,eACA,CAEA,2BACA,WAEA,cACA,aACA,OACA,EAaA,sBCzCA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAAggB,yeAEhgB,yHCPA,iBA0BA,KACA,mBAIA,sBACA,OACA,CACA,IAEA,IAIA,wBACA,OACA,sBAIA,OACA,MACA,qBACA,aAOA,gBACA,cACA,wBACA,4BACA,wDACA,YACA,QAQA,aAPA,SACA,wCACA,EAEA,sCACA,gDACA,cAEA,EAOA,cACA,cACA,mBAOA,2CAMA,0CACA,8CACA,kCAAoD,oDACpD,aACA,aACA,yCACA,MACA,aAEA,0CACA,MACA,cACA,GAEA,gCACA,eACA,gBAEA,mBAEA,aAHa,aAGJ,EAAG,UAEZ,oBACA,cACA,yBACA,uCACA,2BAEA,aAMA,YACA,UAGA,yBACA,wBACA,qCACA,wCACA,0BACA,WACA,sBAQA,qDACA,2BACA,SAOA,aACA,MAGA,uCAEA,mCAEA,QAQA,iBACA,wCACA,KACA,8CC7KA,SAiBA,GACA,mBAIA,OACA,8DACA,QACA,8CCzBA,QAgBA,IACA,mBAYA,UACA,wCAEA,2CAEA,kDACA,uBAIA,MAWA,WACA,qBACA,uBAEA,0CACA,oBAEA,iCACA,SACA,EACA,gHC5DA,QAqBA,KACA,mBAIA,eACA,CACA,6BAOA,uBAOA,wBAMA,4BAMA,mEACA,kCAMA,8DAQA,8BAQA,+BACA,iBACA,8BACA,mCACA,mBAEA,eAEA,wBAGA,iDAAuD,YAAc,CACrE,oDACA,KACA,kBACA,CAEA,6CAEA,eACA,MACA,aACA,KACA,iBAAiC,CACjC,uDACA,MACA,oBAKA,kCAAuB,MACvB,OACA,MACA,kBACA,oBACA,+BAEA,kBAEA,+BACA,QACA,EAIA,OACA,OACA,qCACA,QASA,mBACA,sBACA,QAMA,SALA,UAEA,wCAEA,SAQA,0BACA,qBACA,wBACA,KAEA,iBADA,qBAEA,8CC5JA,OAgBA,GACA,mBAIA,eACA,CAQA,kBAQA,iBAEA,oBAEA,mCACA,KACA,mBACA,CAGA,4BAEA,iBACA,CACA,WAIA,WACA,sCCgGA,iBACA,MAAQ,cAAkB,QAE1B,0BACA,YAYmB,CACnB,qBACA,OACA,IACA,EACA,EAGA,YAEA,6BACA,aA+CA,CACA,IACA,IACA,IACA,GAIA,YAtDA,YACA,GAEA,EACA,UAEA,WAKA,yBAEA,uBAEA,CACA,UAKA,sCAIA,2BACA,GACA,KAIA,IACA,MACA,KAKA,SACA,KACI,UACJ,KAIA,IAUA,KAEA,WACA,IAOoB,CACpB,WAAsC,QAAY,OAClD,MAAQ,WAAmB,eAE3B,aACA,MACA,QAEA,IAkDA,KAjOA,SAAqC,0CAAqD,iBAG1F,QACA,YAKA,YACA,YAGA,2BACA,oBACA,aAEA,WACA,GAGA,SACA,aACE,YACF,uBACA,8BAEA,QACA,MAGA,kBACA,OAEA,IAAM,QAAY,OAElB,UACA,cACA,kBAMA,aACA,UAOA,SACA,gBAOA,eACA,UACA,GAEA,OAAS,cACT,OAQmB,oCAxJnB,SA8EA,kCC9EA,IAiBA,WACA,0CACA,IACA,kDAGA,aACA,aAEA,OACA,eAXA,iBChBA,U,qnECEA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAAkd,2bAEld,qBCLA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAAqrB,8pBAErrB,6ECPA,SAoBA,KACA,mBAIA,sBACA,QACA,IAIA,OACA,cACA,WAEA,+CACA,YACA,yBACA,eAoBA,aAnBA,SACA,uBACA,EACA,wBACA,UAEA,4CACA,yBACA,8BACA,gCACA,kBACA,iCACA,CACA,OAGA,YACA,CACA,IAEA,EACA,oEC5DA,QAmBA,IACA,mBAcA,WACA,cACA,WACA,sBACA,YACA,SACA,0BAEA,0BACA,WAGA,mBACA,GAGA,+BACA,YAGA,QAEA,OACA,4BAEA,cAGA,iBAGA,uBACA,yBAEA,aACA,EACA,EAKa,uBC3Eb,qBAwBA,GACA,mBAIA,wBACA,OACA,cAKA,OAEA,+BACA,gBACA,QAAG,EAAG,UACN,UAwBA,eAAgC,KAChC,wBACA,CACA,eACA,sBACA,kBAEA,OAwBA,YAA6B,KAC7B,wBACA,CACA,eACA,mBACA,kBAEA,OA+CA,eAAgC,KAChC,wBACA,CACA,eACA,sBACA,kBAEA,OAYA,qBACA,SAAwB,cAAY,gBAA2B,eAAiB,GAEhF,gBACA,WACA,eACA,oBAEA,IA4CA,sDC7NA,OAmBA,GACA,mBAIA,eACA,CAQA,4BAWA,yDAQA,yBACA,+EAcA,6DAEA,4BACA,oBACA,MAEA,gDACA,QAKA,UACA,8CAEA,eACA,SACA,EAOA,MACA,mBAIA,eACA,CAWA,kBAQA,yBAEA,sCAEA,mCACA,KAEA,mBACA,CAGA,yBACA,gBACA,iBACA,8BAGA,0BAEA,iBACA,sDACA,sCAGA,0BACA,EAGA,KAKA,OACA,cACA,OACA,gBCxJA,U,kmBC0HA,YACA,uBAA4C,OAC5C,oBAGA,SADA,yBAQa,CACb,aACA,kBACA,mBACA,qBAGA,kEA7IA,kBAuBA,KACA,mBAIA,sBACA,QACA,IAEA,eACA,CAQA,0BAAyC,gDACzC,EAEA,OACA,cAGA,kGACA,qGACA,MASA,0BACA,cACA,WACA,sBAEA,8CAIA,iCACA,YACA,gBACA,qCAGA,iCACA,+CACA,kDACA,GAGA,2BADA,QAIA,mBACA,mBAEA,YACA,SAEA,yCACA,iCAGA,yDACA,sBACA,oBACA,QACA,EAEA,CACA,MAGA,SAGA,SAEA,uBAGA,kDACA,+BACA,EAEA,MACA,eAKa,6BCzHb,U,sTCEA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAAqrB,4pBAErrB,mCCyHA,eACA,6CAIA,OAkEA,6DAvMA,gBAsBA,KACA,mBAIA,sBACA,OACA,CACA,IAEA,IAIA,wBACA,OACA,SAIA,OACA,cACA,YACA,YACA,uBACA,SACA,MACA,sBACA,4BACA,0BACA,wBACA,eACA,qBACA,cAEA,gCAEA,WACA,SACA,OAEA,iBACA,CACA,YACA,QAEA,gCACA,UACA,4BACA,yBACA,UACA,iBACA,qBAEA,yBACA,OAEA,6CACA,gBACA,UAOA,6BAPgD,YAAc,CAE9D,gEACA,oBACA,4BACA,OACA,IAEA,EAYA,uBACA,cACA,WACA,IACA,aACA,2BACA,2BACA,2BAEA,8DACA,aACA,OAKA,eAHA,iBAAyC,YAAW,CAEpD,YAEA,EACA,EAQa,oCCxDb,eACA,gBACA,MACA,uBAEA,kCA5EA,OAiBA,IACA,mBAYA,UACA,qBACA,mCAEA,0CACA,uCACA,OAaA,SAAsB,KACtB,qBAEA,8BACA,oBACA,qCAEA,6BACA,kCACA,oBAGA,YACA,EACA,EAOa,mECtEb,SAaA,KAEA,QAOA,YACA,mBAIA,eACA,CAEA,mCACA,SACA,CAAK,kDACL,wBAAK,kEACL,uBAAK,kEACL,uBAAK,kEAGL,yBAKA,sBACA,QACA,IAKA,OACA,cACA,WACA,SACA,uBAEA,4BAEA,UAEA,iEAGA,4CACA,2BACA,0BAGA,iCACA,2BACA,yBAGA,wDAGA,eAKA,YAGA,cACA,wBACA,wBAGA,4DACA,iDACA,WACA,2BAEA,4BACA,oBAEA,WAEA,EACA,sCCRA,iBACA,gBACA,CACA,kBAEA,kCAjGA,OAiBA,IACA,mBAOA,iBACA,CAiBA,cACA,cAKA,UACA,oDAEA,+CACA,6EACA,OAWA,SAAsB,KACtB,cACA,WAEA,8BACA,oBACA,iCACA,4BACA,6BAGA,kBACA,kBACA,+BAGA,aACA,EACA,EAQa,oDC3Fb,OAiBA,IACA,OAOA,iBAGA,gBAKA,gBAEA,MACA,QAEA,iDC0EA,aAGA,gCAAuD,CAAuB,YAE9E,yBACA,gBAEA,UACA,OAnEA,aACA,gBAEA,0BAEA,QA8CA,0CA7CA,YAGA,QAGA,iCADA,OAIA,+BAEA,2BAEA,qCAEA,GAEA,qBAEA,SAGA,sBACA,GACA,SAIA,uCACA,GACA,WACA,QAEA,IAIA,qCACA,GACA,WACA,YAEA,IAEA,IAOgE,mBA/GhE,SAqDA,iECrDA,SAmBA,IACA,mBAIA,cACA,CAQA,wBAQA,wCAQA,wBASA,+BACA,iBACA,wBACA,mCACA,mBAEA,eAGA,oBAIA,qCACA,KAEA,gBACA,CAMA,4CAGA,mCACA,yBACA,QAEA,iCACA,4BACA,QACA,EAKA,OAEA,+BAEA,eACA,MAKA,QACA,mBACA,YAKA,YACA,mBACA,WACA,qDCpHA,OAiBA,IACA,mBAIA,cACA,CASA,6BAQA,sBAEA,kBAEA,mCACA,KAEA,gBACA,OACA,CACA,qBACA,yBAEA,oCACA,uBAGA,sBACA,CACA,WAIA,cACA,YAqCA,aAKA,OACA,gBACA,WACA,WACA,GAEA,gCAGA,6BACA,+BACA,UAKA,QACA,cACA,OACA,0CCpFA,aACA,YACA,4EAEA,iBAEA,kBACA,6BAhDA,SAwCA,yDCxCA,QAqCA,IACA,mBAIA,mBACA,CAKA,+BACA,YACA,CAYA,sCAgBA,kBAQA,qBAQA,kCAYA,wBAEA,2BACA,KAEA,iBACA,CAKA,gCAOA,sCACA,mBACA,MAGA,+BACA,SAKA,OAEA,+BAGA,oCAEA,wBACA,MACA,yBACA,aACA,UAEA,IAGA,yCAEA,kCACA,cACA,UAEA,IAGA,2CACA,MACA,QAEA,GAGA,uBACA,mCAEA,eACA,MAKA,QACA,iBACA,OACA,8CCnLA,OAkBA,GACA,mBAIA,eACA,CAEA,sBAQA,sBAYA,mCAEA,yCACA,KAEA,iBACA,OACA,CACA,WACA,sCAIA,8CAEA,YAGA,yBAGA,oBACA,wBClEA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAA6T,sSAE7T,kDCPA,kBAiBA,KACA,mBAIA,sBACA,QACA,IAKA,wBACA,OACA,cACA,sCC2GA,mBACA,IAGA,8BACA,cACA,MAEA,uCACA,WACA,qDACA,uCAGA,QACA,gDAEA,WAEA,EACA,EAMY,CACZ,kBACA,kBACA,WAEA,WAGA,sCACA,sBACA,UAEA,oDACA,uCAEA,MACA,uBAEA,4BACA,OACA,CACA,CAOkD,CAClD,mBACA,wBACA,WACA,cACA,iBAMA,CACA,aACA,wBAAyC,CACzC,+BACA,uCAGA,yBACA,I,8EApNA,QA6BA,KACA,mBAIA,OACA,cACA,WACA,qBACA,SACA,WACA,SACA,YAcA,sCAEA,iDACA,kBACA,MACA,iBAEA,oBACA,MACA,iBAEA,uBAEA,gBAEA,iEAEA,uDAEA,4DAEA,qFAAgG,UAEhG,8FAAiH,UAEjH,sEAAsF,UACtF,QAOA,2BACA,6BACA,UAEA,yDACA,+CAGA,0CACA,cACA,yCACA,gBACA,YACA,gBAEA,WACA,yBAEA,gBAGA,oCACA,kBAEA,uBAQA,yBACA,SACA,2BACA,YACA,WAEA,uBACA,yBAEA,wBAGA,aACA,CACA,EAIA,wCCnHA,aACA,WACA,iBACA,uBACA,aACA,+BAEA,iBACA,OACA,CAiBA,MACA,WACA,kBACA,mCACA,kBAIA,eACA,KASA,MACA,WACA,WAGA,mEACA,SAAU,CAGV,SACA,6BA7EA,SAY2B,KAE3B,eAQA,8CC4CA,aACA,WAEA,uBACA,oCAEA,sBACA,iBAEA,SAKgD,CAChD,aACA,WAEA,gBACA,UAEA,MAMoB,CACpB,eACA,WAGA,SAIA,gBACA,cAGA,cACA,IAOA,0BALA,uEAQA,uBACA,6BAMA,+BACA,sBAEA,gCAEA,wBApGA,eACA,WAEA,YAMA,iBAIA,qFAGA,OACA,oBACA,qCAAmF,UAKnF,yBAGA,+BAGA,SACA,MAMA,yBAjEA,gBAYA,KAEA,WACA,cAEA,KACA,WAUA,yBC1BA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAA8H,uGAE9H,qBCLA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAAsJ,+HAEtJ,kDCPA,SAmBA,IACA,mBAIA,sBACA,QACA,IAKA,wBACA,OACA,YAKA,OACA,cACA,4BAEA,qBACA,aAEA,gBAQA,iBACA,cACA,0BAEA,4CACA,YAEA,QAYA,aAXA,SACA,aACA,KAGA,sCACA,iCAEA,mDAEA,QAEA,EACA,EA0EA,oCC0DA,aACA,WACA,kBAEA,gBAGA,mBACA,cAAoC,UAGpC,qFAA4F,CAE5F,WAAqB,CAKrB,2BACA,aACA,eACA,sBACA,UACA,yBAGA,MACA,GAGA,CAIA,mCAHA,mBAEA,QAyBA,gGAxQA,kBAwBA,KACA,mBAIA,sBACA,QACA,IAIA,wBACA,OACA,kBAIA,OACA,cACA,WACA,aACA,WACA,SAEA,wBAKA,iEAGA,oBACA,MACA,mBACA,oBAGA,yBACA,yBACA,oDACA,oDACA,uDACA,uDACA,uDAEA,uFAAkF,UAElF,iBACA,iCAEA,UASA,kBAEA,SACA,+BAEA,wBACA,aACA,cACA,4CACA,uBACA,UAGA,SACA,qBAGA,UAEA,oBACA,oBAiBA,mCACA,qBACA,QACA,qBACA,kCACA,qCACA,yCACA,0CAEA,uBACA,EAiBA,MACA,gBAEA,gBACA,MACA,uBACA,yBACA,EAGA,6BACA,MACA,uBACA,oBACA,YAGA,wCACA,MACA,4BACA,4BACA,YAGA,gDACA,MACA,8BACA,wBACA,YAGA,iDACA,MACA,6BACA,6BACA,YAUA,4BACA,eACA,QACA,SACA,UACA,WAOa,yCC7Mb,QAgBA,IACA,mBAOA,iBACA,CAiBA,cACA,OAKA,UACA,wCAEA,2CAIG,oCACH,0BAEA,uDAEA,KAUA,SAAsB,KACtB,SACA,MAGA,2BACA,uBAEA,0CACA,oBAEA,iDACA,KACA,EACA,sCClBA,mBACA,WACA,UAIA,mBAA4C,SAK5C,oBAKA,0CAEA,6BAAoC,+BAKpC,6BAAyC,SACzC,0CACA,OAMY,CACZ,eACA,UACA,aACA,SAGA,QAQqB,CACrB,iBACA,kCACA,wCAMA,cAQqB,CACrB,iBACA,+BACA,qCAMA,mBAxHA,WACA,kBACA,2BACA,OAEA,0BAKA,qBACA,2BACA,gDAEA,QACA,WAGA,UACA,mBAEA,QACA,CAOA,EA/CA,IAgDA,WAEA,0BAEA,4BACA,UACA,QAEA,UACA,CAQkB,UAhDlB,iBCjBA,U,0JCAA,U,oMCAA,U,uQCAA,U,kRCAA,QAgBA,KAYA,mBAIA,sBACA,QACA,IAKA,wBACA,OACA,cAKA,YACA,cACA,sBAGA,sBAUA,+CASA,sCAGA,uCACA,YACA,OAKA,2DAGA,4DACA,MACA,iBAAG,EAAG,UAGN,+DACA,MACA,iBAAG,EAAG,UACN,QAQA,kBACA,cAEA,yBACA,qCAGA,gBAEA,oBAGA,oBANA,cAaA,eACA,cAEA,YACA,kBAEA,oCACA,6BACA,WACA,yBACA,QAIA,iBAzGA,oDAgHA,eACA,MAIA,sCACA,SASA,iBACA,wCACA,QACA,EAwBA,oCCmIA,aACA,+CACA,K,+FA1TA,kBAiBA,KACA,QAQA,SACA,mBAIA,sBACA,OACA,CACA,IAEA,IAIA,wBACA,OACA,MAIA,OACA,cACA,kCAMA,wBAOA,0CAEA,UAEA,gCACA,gBAOA,cACA,cACA,mBACA,yBACA,yBACA,UAuBA,yCArBA,iEACA,uCACA,2CAEA,mCACA,mDACA,YACA,cAEA,gCACA,WACA,eACA,cAEA,qCAEA,8CACA,MACA,eACA,GACA,IAQA,2BACA,cACA,wBACA,YAEA,4BAEA,CACA,MACA,gBAEA,cACA,yCACA,YACA,QAUA,SATA,uBACA,iBACA,IACA,cAEA,oCAEA,gDACA,iBAEA,EAOA,iBACA,6BAGA,iCACA,cAGA,kCAEA,YAEA,2CACA,uEACA,0BACA,QAEA,IAAS,EAIT,UAGA,iDACA,kCACA,gBACA,aAEA,IAEA,eACA,cACA,kDACA,8CACA,2BAEA,cAOA,cACA,cACA,wBACA,yBACA,cACA,YACA,mBACA,mBAEA,qEAOA,sEACA,gCACA,cACA,wCACA,eAMA,IACA,WAQA,iDAEA,0BACA,8BAEA,8CACA,qCAGA,4BACA,WACA,uBAGA,0DAGA,SASA,cACA,6CACA,qCAIA,wCAEA,oDACA,oCACA,UAWA,0BACA,6BACA,YACA,4BACA,iBACA,0DACA,uBAAgB,CAChB,SAYA,0BACA,kCACA,eACA,uBACS,wBAGT,2BACA,mBACA,aACA,eACA,kCAMA,aAEA,KALA,IAMA,CACA,EAKsD,uBCvTtD,qBAmBA,IACA,mBACA,eACA,CAEA,2BACA,OAEA,cACA,aACA,OACA,EAcA,4EC5CA,SAsBA,KACA,mBAIA,OACA,cACA,WACA,SAGA,gCAAiC,6CAEjC,mCAAiC,6CAGjC,uDACA,2BACA,2BACA,qBAA+C,CAG/C,SAGA,kBADA,GAIA,uBAEA,kBAAW,oBAAwB,MACnC,0BACA,KACA,gCAIA,oCACA,oCACA,QACA,8DC9DA,OAkBA,KACA,mBAYA,UACA,qBAEA,6CACA,0EACA,WAkBA,WACA,qBACA,aAEA,+BAEA,WAGA,yBACA,WAGA,iDAEA,yDAEA,8BAGA,0BACA,IAEA,KACA,mBAAmC,CAEnC,eAGA,6BACA,aACA,CAAI,KAGJ,+CAEA,qBACA,yBAEA,aACA,CACA,EACA,8CChGA,QAgBA,KACA,mBAIA,UACA,4DACA,WAUA,UACA,qBACA,aAEA,+BAEA,WACA,6EAGA,gBAGA,iBACA,4BAEA,WACA,EACA,gHCnDA,SAuBA,IACA,mBAIA,eACA,CACA,mBAOA,uBAOA,wBAMA,4BAMA,2DACA,kCAMA,8DAMA,+DAQA,8BAQA,+BACA,iBACA,8BACA,mCACA,mBAEA,eAEA,wBAGA,iDAAuD,YAAc,CACrE,oDACA,KACA,kBACA,CAEA,gCAEA,eACA,MACA,aACA,KACA,iBAAiC,CACjC,0CACA,MACA,oBACA,sBAKA,kCAAuB,MACvB,eACA,MACA,kBACA,oBACA,sBAEA,iCAEA,kBAEA,+BACA,QACA,EAIA,OAEA,sCACA,eACA,MAIA,QACA,mBACA,YAOA,kBACA,qBACA,wBACA,KAGA,iBAFA,oCACA,uBAUA,mBACA,sBACA,QAMA,SALA,UAEA,wCAEA,SAEC,EAeD,mBC9LA,U,6rBCEA,CACA,QACA,oCACA,MACA,SAEA,EACA,EAEA,cACA,gCAaA,4BCzBA,cAIA,YACA,YAAwa,iZAExa,wFCPA,OAmBA,IACA,mBAIA,sBACA,QACA,IAIA,wBACA,OACA,MAIA,OAEA,qBACA,sDACA,uDAGA,yDACA,qBACA,yCACA,sDACA,8BACA,iBACA,mBAEA,OACA,WACA,YACA,8BACA,SACA,wBACA,WAEA,IAEA,qCACA,wDACA,eASA,kBACA,cACA,oBACA,wCACA,YACA,QAUA,aATA,CACA,QACA,OAGA,qDAEA,6CACA,aAEA,EACA,sCCoCA,aACA,OAEA,mBACA,+BACA,8BACA,iBAKA,KACA,0CAzIA,SAoCA,KACA,mBAIA,sBACA,QACA,IAKA,OACA,cAMA,oBACA,iCACA,kBACA,MACA,kBACA,QAEA,mDAGA,wCACA,SAEA,2EAAoF,UAIpF,mDACA,IACA,iCACA,gBACA,sBAIA,qBAAG,EAAG,UAEN,4CACA,2CAEA,0CACA,uCACA,uCAEA,mCAA6D,UAC7D,4CACA,mCAA0D,UAC1D,4CAIA,sDACA,sDAEA,wCACA,mCAA0D,UAC1D,2CACA,mCAAuD,UAEvD,2DACA,wDAEA,uCAAiD,UACjD,2CAAiD,UACjD,2CAAqD,UACrD,uCAGA,8BAAoD,UAGpD,iDACA,qDAGA,mDACA,mDACA,YACA,sCCgJA,iBAEA,2BAEA,WACA,4CAcA,gCAIA,8CACA,+BACA,6BAIA,0BAEA,4BAGA,mCAGA,cAOa,CACb,eACA,gBACA,MACA,WACA,wCAEA,kCA9TA,OAiBA,IACA,mBAOA,iBACA,CAQA,4CASA,UAKA,UACA,iBACA,gCACA,eAUA,SAAsB,KACtB,qBACA,kCACA,uCAGA,qBAGA,2BACA,oBAIA,aAEA,qBACA,YACA,IAkDA,+DAGA,wBAGA,UAEA,MAKA,aAKA,WAAoB,WAGpB,eACA,WAEA,KAEA,mBACA,4CAEA,OAmBA,OAGA,IAEA,cACA,yCACA,+BAKA,mBAGA,IAGA,UACA,SAMA,kBACA,aAGA,8BACK,gBAGL,uEAIA,mCAGA,6EANK,WAOL,EAQA,YAEA,oDAEA,+EACA,IAQA,gBAEA,SACA,MAGA,sCACA,iCAEA,uBAOA,gCACA,MACA,EASkB,oCCnHlB,eAEA,SAGA,QACA,KAMA,mDAJA,iBAQA,kDAEA,QAGA,CACA,eACA,6BAIA,4FACA,6CAEA,UAGA,6BACA,kBAEA,OACA,cA5LA,QAgBA,IACA,mBAQA,iBACA,CASA,wCACA,CAKA,UACA,qBACA,eAOA,UACA,qBACA,aACA,qCAEA,0CACA,oBAGA,eAGA,2EACA,aAEA,YAOA,YACA,uBAGA,4BACA,uCAIA,UAIA,eAIA,8BAEA,WAIA,CACA,uBAGA,oBACA,QAEA,MACA,EAQA,gBAEA,oDAGA,kCACA,YAGA,6BAGA,wBACA,2BAEA,oBAEA,kEACA,mBAKA,mCAGA,eACA,eAGA,CACA,QAGA,CACA,QACA,EAGA,oCC0eA,iBACA,SAEA,aACA,yCACA,WAEA,iEAGA,uBACA,iBAEA,8DACA,kBACA,6BAGA,kCAEA,mBAAiB,QAEjB,eACA,WAEA,IAEA,4BACA,2CAGA,OAEA,EAIA,CACA,mBACA,wBAEA,kCAOA,mDACA,aAEA,UAMA,gCACA,2BAEA,4CACA,wDACA,+BAGA,kCAEA,cACA,EAwBA,CA2CA,eACA,iDACA,UAEA,iBACA,MAKA,SAHA,oBAEA,mBAaA,CACA,eACA,iCACA,0CACA,mBACA,uBACA,iBACA,mBACA,oBAEA,uDACA,uCAEA,4BACA,wBAEA,UACA,MACA,SACA,QACA,IACA,iBACA,iBAEA,WAEA,KAEA,QAEA,IACA,SAGA,QACA,IAEA,OACA,KAGA,CACA,eACA,sDACA,6BAGA,gBACA,IAKA,CACA,mBACA,WAGA,iBAKgD,gCAEhD,sBAFA,2DAKA,WACA,0CACA,eAEA,UAEA,qBAMA,2DAEA,0CAIA,uCACA,UAQA,yCAIA,mBAGA,SAOA,oBAEA,IAAG,wCAGH,gBACA,WAGA,wCAGA,4CAEA,UACA,YACA,0CACA,qBAEA,2BACA,WACA,SAGA,OACA,iBACA,kBAGA,CACA,qBAKA,aACA,CACA,cACA,iBACA,oBAIA,wCAEA,QAEA,MAiBA,GACE,iBAkBF,4BACA,aACA,cAAE,KAmBF,wBACA,WACA,iBAEA,GAIA,yBACA,iCACA,uCAEA,UACA,iBAGA,mBAEA,CACA,eACA,wBACA,gCAEA,iBAEA,uDACA,gBAEA,oBACA,eAIA,KACA,QAMA,CACA,aACA,iDACA,kBA3/BA,iBACA,kBACA,yBACA,oCAKA,yCACA,2BACA,sCAEA,iCACA,aAGA,sCAEA,yBACA,UAaA,MACA,iBACA,sBACA,wBAGA,wCAIA,6BACA,wCAIA,wBACA,oDACA,WAGA,kBACA,iBACA,kBAUA,MACA,iBACA,sBACA,UAGA,uCACA,4DAEA,iBAIA,iCACA,wCAGA,0BACA,WACA,sBACA,gBAEA,eACA,mBAIA,4EAIA,QACA,kEAEA,KAUA,MACA,iBACA,sBACA,0BAGA,wCAIA,6BACA,wCAGA,0BACA,WACA,sBACA,gBAGA,aAEA,QACA,sBAIA,sBAIA,yDAGA,qBACA,SA0BA,MACA,iBACA,4BACA,uCAEA,YAgDA,iCACA,6BAEA,kBAMA,4BACA,6BAGA,wBACA,uBACA,aACA,OAEA,qBAIA,sBACA,WAAmB,MAAkB,WACrC,WACA,0BACA,aAGA,QACA,eAIA,kBACA,aAEA,QACA,CAGA,kBACA,UACA,CACA,CAwBA,MACA,iBACA,2BACA,mCACA,oBACA,eAKA,UACA,MACA,CAcA,MACA,iBACA,sBAAuC,CAAa,UAEpD,iBAGA,uCACA,4BAGA,qEACA,0BAGA,oBAGA,UAGA,oBACA,OAKA,uDAEA,WAIA,iCACA,2CAIA,0CAEA,SAEA,GACA,mBAEA,QACA,QACA,CAWA,MACA,eACA,mBAAoC,CAAa,UAEjD,4BAEA,wBACA,aACA,SAGA,QACA,CASA,MACA,eACA,mBAAoC,CAAa,UACjD,IACA,uBAGA,2BAEA,kBACA,MAEA,cACA,6BACA,SAGA,cAGA,0CAIA,+DACA,sCAEI,wBAEJ,SAGA,MAEA,IACA,CAUA,MACA,aACA,yBAEA,kCACA,kBACA,+DACA,iBACA,8BAGA,cACA,mDACA,kBAEA,iBACA,KAAI,yCACJ,kBAEA,aACA,KAEA,CACA,CAUA,MACA,aACA,WACA,iBACA,WAEA,qCAEA,eAGA,4BAEA,+BACA,eAAG,KAKH,4BACA,iCAGA,gDACA,eAEA,GACA,MAAE,wFAGF,WAIA,wBACA,MAEA,qCACA,aAEA,sBAGA,oDAEA,kBACA,MACA,CAkBA,MACA,WACA,kBACA,IAIA,qCACA,0CACA,6DAIA,YAEA,SACA,WAAG,mBACH,0CACA,6DAIA,YAEA,SAIA,sBAEA,qBAIA,wBAEA,mBACA,WAAG,mEACH,WAGA,6BACA,iDACA,OAEA,6BAIA,SACA,QAAG,KAGH,wBAEA,qBAIA,wBAEA,mBAEA,YACA,CAGA,MA8FA,iBAMA,2CAEA,4BAEA,WACA,yBAEA,oBACA,gBACG,qCACH,kBAIA,cAIA,wBAGA,aAEA,iBACA,oDAEA,iBAGA,WACA,CACA,CAIA,yEAtwBA,QAiCA,qBCjCA,aAuCA,YACA,sDAEA,sDACA,aA1BA,IACA,mBAQA,iBACA,OAKA,eACA,iBACA,EAIyB,mBCtCzB,U,ixBCAA,U","file":"ckeditor.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClassicEditor\"] = factory();\n\telse\n\t\troot[\"ClassicEditor\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module module:engine/view/writer\n */\n\nimport Position from './position';\nimport ContainerElement from './containerelement';\nimport AttributeElement from './attributeelement';\nimport EmptyElement from './emptyelement';\nimport UIElement from './uielement';\nimport Text from './text';\nimport Range from './range';\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport DocumentFragment from './documentfragment';\nimport isIterable from '@ckeditor/ckeditor5-utils/src/isiterable';\n\n/**\n * Contains functions used for composing view tree.\n *\n * @namespace writer\n */\n\nconst writer = {\n\tbreakAttributes,\n\tbreakContainer,\n\tmergeAttributes,\n\tmergeContainers,\n\tinsert,\n\tremove,\n\tclear,\n\tmove,\n\twrap,\n\twrapPosition,\n\tunwrap,\n\trename\n};\n\nexport default writer;\n\n/**\n * Breaks attribute nodes at provided position or at boundaries of provided range. It breaks attribute elements inside\n * up to a container element.\n *\n * In following examples `

` is a container, `` and `` are attribute nodes:\n *\n *\t\t

foobar{}

->

foobar[]

\n *\t\t

foo{}bar

->

foo{}bar

\n *\t\t

foob{}ar

->

foob[]ar

\n *\t\t

fo{oba}r

->

foobar

\n *\n * **Note:** {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container.\n *\n * **Note:** Difference between {@link module:engine/view/writer~writer.breakAttributes breakAttributes} and\n * {@link module:engine/view/writer~writer.breakContainer breakContainer} is that `breakAttributes` breaks all\n * {@link module:engine/view/attributeelement~AttributeElement attribute elements} that are ancestors of given `position`, up to the first\n * encountered {@link module:engine/view/containerelement~ContainerElement container element}. `breakContainer` assumes that given\n * `position`\n * is directly in container element and breaks that container element.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container`\n * when {@link module:engine/view/range~Range#start start}\n * and {@link module:engine/view/range~Range#end end} positions of a passed range are not placed inside same parent container.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-empty-element`\n * when trying to break attributes\n * inside {@link module:engine/view/emptyelement~EmptyElement EmptyElement}.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-ui-element`\n * when trying to break attributes\n * inside {@link module:engine/view/uielement~UIElement UIElement}.\n *\n * @see module:engine/view/attributeelement~AttributeElement\n * @see module:engine/view/containerelement~ContainerElement\n * @see module:engine/view/writer~writer.breakContainer\n * @function module:engine/view/writer~writer.breakAttributes\n * @param {module:engine/view/position~Position|module:engine/view/range~Range} positionOrRange Position where to break attribute elements.\n * @returns {module:engine/view/position~Position|module:engine/view/range~Range} New position or range, after breaking the attribute\n * elements.\n */\nexport function breakAttributes( positionOrRange ) {\n\tif ( positionOrRange instanceof Position ) {\n\t\treturn _breakAttributes( positionOrRange );\n\t} else {\n\t\treturn _breakAttributesRange( positionOrRange );\n\t}\n}\n\n/**\n * Breaks {@link module:engine/view/containerelement~ContainerElement container view element} into two, at the given position. Position\n * has to be directly inside container element and cannot be in root. Does not break if position is at the beginning\n * or at the end of it's parent element.\n *\n *\t\t

foo^bar

->

foo

bar

\n *\t\t

foo

^

bar

->

foo

bar

\n *\t\t

^foobar

-> ^

foobar

\n *\t\t

foobar^

->

foobar

^\n *\n * **Note:** Difference between {@link module:engine/view/writer~writer.breakAttributes breakAttributes} and\n * {@link module:engine/view/writer~writer.breakContainer breakContainer} is that `breakAttributes` breaks all\n * {@link module:engine/view/attributeelement~AttributeElement attribute elements} that are ancestors of given `position`, up to the first\n * encountered {@link module:engine/view/containerelement~ContainerElement container element}. `breakContainer` assumes that given\n * `position`\n * is directly in container element and breaks that container element.\n *\n * @see module:engine/view/attributeelement~AttributeElement\n * @see module:engine/view/containerelement~ContainerElement\n * @see module:engine/view/writer~writer.breakAttributes\n * @function module:engine/view/writer~writer.breakContainer\n * @param {module:engine/view/position~Position} position Position where to break element.\n * @returns {module:engine/view/position~Position} Position between broken elements. If element has not been broken, the returned position\n * is placed either before it or after it.\n */\nexport function breakContainer( position ) {\n\tconst element = position.parent;\n\n\tif ( !( element.is( 'containerElement' ) ) ) {\n\t\t/**\n\t\t * Trying to break an element which is not a container element.\n\t\t *\n\t\t * @error view-writer-break-non-container-element\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-break-non-container-element: Trying to break an element which is not a container element.' );\n\t}\n\n\tif ( !element.parent ) {\n\t\t/**\n\t\t * Trying to break root element.\n\t\t *\n\t\t * @error view-writer-break-root\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-break-root: Trying to break root element.' );\n\t}\n\n\tif ( position.isAtStart ) {\n\t\treturn Position.createBefore( element );\n\t} else if ( !position.isAtEnd ) {\n\t\tconst newElement = element.clone( false );\n\n\t\tinsert( Position.createAfter( element ), newElement );\n\n\t\tconst sourceRange = new Range( position, Position.createAt( element, 'end' ) );\n\t\tconst targetPosition = new Position( newElement, 0 );\n\n\t\tmove( sourceRange, targetPosition );\n\t}\n\n\treturn Position.createAfter( element );\n}\n\n/**\n * Merges {@link module:engine/view/attributeelement~AttributeElement attribute elements}. It also merges text nodes if needed.\n * Only {@link module:engine/view/attributeelement~AttributeElement#isSimilar similar} attribute elements can be merged.\n *\n * In following examples `

` is a container and `` is an attribute element:\n *\n *\t\t

foo[]bar

->

foo{}bar

\n *\t\t

foo[]bar

->

foo{}bar

\n *\t\t

a[]b

->

a[]b

\n *\n * It will also take care about empty attributes when merging:\n *\n *\t\t

[]

->

[]

\n *\t\t

foo[]bar

->

foo{}bar

\n *\n * **Note:** Difference between {@link module:engine/view/writer~writer.mergeAttributes mergeAttributes} and\n * {@link module:engine/view/writer~writer.mergeContainers mergeContainers} is that `mergeAttributes` merges two\n * {@link module:engine/view/attributeelement~AttributeElement attribute elements} or {@link module:engine/view/text~Text text nodes}\n * while `mergeContainer` merges two {@link module:engine/view/containerelement~ContainerElement container elements}.\n *\n * @see module:engine/view/attributeelement~AttributeElement\n * @see module:engine/view/containerelement~ContainerElement\n * @see module:engine/view/writer~writer.mergeContainers\n * @function module:engine/view/writer~writer.mergeAttributes\n * @param {module:engine/view/position~Position} position Merge position.\n * @returns {module:engine/view/position~Position} Position after merge.\n */\nexport function mergeAttributes( position ) {\n\tconst positionOffset = position.offset;\n\tconst positionParent = position.parent;\n\n\t// When inside text node - nothing to merge.\n\tif ( positionParent.is( 'text' ) ) {\n\t\treturn position;\n\t}\n\n\t// When inside empty attribute - remove it.\n\tif ( positionParent.is( 'attributeElement' ) && positionParent.childCount === 0 ) {\n\t\tconst parent = positionParent.parent;\n\t\tconst offset = positionParent.index;\n\t\tpositionParent.remove();\n\n\t\treturn mergeAttributes( new Position( parent, offset ) );\n\t}\n\n\tconst nodeBefore = positionParent.getChild( positionOffset - 1 );\n\tconst nodeAfter = positionParent.getChild( positionOffset );\n\n\t// Position should be placed between two nodes.\n\tif ( !nodeBefore || !nodeAfter ) {\n\t\treturn position;\n\t}\n\n\t// When position is between two text nodes.\n\tif ( nodeBefore.is( 'text' ) && nodeAfter.is( 'text' ) ) {\n\t\treturn mergeTextNodes( nodeBefore, nodeAfter );\n\t}\n\t// When selection is between two same attribute elements.\n\telse if ( nodeBefore.is( 'attributeElement' ) && nodeAfter.is( 'attributeElement' ) && nodeBefore.isSimilar( nodeAfter ) ) {\n\t\t// Move all children nodes from node placed after selection and remove that node.\n\t\tconst count = nodeBefore.childCount;\n\t\tnodeBefore.appendChildren( nodeAfter.getChildren() );\n\t\tnodeAfter.remove();\n\n\t\t// New position is located inside the first node, before new nodes.\n\t\t// Call this method recursively to merge again if needed.\n\t\treturn mergeAttributes( new Position( nodeBefore, count ) );\n\t}\n\n\treturn position;\n}\n\n/**\n * Merges two {@link module:engine/view/containerelement~ContainerElement container elements} that are before and after given position.\n * Precisely, the element after the position is removed and it's contents are moved to element before the position.\n *\n *\t\t

foo

^

bar

->

foo^bar

\n *\t\t
foo
^

bar

->
foo^bar
\n *\n * **Note:** Difference between {@link module:engine/view/writer~writer.mergeAttributes mergeAttributes} and\n * {@link module:engine/view/writer~writer.mergeContainers mergeContainers} is that `mergeAttributes` merges two\n * {@link module:engine/view/attributeelement~AttributeElement attribute elements} or {@link module:engine/view/text~Text text nodes}\n * while `mergeContainer` merges two {@link module:engine/view/containerelement~ContainerElement container elements}.\n *\n * @see module:engine/view/attributeelement~AttributeElement\n * @see module:engine/view/containerelement~ContainerElement\n * @see module:engine/view/writer~writer.mergeAttributes\n * @function module:engine/view/writer~writer.mergeContainers\n * @param {module:engine/view/position~Position} position Merge position.\n * @returns {module:engine/view/position~Position} Position after merge.\n */\nexport function mergeContainers( position ) {\n\tconst prev = position.nodeBefore;\n\tconst next = position.nodeAfter;\n\n\tif ( !prev || !next || !prev.is( 'containerElement' ) || !next.is( 'containerElement' ) ) {\n\t\t/**\n\t\t * Element before and after given position cannot be merged.\n\t\t *\n\t\t * @error view-writer-merge-containers-invalid-position\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-merge-containers-invalid-position: ' +\n\t\t\t'Element before and after given position cannot be merged.' );\n\t}\n\n\tconst lastChild = prev.getChild( prev.childCount - 1 );\n\tconst newPosition = lastChild instanceof Text ? Position.createAt( lastChild, 'end' ) : Position.createAt( prev, 'end' );\n\n\tmove( Range.createIn( next ), Position.createAt( prev, 'end' ) );\n\tremove( Range.createOn( next ) );\n\n\treturn newPosition;\n}\n\n/**\n * Insert node or nodes at specified position. Takes care about breaking attributes before insertion\n * and merging them afterwards.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert\n * contains instances that are not {@link module:engine/view/text~Text Texts},\n * {@link module:engine/view/attributeelement~AttributeElement AttributeElements},\n * {@link module:engine/view/containerelement~ContainerElement ContainerElements},\n * {@link module:engine/view/emptyelement~EmptyElement EmptyElements} or\n * {@link module:engine/view/uielement~UIElement UIElements}.\n *\n * @function insert\n * @param {module:engine/view/position~Position} position Insertion position.\n * @param {module:engine/view/text~Text|module:engine/view/attributeelement~AttributeElement|\n * module:engine/view/containerelement~ContainerElement|module:engine/view/emptyelement~EmptyElement|\n * module:engine/view/uielement~UIElement|Iterable.} nodes Node or nodes to insert.\n * @returns {module:engine/view/range~Range} Range around inserted nodes.\n */\nexport function insert( position, nodes ) {\n\tnodes = isIterable( nodes ) ? [ ...nodes ] : [ nodes ];\n\n\t// Check if nodes to insert are instances of AttributeElements, ContainerElements, EmptyElements, UIElements or Text.\n\tvalidateNodesToInsert( nodes );\n\n\tconst container = getParentContainer( position );\n\n\tif ( !container ) {\n\t\t/**\n\t\t * Position's parent container cannot be found.\n\t\t *\n\t\t * @error view-writer-invalid-position-container\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-invalid-position-container' );\n\t}\n\n\tconst insertionPosition = _breakAttributes( position, true );\n\n\tconst length = container.insertChildren( insertionPosition.offset, nodes );\n\tconst endPosition = insertionPosition.getShiftedBy( length );\n\tconst start = mergeAttributes( insertionPosition );\n\n\t// When no nodes were inserted - return collapsed range.\n\tif ( length === 0 ) {\n\t\treturn new Range( start, start );\n\t} else {\n\t\t// If start position was merged - move end position.\n\t\tif ( !start.isEqual( insertionPosition ) ) {\n\t\t\tendPosition.offset--;\n\t\t}\n\n\t\tconst end = mergeAttributes( endPosition );\n\n\t\treturn new Range( start, end );\n\t}\n}\n\n/**\n * Removes provided range from the container.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when\n * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions are not placed inside\n * same parent container.\n *\n * @function module:engine/view/writer~writer.remove\n * @param {module:engine/view/range~Range} range Range to remove from container. After removing, it will be updated\n * to a collapsed range showing the new position.\n * @returns {module:engine/view/documentfragment~DocumentFragment} Document fragment containing removed nodes.\n */\nexport function remove( range ) {\n\tvalidateRangeContainer( range );\n\n\t// If range is collapsed - nothing to remove.\n\tif ( range.isCollapsed ) {\n\t\treturn new DocumentFragment();\n\t}\n\n\t// Break attributes at range start and end.\n\tconst { start: breakStart, end: breakEnd } = _breakAttributesRange( range, true );\n\tconst parentContainer = breakStart.parent;\n\n\tconst count = breakEnd.offset - breakStart.offset;\n\n\t// Remove nodes in range.\n\tconst removed = parentContainer.removeChildren( breakStart.offset, count );\n\n\t// Merge after removing.\n\tconst mergePosition = mergeAttributes( breakStart );\n\trange.start = mergePosition;\n\trange.end = Position.createFromPosition( mergePosition );\n\n\t// Return removed nodes.\n\treturn new DocumentFragment( removed );\n}\n\n/**\n * Removes matching elements from given range.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when\n * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions are not placed inside\n * same parent container.\n *\n * @function module:engine/view/writer~writer.clear\n * @param {module:engine/view/range~Range} range Range to clear.\n * @param {module:engine/view/element~Element} element Element to remove.\n */\nexport function clear( range, element ) {\n\tvalidateRangeContainer( range );\n\n\t// Create walker on given range.\n\t// We walk backward because when we remove element during walk it modifies range end position.\n\tconst walker = range.getWalker( {\n\t\tdirection: 'backward',\n\t\tignoreElementEnd: true\n\t} );\n\n\t// Let's walk.\n\tfor ( const current of walker ) {\n\t\tconst item = current.item;\n\t\tlet rangeToRemove;\n\n\t\t// When current item matches to the given element.\n\t\tif ( item.is( 'element' ) && element.isSimilar( item ) ) {\n\t\t\t// Create range on this element.\n\t\t\trangeToRemove = Range.createOn( item );\n\t\t// When range starts inside Text or TextProxy element.\n\t\t} else if ( !current.nextPosition.isAfter( range.start ) && ( item.is( 'text' ) || item.is( 'textProxy' ) ) ) {\n\t\t\t// We need to check if parent of this text matches to given element.\n\t\t\tconst parentElement = item.getAncestors().find( ancestor => {\n\t\t\t\treturn ancestor.is( 'element' ) && element.isSimilar( ancestor );\n\t\t\t} );\n\n\t\t\t// If it is then create range inside this element.\n\t\t\tif ( parentElement ) {\n\t\t\t\trangeToRemove = Range.createIn( parentElement );\n\t\t\t}\n\t\t}\n\n\t\t// If we have found element to remove.\n\t\tif ( rangeToRemove ) {\n\t\t\t// We need to check if element range stick out of the given range and truncate if it is.\n\t\t\tif ( rangeToRemove.end.isAfter( range.end ) ) {\n\t\t\t\trangeToRemove.end = range.end;\n\t\t\t}\n\n\t\t\tif ( rangeToRemove.start.isBefore( range.start ) ) {\n\t\t\t\trangeToRemove.start = range.start;\n\t\t\t}\n\n\t\t\t// At the end we remove range with found element.\n\t\t\tremove( rangeToRemove );\n\t\t}\n\t}\n}\n\n/**\n * Moves nodes from provided range to target position.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when\n * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions are not placed inside\n * same parent container.\n *\n * @function module:engine/view/writer~writer.move\n * @param {module:engine/view/range~Range} sourceRange Range containing nodes to move.\n * @param {module:engine/view/position~Position} targetPosition Position to insert.\n * @returns {module:engine/view/range~Range} Range in target container. Inserted nodes are placed between\n * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions.\n */\nexport function move( sourceRange, targetPosition ) {\n\tlet nodes;\n\n\tif ( targetPosition.isAfter( sourceRange.end ) ) {\n\t\ttargetPosition = _breakAttributes( targetPosition, true );\n\n\t\tconst parent = targetPosition.parent;\n\t\tconst countBefore = parent.childCount;\n\n\t\tsourceRange = _breakAttributesRange( sourceRange, true );\n\n\t\tnodes = remove( sourceRange );\n\n\t\ttargetPosition.offset += ( parent.childCount - countBefore );\n\t} else {\n\t\tnodes = remove( sourceRange );\n\t}\n\n\treturn insert( targetPosition, nodes );\n}\n\n/**\n * Wraps elements within range with provided {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-invalid-range-container`\n * when {@link module:engine/view/range~Range#start}\n * and {@link module:engine/view/range~Range#end} positions are not placed inside same parent container.\n * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n * an instance of {module:engine/view/attributeelement~AttributeElement AttributeElement}.\n *\n * @function module:engine/view/writer~writer.wrap\n * @param {module:engine/view/range~Range} range Range to wrap.\n * @param {module:engine/view/attributeelement~AttributeElement} attribute Attribute element to use as wrapper.\n */\nexport function wrap( range, attribute ) {\n\tif ( !( attribute instanceof AttributeElement ) ) {\n\t\tthrow new CKEditorError( 'view-writer-wrap-invalid-attribute' );\n\t}\n\n\tvalidateRangeContainer( range );\n\n\t// If range is collapsed - nothing to wrap.\n\tif ( range.isCollapsed ) {\n\t\treturn range;\n\t}\n\n\t// Range around one element.\n\tif ( range.end.isEqual( range.start.getShiftedBy( 1 ) ) ) {\n\t\tconst node = range.start.nodeAfter;\n\n\t\tif ( node instanceof AttributeElement && wrapAttributeElement( attribute, node ) ) {\n\t\t\treturn range;\n\t\t}\n\t}\n\n\t// Range is inside single attribute and spans on all children.\n\tif ( rangeSpansOnAllChildren( range ) && wrapAttributeElement( attribute, range.start.parent ) ) {\n\t\tconst parent = range.start.parent.parent;\n\t\tconst index = range.start.parent.index;\n\n\t\treturn Range.createFromParentsAndOffsets( parent, index, parent, index + 1 );\n\t}\n\n\t// Break attributes at range start and end.\n\tconst { start: breakStart, end: breakEnd } = _breakAttributesRange( range, true );\n\tconst parentContainer = breakStart.parent;\n\n\t// Unwrap children located between break points.\n\tconst unwrappedRange = unwrapChildren( parentContainer, breakStart.offset, breakEnd.offset, attribute );\n\n\t// Wrap all children with attribute.\n\tconst newRange = wrapChildren( parentContainer, unwrappedRange.start.offset, unwrappedRange.end.offset, attribute );\n\n\t// Merge attributes at the both ends and return a new range.\n\tconst start = mergeAttributes( newRange.start );\n\n\t// If start position was merged - move end position back.\n\tif ( !start.isEqual( newRange.start ) ) {\n\t\tnewRange.end.offset--;\n\t}\n\tconst end = mergeAttributes( newRange.end );\n\n\treturn new Range( start, end );\n}\n\n/**\n * Wraps position with provided attribute. Returns new position after wrapping. This method will also merge newly\n * added attribute with its siblings whenever possible.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n * an instance of {module:engine/view/attributeelement~AttributeElement AttributeElement}.\n *\n * @param {module:engine/view/position~Position} position\n * @param {module:engine/view/attributeelement~AttributeElement} attribute\n * @returns {module:engine/view/position~Position} New position after wrapping.\n */\nexport function wrapPosition( position, attribute ) {\n\tif ( !( attribute instanceof AttributeElement ) ) {\n\t\tthrow new CKEditorError( 'view-writer-wrap-invalid-attribute' );\n\t}\n\n\t// Return same position when trying to wrap with attribute similar to position parent.\n\tif ( attribute.isSimilar( position.parent ) ) {\n\t\treturn movePositionToTextNode( Position.createFromPosition( position ) );\n\t}\n\n\t// When position is inside text node - break it and place new position between two text nodes.\n\tif ( position.parent.is( 'text' ) ) {\n\t\tposition = breakTextNode( position );\n\t}\n\n\t// Create fake element that will represent position, and will not be merged with other attributes.\n\tconst fakePosition = new AttributeElement();\n\tfakePosition.priority = Number.POSITIVE_INFINITY;\n\tfakePosition.isSimilar = () => false;\n\n\t// Insert fake element in position location.\n\tposition.parent.insertChildren( position.offset, fakePosition );\n\n\t// Range around inserted fake attribute element.\n\tconst wrapRange = new Range( position, position.getShiftedBy( 1 ) );\n\n\t// Wrap fake element with attribute (it will also merge if possible).\n\twrap( wrapRange, attribute );\n\n\t// Remove fake element and place new position there.\n\tconst newPosition = new Position( fakePosition.parent, fakePosition.index );\n\tfakePosition.remove();\n\n\t// If position is placed between text nodes - merge them and return position inside.\n\tconst nodeBefore = newPosition.nodeBefore;\n\tconst nodeAfter = newPosition.nodeAfter;\n\n\tif ( nodeBefore instanceof Text && nodeAfter instanceof Text ) {\n\t\treturn mergeTextNodes( nodeBefore, nodeAfter );\n\t}\n\n\t// If position is next to text node - move position inside.\n\treturn movePositionToTextNode( newPosition );\n}\n\n/**\n * Unwraps nodes within provided range from attribute element.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when\n * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions are not placed inside\n * same parent container.\n *\n * @param {module:engine/view/range~Range} range\n * @param {module:engine/view/attributeelement~AttributeElement} element\n */\nexport function unwrap( range, attribute ) {\n\tif ( !( attribute instanceof AttributeElement ) ) {\n\t\t/**\n\t\t * Attribute element need to be instance of attribute element.\n\t\t *\n\t\t * @error view-writer-unwrap-invalid-attribute\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-unwrap-invalid-attribute' );\n\t}\n\n\tvalidateRangeContainer( range );\n\n\t// If range is collapsed - nothing to unwrap.\n\tif ( range.isCollapsed ) {\n\t\treturn range;\n\t}\n\n\t// Range around one element - check if AttributeElement can be unwrapped partially when it's not similar.\n\t// For example:\n\t// unwrap with:\t

result: \n\tif ( range.end.isEqual( range.start.getShiftedBy( 1 ) ) ) {\n\t\tconst node = range.start.nodeAfter;\n\n\t\t// Unwrap single attribute element.\n\t\tif ( !attribute.isSimilar( node ) && node instanceof AttributeElement && unwrapAttributeElement( attribute, node ) ) {\n\t\t\treturn range;\n\t\t}\n\t}\n\n\t// Break attributes at range start and end.\n\tconst { start: breakStart, end: breakEnd } = _breakAttributesRange( range, true );\n\tconst parentContainer = breakStart.parent;\n\n\t// Unwrap children located between break points.\n\tconst newRange = unwrapChildren( parentContainer, breakStart.offset, breakEnd.offset, attribute );\n\n\t// Merge attributes at the both ends and return a new range.\n\tconst start = mergeAttributes( newRange.start );\n\n\t// If start position was merged - move end position back.\n\tif ( !start.isEqual( newRange.start ) ) {\n\t\tnewRange.end.offset--;\n\t}\n\tconst end = mergeAttributes( newRange.end );\n\n\treturn new Range( start, end );\n}\n\n/**\n * Renames element by creating a copy of renamed element but with changed name and then moving contents of the\n * old element to the new one. Keep in mind that this will invalidate all {@link module:engine/view/position~Position positions} which\n * has renamed element as {@link module:engine/view/position~Position#parent a parent}.\n *\n * New element has to be created because `Element#tagName` property in DOM is readonly.\n *\n * Since this function creates a new element and removes the given one, the new element is returned to keep reference.\n *\n * @param {module:engine/view/containerelement~ContainerElement} viewElement Element to be renamed.\n * @param {String} newName New name for element.\n */\nexport function rename( viewElement, newName ) {\n\tconst newElement = new ContainerElement( newName, viewElement.getAttributes() );\n\n\tinsert( Position.createAfter( viewElement ), newElement );\n\tmove( Range.createIn( viewElement ), Position.createAt( newElement ) );\n\tremove( Range.createOn( viewElement ) );\n\n\treturn newElement;\n}\n\n/**\n * Attribute element need to be instance of attribute element.\n *\n * @error view-writer-wrap-invalid-attribute\n */\n\n// Returns first parent container of specified {@link module:engine/view/position~Position Position}.\n// Position's parent node is checked as first, then next parents are checked.\n// Note that {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container.\n//\n// @param {module:engine/view/position~Position} position Position used as a start point to locate parent container.\n// @returns {module:engine/view/containerelement~ContainerElement|module:engine/view/documentfragment~DocumentFragment|undefined}\n// Parent container element or `undefined` if container is not found.\nfunction getParentContainer( position ) {\n\tlet parent = position.parent;\n\n\twhile ( !isContainerOrFragment( parent ) ) {\n\t\tif ( !parent ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tparent = parent.parent;\n\t}\n\n\treturn parent;\n}\n\n// Function used by both public breakAttributes (without splitting text nodes) and by other methods (with\n// splitting text nodes).\n//\n// @param {module:engine/view/range~Range} range Range which `start` and `end` positions will be used to break attributes.\n// @param {Boolean} [forceSplitText = false] If set to `true`, will break text nodes even if they are directly in\n// container element. This behavior will result in incorrect view state, but is needed by other view writing methods\n// which then fixes view state. Defaults to `false`.\n// @returns {module:engine/view/range~Range} New range with located at break positions.\nfunction _breakAttributesRange( range, forceSplitText = false ) {\n\tconst rangeStart = range.start;\n\tconst rangeEnd = range.end;\n\n\tvalidateRangeContainer( range );\n\n\t// Break at the collapsed position. Return new collapsed range.\n\tif ( range.isCollapsed ) {\n\t\tconst position = _breakAttributes( range.start, forceSplitText );\n\n\t\treturn new Range( position, position );\n\t}\n\n\tconst breakEnd = _breakAttributes( rangeEnd, forceSplitText );\n\tconst count = breakEnd.parent.childCount;\n\tconst breakStart = _breakAttributes( rangeStart, forceSplitText );\n\n\t// Calculate new break end offset.\n\tbreakEnd.offset += breakEnd.parent.childCount - count;\n\n\treturn new Range( breakStart, breakEnd );\n}\n\n// Function used by public breakAttributes (without splitting text nodes) and by other methods (with\n// splitting text nodes).\n//\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-empty-element` when break position\n// is placed inside {@link module:engine/view/emptyelement~EmptyElement EmptyElement}.\n//\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-ui-element` when break position\n// is placed inside {@link module:engine/view/uielement~UIElement UIElement}.\n//\n// @param {module:engine/view/position~Position} position Position where to break attributes.\n// @param {Boolean} [forceSplitText = false] If set to `true`, will break text nodes even if they are directly in\n// container element. This behavior will result in incorrect view state, but is needed by other view writing methods\n// which then fixes view state. Defaults to `false`.\n// @returns {module:engine/view/position~Position} New position after breaking the attributes.\nfunction _breakAttributes( position, forceSplitText = false ) {\n\tconst positionOffset = position.offset;\n\tconst positionParent = position.parent;\n\n\t// If position is placed inside EmptyElement - throw an exception as we cannot break inside.\n\tif ( position.parent.is( 'emptyElement' ) ) {\n\t\t/**\n\t\t * Cannot break inside EmptyElement instance.\n\t\t *\n\t\t * @error view-writer-cannot-break-empty-element\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-cannot-break-empty-element' );\n\t}\n\n\t// If position is placed inside UIElement - throw an exception as we cannot break inside.\n\tif ( position.parent.is( 'uiElement' ) ) {\n\t\t/**\n\t\t * Cannot break inside UIElement instance.\n\t\t *\n\t\t * @error view-writer-cannot-break-ui-element\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-cannot-break-ui-element' );\n\t}\n\n\t// There are no attributes to break and text nodes breaking is not forced.\n\tif ( !forceSplitText && positionParent.is( 'text' ) && isContainerOrFragment( positionParent.parent ) ) {\n\t\treturn Position.createFromPosition( position );\n\t}\n\n\t// Position's parent is container, so no attributes to break.\n\tif ( isContainerOrFragment( positionParent ) ) {\n\t\treturn Position.createFromPosition( position );\n\t}\n\n\t// Break text and start again in new position.\n\tif ( positionParent.is( 'text' ) ) {\n\t\treturn _breakAttributes( breakTextNode( position ), forceSplitText );\n\t}\n\n\tconst length = positionParent.childCount;\n\n\t//

foobar{}

\n\t//

foobar[]

\n\t//

foobar[]

\n\tif ( positionOffset == length ) {\n\t\tconst newPosition = new Position( positionParent.parent, positionParent.index + 1 );\n\n\t\treturn _breakAttributes( newPosition, forceSplitText );\n\t} else\n\t//

foo{}bar

\n\t//

foo[]bar

\n\t//

foo{}bar

\n\tif ( positionOffset === 0 ) {\n\t\tconst newPosition = new Position( positionParent.parent, positionParent.index );\n\n\t\treturn _breakAttributes( newPosition, forceSplitText );\n\t}\n\t//

foob{}ar

\n\t//

foob[]ar

\n\t//

foob[]ar

\n\t//

foob[]ar

\n\telse {\n\t\tconst offsetAfter = positionParent.index + 1;\n\n\t\t// Break element.\n\t\tconst clonedNode = positionParent.clone();\n\n\t\t// Insert cloned node to position's parent node.\n\t\tpositionParent.parent.insertChildren( offsetAfter, clonedNode );\n\n\t\t// Get nodes to move.\n\t\tconst count = positionParent.childCount - positionOffset;\n\t\tconst nodesToMove = positionParent.removeChildren( positionOffset, count );\n\n\t\t// Move nodes to cloned node.\n\t\tclonedNode.appendChildren( nodesToMove );\n\n\t\t// Create new position to work on.\n\t\tconst newPosition = new Position( positionParent.parent, offsetAfter );\n\n\t\treturn _breakAttributes( newPosition, forceSplitText );\n\t}\n}\n\n// Unwraps children from provided `attribute`. Only children contained in `parent` element between\n// `startOffset` and `endOffset` will be unwrapped.\n//\n// @param {module:engine/view/element~Element} parent\n// @param {Number} startOffset\n// @param {Number} endOffset\n// @param {module:engine/view/element~Element} attribute\nfunction unwrapChildren( parent, startOffset, endOffset, attribute ) {\n\tlet i = startOffset;\n\tconst unwrapPositions = [];\n\n\t// Iterate over each element between provided offsets inside parent.\n\twhile ( i < endOffset ) {\n\t\tconst child = parent.getChild( i );\n\n\t\t// If attributes are the similar, then unwrap.\n\t\tif ( child.isSimilar( attribute ) ) {\n\t\t\tconst unwrapped = child.getChildren();\n\t\t\tconst count = child.childCount;\n\n\t\t\t// Replace wrapper element with its children\n\t\t\tchild.remove();\n\t\t\tparent.insertChildren( i, unwrapped );\n\n\t\t\t// Save start and end position of moved items.\n\t\t\tunwrapPositions.push(\n\t\t\t\tnew Position( parent, i ),\n\t\t\t\tnew Position( parent, i + count )\n\t\t\t);\n\n\t\t\t// Skip elements that were unwrapped. Assuming that there won't be another element to unwrap in child\n\t\t\t// elements.\n\t\t\ti += count;\n\t\t\tendOffset += count - 1;\n\t\t} else {\n\t\t\t// If other nested attribute is found start unwrapping there.\n\t\t\tif ( child.is( 'attributeElement' ) ) {\n\t\t\t\tunwrapChildren( child, 0, child.childCount, attribute );\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\t}\n\n\t// Merge at each unwrap.\n\tlet offsetChange = 0;\n\n\tfor ( const position of unwrapPositions ) {\n\t\tposition.offset -= offsetChange;\n\n\t\t// Do not merge with elements outside selected children.\n\t\tif ( position.offset == startOffset || position.offset == endOffset ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst newPosition = mergeAttributes( position );\n\n\t\t// If nodes were merged - other merge offsets will change.\n\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\toffsetChange++;\n\t\t\tendOffset--;\n\t\t}\n\t}\n\n\treturn Range.createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n}\n\n// Wraps children with provided `attribute`. Only children contained in `parent` element between\n// `startOffset` and `endOffset` will be wrapped.\n//\n// @param {module:engine/view/element~Element} parent\n// @param {Number} startOffset\n// @param {Number} endOffset\n// @param {module:engine/view/element~Element} attribute\nfunction wrapChildren( parent, startOffset, endOffset, attribute ) {\n\tlet i = startOffset;\n\tconst wrapPositions = [];\n\n\twhile ( i < endOffset ) {\n\t\tconst child = parent.getChild( i );\n\t\tconst isText = child.is( 'text' );\n\t\tconst isAttribute = child.is( 'attributeElement' );\n\t\tconst isEmpty = child.is( 'emptyElement' );\n\t\tconst isUI = child.is( 'uiElement' );\n\n\t\t// Wrap text, empty elements, ui elements or attributes with higher or equal priority.\n\t\tif ( isText || isEmpty || isUI || ( isAttribute && shouldABeOutsideB( attribute, child ) ) ) {\n\t\t\t// Clone attribute.\n\t\t\tconst newAttribute = attribute.clone();\n\n\t\t\t// Wrap current node with new attribute;\n\t\t\tchild.remove();\n\t\t\tnewAttribute.appendChildren( child );\n\t\t\tparent.insertChildren( i, newAttribute );\n\n\t\t\twrapPositions.push(\tnew Position( parent, i ) );\n\t\t}\n\t\t// If other nested attribute is found start wrapping there.\n\t\telse if ( isAttribute ) {\n\t\t\twrapChildren( child, 0, child.childCount, attribute );\n\t\t}\n\n\t\ti++;\n\t}\n\n\t// Merge at each wrap.\n\tlet offsetChange = 0;\n\n\tfor ( const position of wrapPositions ) {\n\t\tposition.offset -= offsetChange;\n\n\t\t// Do not merge with elements outside selected children.\n\t\tif ( position.offset == startOffset ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst newPosition = mergeAttributes( position );\n\n\t\t// If nodes were merged - other merge offsets will change.\n\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\toffsetChange++;\n\t\t\tendOffset--;\n\t\t}\n\t}\n\n\treturn Range.createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n}\n\n// Checks if first {@link module:engine/view/attributeelement~AttributeElement AttributeElement} provided to the function\n// can be wrapped otuside second element. It is done by comparing elements'\n// {@link module:engine/view/attributeelement~AttributeElement#priority priorities}, if both have same priority\n// {@link module:engine/view/element~Element#getIdentity identities} are compared.\n//\n// @param {module:engine/view/attributeelement~AttributeElement} a\n// @param {module:engine/view/attributeelement~AttributeElement} b\n// @returns {Boolean}\nfunction shouldABeOutsideB( a, b ) {\n\tif ( a.priority < b.priority ) {\n\t\treturn true;\n\t} else if ( a.priority > b.priority ) {\n\t\treturn false;\n\t}\n\n\t// When priorities are equal and names are different - use identities.\n\treturn a.getIdentity() < b.getIdentity();\n}\n\n// Returns new position that is moved to near text node. Returns same position if there is no text node before of after\n// specified position.\n//\n//\t\t

foo[]

->

foo{}

\n//\t\t

[]foo

->

{}foo

\n//\n// @param {module:engine/view/position~Position} position\n// @returns {module:engine/view/position~Position} Position located inside text node or same position if there is no text nodes\n// before or after position location.\nfunction movePositionToTextNode( position ) {\n\tconst nodeBefore = position.nodeBefore;\n\n\tif ( nodeBefore && nodeBefore.is( 'text' ) ) {\n\t\treturn new Position( nodeBefore, nodeBefore.data.length );\n\t}\n\n\tconst nodeAfter = position.nodeAfter;\n\n\tif ( nodeAfter && nodeAfter.is( 'text' ) ) {\n\t\treturn new Position( nodeAfter, 0 );\n\t}\n\n\treturn position;\n}\n\n// Breaks text node into two text nodes when possible.\n//\n//\t\t

foo{}bar

->

foo[]bar

\n//\t\t

{}foobar

->

[]foobar

\n//\t\t

foobar{}

->

foobar[]

\n//\n// @param {module:engine/view/position~Position} position Position that need to be placed inside text node.\n// @returns {module:engine/view/position~Position} New position after breaking text node.\nfunction breakTextNode( position ) {\n\tif ( position.offset == position.parent.data.length ) {\n\t\treturn new Position( position.parent.parent, position.parent.index + 1 );\n\t}\n\n\tif ( position.offset === 0 ) {\n\t\treturn new Position( position.parent.parent, position.parent.index );\n\t}\n\n\t// Get part of the text that need to be moved.\n\tconst textToMove = position.parent.data.slice( position.offset );\n\n\t// Leave rest of the text in position's parent.\n\tposition.parent.data = position.parent.data.slice( 0, position.offset );\n\n\t// Insert new text node after position's parent text node.\n\tposition.parent.parent.insertChildren( position.parent.index + 1, new Text( textToMove ) );\n\n\t// Return new position between two newly created text nodes.\n\treturn new Position( position.parent.parent, position.parent.index + 1 );\n}\n\n// Merges two text nodes into first node. Removes second node and returns merge position.\n//\n// @param {module:engine/view/text~Text} t1 First text node to merge. Data from second text node will be moved at the end of\n// this text node.\n// @param {module:engine/view/text~Text} t2 Second text node to merge. This node will be removed after merging.\n// @returns {module:engine/view/position~Position} Position after merging text nodes.\nfunction mergeTextNodes( t1, t2 ) {\n\t// Merge text data into first text node and remove second one.\n\tconst nodeBeforeLength = t1.data.length;\n\tt1.data += t2.data;\n\tt2.remove();\n\n\treturn new Position( t1, nodeBeforeLength );\n}\n\n// Wraps one {@link module:engine/view/attributeelement~AttributeElement AttributeElement} into another by merging them if possible.\n// When merging is possible - all attributes, styles and classes are moved from wrapper element to element being\n// wrapped.\n//\n// @param {module:engine/view/attributeelement~AttributeElement} wrapper Wrapper AttributeElement.\n// @param {module:engine/view/attributeelement~AttributeElement} toWrap AttributeElement to wrap using wrapper element.\n// @returns {Boolean} Returns `true` if elements are merged.\nfunction wrapAttributeElement( wrapper, toWrap ) {\n\t// Can't merge if name or priority differs.\n\tif ( wrapper.name !== toWrap.name || wrapper.priority !== toWrap.priority ) {\n\t\treturn false;\n\t}\n\n\t// Check if attributes can be merged.\n\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t// Classes and styles should be checked separately.\n\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If some attributes are different we cannot wrap.\n\t\tif ( toWrap.hasAttribute( key ) && toWrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check if styles can be merged.\n\tfor ( const key of wrapper.getStyleNames() ) {\n\t\tif ( toWrap.hasStyle( key ) && toWrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Move all attributes/classes/styles from wrapper to wrapped AttributeElement.\n\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t// Classes and styles should be checked separately.\n\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Move only these attributes that are not present - other are similar.\n\t\tif ( !toWrap.hasAttribute( key ) ) {\n\t\t\ttoWrap.setAttribute( key, wrapper.getAttribute( key ) );\n\t\t}\n\t}\n\n\tfor ( const key of wrapper.getStyleNames() ) {\n\t\tif ( !toWrap.hasStyle( key ) ) {\n\t\t\ttoWrap.setStyle( key, wrapper.getStyle( key ) );\n\t\t}\n\t}\n\n\tfor ( const key of wrapper.getClassNames() ) {\n\t\tif ( !toWrap.hasClass( key ) ) {\n\t\t\ttoWrap.addClass( key );\n\t\t}\n\t}\n\n\treturn true;\n}\n\n// Unwraps {@link module:engine/view/attributeelement~AttributeElement AttributeElement} from another by removing corresponding attributes,\n// classes and styles. All attributes, classes and styles from wrapper should be present inside element being unwrapped.\n//\n// @param {module:engine/view/attributeelement~AttributeElement} wrapper Wrapper AttributeElement.\n// @param {module:engine/view/attributeelement~AttributeElement} toUnwrap AttributeElement to unwrap using wrapper element.\n// @returns {Boolean} Returns `true` if elements are unwrapped.\nfunction unwrapAttributeElement( wrapper, toUnwrap ) {\n\t// Can't unwrap if name or priority differs.\n\tif ( wrapper.name !== toUnwrap.name || wrapper.priority !== toUnwrap.priority ) {\n\t\treturn false;\n\t}\n\n\t// Check if AttributeElement has all wrapper attributes.\n\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t// Classes and styles should be checked separately.\n\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If some attributes are missing or different we cannot unwrap.\n\t\tif ( !toUnwrap.hasAttribute( key ) || toUnwrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check if AttributeElement has all wrapper classes.\n\tif ( !toUnwrap.hasClass( ...wrapper.getClassNames() ) ) {\n\t\treturn false;\n\t}\n\n\t// Check if AttributeElement has all wrapper styles.\n\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t// If some styles are missing or different we cannot unwrap.\n\t\tif ( !toUnwrap.hasStyle( key ) || toUnwrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Remove all wrapper's attributes from unwrapped element.\n\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t// Classes and styles should be checked separately.\n\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttoUnwrap.removeAttribute( key );\n\t}\n\n\t// Remove all wrapper's classes from unwrapped element.\n\ttoUnwrap.removeClass( ...wrapper.getClassNames() );\n\n\t// Remove all wrapper's styles from unwrapped element.\n\ttoUnwrap.removeStyle( ...wrapper.getStyleNames() );\n\n\treturn true;\n}\n\n// Returns `true` if range is located in same {@link module:engine/view/attributeelement~AttributeElement AttributeElement}\n// (`start` and `end` positions are located inside same {@link module:engine/view/attributeelement~AttributeElement AttributeElement}),\n// starts on 0 offset and ends after last child node.\n//\n// @param {module:engine/view/range~Range} Range\n// @returns {Boolean}\nfunction rangeSpansOnAllChildren( range ) {\n\treturn range.start.parent == range.end.parent && range.start.parent.is( 'attributeElement' ) &&\n\t\trange.start.offset === 0 && range.end.offset === range.start.parent.childCount;\n}\n\n// Checks if provided nodes are valid to insert. Checks if each node is an instance of\n// {@link module:engine/view/text~Text Text} or {@link module:engine/view/attributeelement~AttributeElement AttributeElement},\n// {@link module:engine/view/containerelement~ContainerElement ContainerElement},\n// {@link module:engine/view/emptyelement~EmptyElement EmptyElement} or\n// {@link module:engine/view/uielement~UIElement UIElement}.\n//\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert\n// contains instances that are not {@link module:engine/view/text~Text Texts},\n// {@link module:engine/view/emptyelement~EmptyElement EmptyElements},\n// {@link module:engine/view/uielement~UIElement UIElements},\n// {@link module:engine/view/attributeelement~AttributeElement AttributeElements} or\n// {@link module:engine/view/containerelement~ContainerElement ContainerElements}.\n//\n// @param Iterable. nodes\nfunction validateNodesToInsert( nodes ) {\n\tfor ( const node of nodes ) {\n\t\tif ( !validNodesToInsert.some( ( validNode => node instanceof validNode ) ) ) { // eslint-disable-line no-use-before-define\n\t\t\t/**\n\t\t\t * Inserted nodes should be valid to insert. of {@link module:engine/view/attributeelement~AttributeElement AttributeElement},\n\t\t\t * {@link module:engine/view/containerelement~ContainerElement ContainerElement},\n\t\t\t * {@link module:engine/view/emptyelement~EmptyElement EmptyElement},\n\t\t\t * {@link module:engine/view/uielement~UIElement UIElement}, {@link module:engine/view/text~Text Text}.\n\t\t\t *\n\t\t\t * @error view-writer-insert-invalid-node\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-insert-invalid-node' );\n\t\t}\n\n\t\tif ( !node.is( 'text' ) ) {\n\t\t\tvalidateNodesToInsert( node.getChildren() );\n\t\t}\n\t}\n}\n\nconst validNodesToInsert = [ Text, AttributeElement, ContainerElement, EmptyElement, UIElement ];\n\n// Checks if node is ContainerElement or DocumentFragment, because in most cases they should be treated the same way.\n//\n// @param {module:engine/view/node~Node} node\n// @returns {Boolean} Returns `true` if node is instance of ContainerElement or DocumentFragment.\nfunction isContainerOrFragment( node ) {\n\treturn node && ( node.is( 'containerElement' ) || node.is( 'documentFragment' ) );\n}\n\n// Checks if {@link module:engine/view/range~Range#start range start} and {@link module:engine/view/range~Range#end range end} are placed\n// inside same {@link module:engine/view/containerelement~ContainerElement container element}.\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when validation fails.\n//\n// @param {module:engine/view/range~Range} range\nfunction validateRangeContainer( range ) {\n\tconst startContainer = getParentContainer( range.start );\n\tconst endContainer = getParentContainer( range.end );\n\n\tif ( !startContainer || !endContainer || startContainer !== endContainer ) {\n\t\t/**\n\t\t * Range container is invalid. This can happen if {@link module:engine/view/range~Range#start range start} and\n\t\t * {@link module:engine/view/range~Range#end range end} positions are not placed inside same container or\n\t\t * parent container for these positions cannot be found.\n\t\t *\n\t\t * @error view-writer-invalid-range-container\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-invalid-range-container' );\n\t}\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/view/writer.js\n// module id = 93\n// module chunks = 0","import apply from './_apply';\nimport toInteger from './toInteger';\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, array);\n case 1: return func.call(this, args[0], array);\n case 2: return func.call(this, args[0], args[1], array);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\nexport default rest;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/rest.js\n// module id = 9\n// module chunks = 0"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 279);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 32b781da89000b3af43d","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module utils/ckeditorerror\n */\n\n/**\n * URL to the documentation with error codes.\n */\nexport const DOCUMENTATION_URL =\n\t'https://ckeditor5.github.io/docs/nightly/ckeditor5/latest/framework/guides/support/error-codes.html';\n\n/**\n * The CKEditor error class.\n *\n * All errors will be shortened during the minification process in order to reduce the code size.\n * Therefore, all error messages should be documented in the same way as those in {@link module:utils/log}.\n *\n * Read more in the {@link module:utils/log} module.\n *\n * @extends Error\n */\nexport default class CKEditorError extends Error {\n\t/**\n\t * Creates an instance of the CKEditorError class.\n\t *\n\t * Read more about error logging in the {@link module:utils/log} module.\n\t *\n\t * @param {String} message The error message in an `error-name: Error message.` format.\n\t * During the minification process the \"Error message\" part will be removed to limit the code size\n\t * and a link to this error documentation will be added to the `message`.\n\t * @param {Object} [data] Additional data describing the error. A stringified version of this object\n\t * will be appended to the error message, so the data are quickly visible in the console. The original\n\t * data object will also be later available under the {@link #data} property.\n\t */\n\tconstructor( message, data ) {\n\t\tmessage = attachLinkToDocumentation( message );\n\n\t\tif ( data ) {\n\t\t\tmessage += ' ' + JSON.stringify( data );\n\t\t}\n\n\t\tsuper( message );\n\n\t\t/**\n\t\t * @member {String}\n\t\t */\n\t\tthis.name = 'CKEditorError';\n\n\t\t/**\n\t\t * The additional error data passed to the constructor.\n\t\t *\n\t\t * @member {Object}\n\t\t */\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Checks if error is an instance of CKEditorError class.\n\t *\n\t * @param {Object} error Object to check.\n\t * @returns {Boolean}\n\t */\n\tstatic isCKEditorError( error ) {\n\t\treturn error instanceof CKEditorError;\n\t}\n}\n\n/**\n * Attaches link to the documentation at the end of the error message.\n *\n * @param {String} message Message to be logged.\n * @returns {String}\n */\nexport function attachLinkToDocumentation( message ) {\n\tconst matchedErrorName = message.match( /^([^:]+):/ );\n\n\tif ( !matchedErrorName ) {\n\t\treturn message;\n\t}\n\n\treturn message + ` Read more: ${ DOCUMENTATION_URL }#${ matchedErrorName[ 1 ] }.\\n`;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/ckeditorerror.js\n// module id = 0\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/position\n */\n\nimport TreeWalker from './treewalker';\nimport last from '@ckeditor/ckeditor5-utils/src/lib/lodash/last';\nimport compareArrays from '@ckeditor/ckeditor5-utils/src/comparearrays';\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport Text from './text';\n\n/**\n * Represents a position in the model tree.\n *\n * **Note:** Position is based on offsets, not indexes. This means that position in element containing two text nodes\n * with data `foo` and `bar`, position between them has offset `3`, not `1`.\n * See {@link module:engine/model/position~Position#path} for more.\n *\n * Since position in a model is represented by a {@link module:engine/model/position~Position#root position root} and\n * {@link module:engine/model/position~Position#path position path} it is possible to create positions placed in non-existing elements.\n * This requirement is important for {@link module:engine/model/operation/transform~transform operational transformation}.\n *\n * Also, {@link module:engine/model/operation/operation~Operation operations}\n * kept in {@link module:engine/model/document~Document#history document history}\n * are storing positions (and ranges) which were correct when those operations were applied, but may not be correct\n * after document got changed.\n *\n * When changes are applied to model, it may also happen that {@link module:engine/model/position~Position#parent position parent}\n * will change even if position path has not changed. Keep in mind, that if a position leads to non-existing element,\n * {@link module:engine/model/position~Position#parent} and some other properties and methods will throw errors.\n *\n * In most cases, position with wrong path is caused by an error in code, but it is sometimes needed, as described above.\n */\nexport default class Position {\n\t/**\n\t * Creates a position.\n\t *\n\t * @param {module:engine/model/element~Element|module:engine/model/documentfragment~DocumentFragment} root Root of the position.\n\t * @param {Array.} path Position path. See {@link module:engine/model/position~Position#path}.\n\t */\n\tconstructor( root, path ) {\n\t\tif ( !root.is( 'element' ) && !root.is( 'documentFragment' ) ) {\n\t\t\t/**\n\t\t\t * Position root is invalid.\n\t\t\t *\n\t\t\t * Positions can only be anchored in elements or document fragments.\n\t\t\t *\n\t\t\t * @error model-position-root-invalid\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'model-position-root-invalid: Position root invalid.' );\n\t\t}\n\n\t\tif ( !( path instanceof Array ) || path.length === 0 ) {\n\t\t\t/**\n\t\t\t * Position path must be an array with at least one item.\n\t\t\t *\n\t\t\t * @error model-position-path-incorrect\n\t\t\t * @param path\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'model-position-path-incorrect: Position path must be an array with at least one item.', { path } );\n\t\t}\n\n\t\t// Normalize the root and path (if element was passed).\n\t\tpath = root.getPath().concat( path );\n\t\troot = root.root;\n\n\t\t/**\n\t\t * Root of the position path.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/model/element~Element|module:engine/model/documentfragment~DocumentFragment}\n\t\t * module:engine/model/position~Position#root\n\t\t */\n\t\tthis.root = root;\n\n\t\t/**\n\t\t * Position of the node in the tree. **Path contains offsets, not indexes.**\n\t\t *\n\t\t * Position can be placed before, after or in a {@link module:engine/model/node~Node node} if that node has\n\t\t * {@link module:engine/model/node~Node#offsetSize} greater than `1`. Items in position path are\n\t\t * {@link module:engine/model/node~Node#startOffset starting offsets} of position ancestors, starting from direct root children,\n\t\t * down to the position offset in it's parent.\n\t\t *\n\t\t *\t\t ROOT\n\t\t *\t\t |- P before: [ 0 ] after: [ 1 ]\n\t\t *\t\t |- UL before: [ 1 ] after: [ 2 ]\n\t\t *\t\t |- LI before: [ 1, 0 ] after: [ 1, 1 ]\n\t\t *\t\t | |- foo before: [ 1, 0, 0 ] after: [ 1, 0, 3 ]\n\t\t *\t\t |- LI before: [ 1, 1 ] after: [ 1, 2 ]\n\t\t *\t\t |- bar before: [ 1, 1, 0 ] after: [ 1, 1, 3 ]\n\t\t *\n\t\t * `foo` and `bar` are representing {@link module:engine/model/text~Text text nodes}. Since text nodes has offset size\n\t\t * greater than `1` you can place position offset between their start and end:\n\t\t *\n\t\t *\t\t ROOT\n\t\t *\t\t |- P\n\t\t *\t\t |- UL\n\t\t *\t\t |- LI\n\t\t *\t\t | |- f^o|o ^ has path: [ 1, 0, 1 ] | has path: [ 1, 0, 2 ]\n\t\t *\t\t |- LI\n\t\t *\t\t |- b^a|r ^ has path: [ 1, 1, 1 ] | has path: [ 1, 1, 2 ]\n\t\t *\n\t\t * @member {Array.} module:engine/model/position~Position#path\n\t\t */\n\t\tthis.path = path;\n\t}\n\n\t/**\n\t * Offset at which this position is located in its {@link module:engine/model/position~Position#parent parent}. It is equal\n\t * to the last item in position {@link module:engine/model/position~Position#path path}.\n\t *\n\t * @type {Number}\n\t */\n\tget offset() {\n\t\treturn last( this.path );\n\t}\n\n\t/**\n\t * @param {Number} newOffset\n\t */\n\tset offset( newOffset ) {\n\t\tthis.path[ this.path.length - 1 ] = newOffset;\n\t}\n\n\t/**\n\t * Parent element of this position.\n\t *\n\t * Keep in mind that `parent` value is calculated when the property is accessed.\n\t * If {@link module:engine/model/position~Position#path position path}\n\t * leads to a non-existing element, `parent` property will throw error.\n\t *\n\t * Also it is a good idea to cache `parent` property if it is used frequently in an algorithm (i.e. in a long loop).\n\t *\n\t * @readonly\n\t * @type {module:engine/model/element~Element}\n\t */\n\tget parent() {\n\t\tlet parent = this.root;\n\n\t\tfor ( let i = 0; i < this.path.length - 1; i++ ) {\n\t\t\tparent = parent.getChild( parent.offsetToIndex( this.path[ i ] ) );\n\t\t}\n\n\t\treturn parent;\n\t}\n\n\t/**\n\t * Position {@link module:engine/model/position~Position#offset offset} converted to an index in position's parent node. It is\n\t * equal to the {@link module:engine/model/node~Node#index index} of a node after this position. If position is placed\n\t * in text node, position index is equal to the index of that text node.\n\t *\n\t * @readonly\n\t * @type {Number}\n\t */\n\tget index() {\n\t\treturn this.parent.offsetToIndex( this.offset );\n\t}\n\n\t/**\n\t * Returns {@link module:engine/model/text~Text text node} instance in which this position is placed or `null` if this\n\t * position is not in a text node.\n\t *\n\t * @readonly\n\t * @type {module:engine/model/text~Text|null}\n\t */\n\tget textNode() {\n\t\tconst node = this.parent.getChild( this.index );\n\n\t\treturn ( node instanceof Text && node.startOffset < this.offset ) ? node : null;\n\t}\n\n\t/**\n\t * Node directly after this position or `null` if this position is in text node.\n\t *\n\t * @readonly\n\t * @type {module:engine/model/node~Node|null}\n\t */\n\tget nodeAfter() {\n\t\treturn this.textNode === null ? this.parent.getChild( this.index ) : null;\n\t}\n\n\t/**\n\t * Node directly before this position or `null` if this position is in text node.\n\t *\n\t * @readonly\n\t * @type {Node}\n\t */\n\tget nodeBefore() {\n\t\treturn this.textNode === null ? this.parent.getChild( this.index - 1 ) : null;\n\t}\n\n\t/**\n\t * Is `true` if position is at the beginning of its {@link module:engine/model/position~Position#parent parent}, `false` otherwise.\n\t *\n\t * @readonly\n\t * @type {Boolean}\n\t */\n\tget isAtStart() {\n\t\treturn this.offset === 0;\n\t}\n\n\t/**\n\t * Is `true` if position is at the end of its {@link module:engine/model/position~Position#parent parent}, `false` otherwise.\n\t *\n\t * @readonly\n\t * @type {Boolean}\n\t */\n\tget isAtEnd() {\n\t\treturn this.offset == this.parent.maxOffset;\n\t}\n\n\t/**\n\t * Checks whether this position is before or after given position.\n\t *\n\t * @param {module:engine/model/position~Position} otherPosition Position to compare with.\n\t * @returns {module:engine/model/position~PositionRelation}\n\t */\n\tcompareWith( otherPosition ) {\n\t\tif ( this.root != otherPosition.root ) {\n\t\t\treturn 'different';\n\t\t}\n\n\t\tconst result = compareArrays( this.path, otherPosition.path );\n\n\t\tswitch ( result ) {\n\t\t\tcase 'same':\n\t\t\t\treturn 'same';\n\n\t\t\tcase 'prefix':\n\t\t\t\treturn 'before';\n\n\t\t\tcase 'extension':\n\t\t\t\treturn 'after';\n\n\t\t\tdefault:\n\t\t\t\tif ( this.path[ result ] < otherPosition.path[ result ] ) {\n\t\t\t\t\treturn 'before';\n\t\t\t\t} else {\n\t\t\t\t\treturn 'after';\n\t\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Gets the farthest position which matches the callback using\n\t * {@link module:engine/model/treewalker~TreeWalker TreeWalker}.\n\t *\n\t * For example:\n\t *\n\t * \t\tgetLastMatchingPosition( value => value.type == 'text' );\n\t * \t\t// []foo -> foo[]\n\t *\n\t * \t\tgetLastMatchingPosition( value => value.type == 'text', { direction: 'backward' } );\n\t * \t\t// foo[] -> []foo\n\t *\n\t * \t\tgetLastMatchingPosition( value => false );\n\t * \t\t// Do not move the position.\n\t *\n\t * @param {Function} skip Callback function. Gets {@link module:engine/model/treewalker~TreeWalkerValue} and should\n\t * return `true` if the value should be skipped or `false` if not.\n\t * @param {Object} options Object with configuration options. See {@link module:engine/model/treewalker~TreeWalker}.\n\t *\n\t * @returns {module:engine/model/position~Position} The position after the last item which matches the `skip` callback test.\n\t */\n\tgetLastMatchingPosition( skip, options = {} ) {\n\t\toptions.startPosition = this;\n\n\t\tconst treeWalker = new TreeWalker( options );\n\t\ttreeWalker.skip( skip );\n\n\t\treturn treeWalker.position;\n\t}\n\n\t/**\n\t * Returns a path to this position's parent. Parent path is equal to position {@link module:engine/model/position~Position#path path}\n\t * but without the last item.\n\t *\n\t * This method returns the parent path even if the parent does not exists.\n\t *\n\t * @returns {Array.} Path to the parent.\n\t */\n\tgetParentPath() {\n\t\treturn this.path.slice( 0, -1 );\n\t}\n\n\t/**\n\t * Returns ancestors array of this position, that is this position's parent and its ancestors.\n\t *\n\t * @returns {Array.} Array with ancestors.\n\t */\n\tgetAncestors() {\n\t\tif ( this.parent.is( 'documentFragment' ) ) {\n\t\t\treturn [ this.parent ];\n\t\t} else {\n\t\t\treturn this.parent.getAncestors( { includeSelf: true } );\n\t\t}\n\t}\n\n\t/**\n\t * Returns the slice of two position {@link #path paths} which is identical. The {@link #root roots}\n\t * of these two paths must be identical.\n\t *\n\t * @param {module:engine/model/position~Position} position The second position.\n\t * @returns {Array.} The common path.\n\t */\n\tgetCommonPath( position ) {\n\t\tif ( this.root != position.root ) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// We find on which tree-level start and end have the lowest common ancestor\n\t\tconst cmp = compareArrays( this.path, position.path );\n\t\t// If comparison returned string it means that arrays are same.\n\t\tconst diffAt = ( typeof cmp == 'string' ) ? Math.min( this.path.length, position.path.length ) : cmp;\n\n\t\treturn this.path.slice( 0, diffAt );\n\t}\n\n\t/**\n\t * Returns an {@link module:engine/model/element~Element} or {@link module:engine/model/documentfragment~DocumentFragment}\n\t * which is a common ancestor of both positions. The {@link #root roots} of these two positions must be identical.\n\t *\n\t * @param {module:engine/model/position~Position} position The second position.\n\t * @returns {module:engine/model/element~Element|module:engine/model/documentfragment~DocumentFragment|null}\n\t */\n\tgetCommonAncestor( position ) {\n\t\tconst ancestorsA = this.getAncestors();\n\t\tconst ancestorsB = position.getAncestors();\n\n\t\tlet i = 0;\n\n\t\twhile ( ancestorsA[ i ] == ancestorsB[ i ] && ancestorsA[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i === 0 ? null : ancestorsA[ i - 1 ];\n\t}\n\n\t/**\n\t * Returns a new instance of `Position`, that has same {@link #parent parent} but it's offset\n\t * is shifted by `shift` value (can be a negative value).\n\t *\n\t * @param {Number} shift Offset shift. Can be a negative value.\n\t * @returns {module:engine/model/position~Position} Shifted position.\n\t */\n\tgetShiftedBy( shift ) {\n\t\tconst shifted = Position.createFromPosition( this );\n\n\t\tconst offset = shifted.offset + shift;\n\t\tshifted.offset = offset < 0 ? 0 : offset;\n\n\t\treturn shifted;\n\t}\n\n\t/**\n\t * Checks whether this position is after given position.\n\t *\n\t * @see module:engine/model/position~Position#isBefore\n\t *\n\t * @param {module:engine/model/position~Position} otherPosition Position to compare with.\n\t * @returns {Boolean} True if this position is after given position.\n\t */\n\tisAfter( otherPosition ) {\n\t\treturn this.compareWith( otherPosition ) == 'after';\n\t}\n\n\t/**\n\t * Checks whether this position is before given position.\n\t *\n\t * **Note:** watch out when using negation of the value returned by this method, because the negation will also\n\t * be `true` if positions are in different roots and you might not expect this. You should probably use\n\t * `a.isAfter( b ) || a.isEqual( b )` or `!a.isBefore( p ) && a.root == b.root` in most scenarios. If your\n\t * condition uses multiple `isAfter` and `isBefore` checks, build them so they do not use negated values, i.e.:\n\t *\n\t *\t\tif ( a.isBefore( b ) && c.isAfter( d ) ) {\n\t *\t\t\t// do A.\n\t *\t\t} else {\n\t *\t\t\t// do B.\n\t *\t\t}\n\t *\n\t * or, if you have only one if-branch:\n\t *\n\t *\t\tif ( !( a.isBefore( b ) && c.isAfter( d ) ) {\n\t *\t\t\t// do B.\n\t *\t\t}\n\t *\n\t * rather than:\n\t *\n\t *\t\tif ( !a.isBefore( b ) || && !c.isAfter( d ) ) {\n\t *\t\t\t// do B.\n\t *\t\t} else {\n\t *\t\t\t// do A.\n\t *\t\t}\n\t *\n\t * @param {module:engine/model/position~Position} otherPosition Position to compare with.\n\t * @returns {Boolean} True if this position is before given position.\n\t */\n\tisBefore( otherPosition ) {\n\t\treturn this.compareWith( otherPosition ) == 'before';\n\t}\n\n\t/**\n\t * Checks whether this position is equal to given position.\n\t *\n\t * @param {module:engine/model/position~Position} otherPosition Position to compare with.\n\t * @returns {Boolean} True if positions are same.\n\t */\n\tisEqual( otherPosition ) {\n\t\treturn this.compareWith( otherPosition ) == 'same';\n\t}\n\n\t/**\n\t * Checks whether this position is touching given position. Positions touch when there are no text nodes\n\t * or empty nodes in a range between them. Technically, those positions are not equal but in many cases\n\t * they are very similar or even indistinguishable.\n\t *\n\t * **Note:** this method traverses model document so it can be only used when range is up-to-date with model document.\n\t *\n\t * @param {module:engine/model/position~Position} otherPosition Position to compare with.\n\t * @returns {Boolean} True if positions touch.\n\t */\n\tisTouching( otherPosition ) {\n\t\tlet left = null;\n\t\tlet right = null;\n\t\tconst compare = this.compareWith( otherPosition );\n\n\t\tswitch ( compare ) {\n\t\t\tcase 'same':\n\t\t\t\treturn true;\n\n\t\t\tcase 'before':\n\t\t\t\tleft = Position.createFromPosition( this );\n\t\t\t\tright = Position.createFromPosition( otherPosition );\n\t\t\t\tbreak;\n\n\t\t\tcase 'after':\n\t\t\t\tleft = Position.createFromPosition( otherPosition );\n\t\t\t\tright = Position.createFromPosition( this );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\n\t\t// Cached for optimization purposes.\n\t\tlet leftParent = left.parent;\n\n\t\twhile ( left.path.length + right.path.length ) {\n\t\t\tif ( left.isEqual( right ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif ( left.path.length > right.path.length ) {\n\t\t\t\tif ( left.offset !== leftParent.maxOffset ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tleft.path = left.path.slice( 0, -1 );\n\t\t\t\tleftParent = leftParent.parent;\n\t\t\t\tleft.offset++;\n\t\t\t} else {\n\t\t\t\tif ( right.offset !== 0 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tright.path = right.path.slice( 0, -1 );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns a copy of this position that is updated by removing `howMany` nodes starting from `deletePosition`.\n\t * It may happen that this position is in a removed node. If that is the case, `null` is returned instead.\n\t *\n\t * @protected\n\t * @param {module:engine/model/position~Position} deletePosition Position before the first removed node.\n\t * @param {Number} howMany How many nodes are removed.\n\t * @returns {module:engine/model/position~Position|null} Transformed position or `null`.\n\t */\n\t_getTransformedByDeletion( deletePosition, howMany ) {\n\t\tconst transformed = Position.createFromPosition( this );\n\n\t\t// This position can't be affected if deletion was in a different root.\n\t\tif ( this.root != deletePosition.root ) {\n\t\t\treturn transformed;\n\t\t}\n\n\t\tif ( compareArrays( deletePosition.getParentPath(), this.getParentPath() ) == 'same' ) {\n\t\t\t// If nodes are removed from the node that is pointed by this position...\n\t\t\tif ( deletePosition.offset < this.offset ) {\n\t\t\t\t// And are removed from before an offset of that position...\n\t\t\t\tif ( deletePosition.offset + howMany > this.offset ) {\n\t\t\t\t\t// Position is in removed range, it's no longer in the tree.\n\t\t\t\t\treturn null;\n\t\t\t\t} else {\n\t\t\t\t\t// Decrement the offset accordingly.\n\t\t\t\t\ttransformed.offset -= howMany;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( compareArrays( deletePosition.getParentPath(), this.getParentPath() ) == 'prefix' ) {\n\t\t\t// If nodes are removed from a node that is on a path to this position...\n\t\t\tconst i = deletePosition.path.length - 1;\n\n\t\t\tif ( deletePosition.offset <= this.path[ i ] ) {\n\t\t\t\t// And are removed from before next node of that path...\n\t\t\t\tif ( deletePosition.offset + howMany > this.path[ i ] ) {\n\t\t\t\t\t// If the next node of that path is removed return null\n\t\t\t\t\t// because the node containing this position got removed.\n\t\t\t\t\treturn null;\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise, decrement index on that path.\n\t\t\t\t\ttransformed.path[ i ] -= howMany;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn transformed;\n\t}\n\n\t/**\n\t * Returns a copy of this position that is updated by inserting `howMany` nodes at `insertPosition`.\n\t *\n\t * @protected\n\t * @param {module:engine/model/position~Position} insertPosition Position where nodes are inserted.\n\t * @param {Number} howMany How many nodes are inserted.\n\t * @param {Boolean} insertBefore Flag indicating whether nodes are inserted before or after `insertPosition`.\n\t * This is important only when `insertPosition` and this position are same. If that is the case and the flag is\n\t * set to `true`, this position will get transformed. If the flag is set to `false`, it won't.\n\t * @returns {module:engine/model/position~Position} Transformed position.\n\t */\n\t_getTransformedByInsertion( insertPosition, howMany, insertBefore ) {\n\t\tconst transformed = Position.createFromPosition( this );\n\n\t\t// This position can't be affected if insertion was in a different root.\n\t\tif ( this.root != insertPosition.root ) {\n\t\t\treturn transformed;\n\t\t}\n\n\t\tif ( compareArrays( insertPosition.getParentPath(), this.getParentPath() ) == 'same' ) {\n\t\t\t// If nodes are inserted in the node that is pointed by this position...\n\t\t\tif ( insertPosition.offset < this.offset || ( insertPosition.offset == this.offset && insertBefore ) ) {\n\t\t\t\t// And are inserted before an offset of that position...\n\t\t\t\t// \"Push\" this positions offset.\n\t\t\t\ttransformed.offset += howMany;\n\t\t\t}\n\t\t} else if ( compareArrays( insertPosition.getParentPath(), this.getParentPath() ) == 'prefix' ) {\n\t\t\t// If nodes are inserted in a node that is on a path to this position...\n\t\t\tconst i = insertPosition.path.length - 1;\n\n\t\t\tif ( insertPosition.offset <= this.path[ i ] ) {\n\t\t\t\t// And are inserted before next node of that path...\n\t\t\t\t// \"Push\" the index on that path.\n\t\t\t\ttransformed.path[ i ] += howMany;\n\t\t\t}\n\t\t}\n\n\t\treturn transformed;\n\t}\n\n\t/**\n\t * Returns a copy of this position that is updated by moving `howMany` nodes from `sourcePosition` to `targetPosition`.\n\t *\n\t * @protected\n\t * @param {module:engine/model/position~Position} sourcePosition Position before the first element to move.\n\t * @param {module:engine/model/position~Position} targetPosition Position where moved elements will be inserted.\n\t * @param {Number} howMany How many consecutive nodes to move, starting from `sourcePosition`.\n\t * @param {Boolean} insertBefore Flag indicating whether moved nodes are pasted before or after `insertPosition`.\n\t * This is important only when `targetPosition` and this position are same. If that is the case and the flag is\n\t * set to `true`, this position will get transformed by range insertion. If the flag is set to `false`, it won't.\n\t * @param {Boolean} [sticky] Flag indicating whether this position \"sticks\" to range, that is if it should be moved\n\t * with the moved range if it is equal to one of range's boundaries.\n\t * @returns {module:engine/model/position~Position} Transformed position.\n\t */\n\t_getTransformedByMove( sourcePosition, targetPosition, howMany, insertBefore, sticky ) {\n\t\t// Moving a range removes nodes from their original position. We acknowledge this by proper transformation.\n\t\tlet transformed = this._getTransformedByDeletion( sourcePosition, howMany );\n\n\t\t// Then we update target position, as it could be affected by nodes removal too.\n\t\ttargetPosition = targetPosition._getTransformedByDeletion( sourcePosition, howMany );\n\n\t\tif ( transformed === null || ( sticky && transformed.isEqual( sourcePosition ) ) ) {\n\t\t\t// This position is inside moved range (or sticks to it).\n\t\t\t// In this case, we calculate a combination of this position, move source position and target position.\n\t\t\ttransformed = this._getCombined( sourcePosition, targetPosition );\n\t\t} else {\n\t\t\t// This position is not inside a removed range.\n\t\t\t// In next step, we simply reflect inserting `howMany` nodes, which might further affect the position.\n\t\t\ttransformed = transformed._getTransformedByInsertion( targetPosition, howMany, insertBefore );\n\t\t}\n\n\t\treturn transformed;\n\t}\n\n\t/**\n\t * Returns a new position that is a combination of this position and given positions.\n\t *\n\t * The combined position is a copy of this position transformed by moving a range starting at `source` position\n\t * to the `target` position. It is expected that this position is inside the moved range.\n\t *\n\t * Example:\n\t *\n\t *\t\tlet original = new Position( root, [ 2, 3, 1 ] );\n\t *\t\tlet source = new Position( root, [ 2, 2 ] );\n\t *\t\tlet target = new Position( otherRoot, [ 1, 1, 3 ] );\n\t *\t\toriginal._getCombined( source, target ); // path is [ 1, 1, 4, 1 ], root is `otherRoot`\n\t *\n\t * Explanation:\n\t *\n\t * We have a position `[ 2, 3, 1 ]` and move some nodes from `[ 2, 2 ]` to `[ 1, 1, 3 ]`. The original position\n\t * was inside moved nodes and now should point to the new place. The moved nodes will be after\n\t * positions `[ 1, 1, 3 ]`, `[ 1, 1, 4 ]`, `[ 1, 1, 5 ]`. Since our position was in the second moved node,\n\t * the transformed position will be in a sub-tree of a node at `[ 1, 1, 4 ]`. Looking at original path, we\n\t * took care of `[ 2, 3 ]` part of it. Now we have to add the rest of the original path to the transformed path.\n\t * Finally, the transformed position will point to `[ 1, 1, 4, 1 ]`.\n\t *\n\t * @protected\n\t * @param {module:engine/model/position~Position} source Beginning of the moved range.\n\t * @param {module:engine/model/position~Position} target Position where the range is moved.\n\t * @returns {module:engine/model/position~Position} Combined position.\n\t */\n\t_getCombined( source, target ) {\n\t\tconst i = source.path.length - 1;\n\n\t\t// The first part of a path to combined position is a path to the place where nodes were moved.\n\t\tconst combined = Position.createFromPosition( target );\n\n\t\t// Then we have to update the rest of the path.\n\n\t\t// Fix the offset because this position might be after `from` position and we have to reflect that.\n\t\tcombined.offset = combined.offset + this.path[ i ] - source.offset;\n\n\t\t// Then, add the rest of the path.\n\t\t// If this position is at the same level as `from` position nothing will get added.\n\t\tcombined.path = combined.path.concat( this.path.slice( i + 1 ) );\n\n\t\treturn combined;\n\t}\n\n\t/**\n\t * Creates position at the given location. The location can be specified as:\n\t *\n\t * * a {@link module:engine/model/position~Position position},\n\t * * parent element and offset (offset defaults to `0`),\n\t * * parent element and `'end'` (sets position at the end of that element),\n\t * * {@link module:engine/model/item~Item model item} and `'before'` or `'after'` (sets position before or after given model item).\n\t *\n\t * This method is a shortcut to other constructors such as:\n\t *\n\t * * {@link module:engine/model/position~Position.createBefore},\n\t * * {@link module:engine/model/position~Position.createAfter},\n\t * * {@link module:engine/model/position~Position.createFromParentAndOffset},\n\t * * {@link module:engine/model/position~Position.createFromPosition}.\n\t *\n\t * @param {module:engine/model/item~Item|module:engine/model/position~Position} itemOrPosition\n\t * @param {Number|'end'|'before'|'after'} [offset=0] Offset or one of the flags. Used only when\n\t * first parameter is a {@link module:engine/model/item~Item model item}.\n\t */\n\tstatic createAt( itemOrPosition, offset ) {\n\t\tif ( itemOrPosition instanceof Position ) {\n\t\t\treturn this.createFromPosition( itemOrPosition );\n\t\t} else {\n\t\t\tconst node = itemOrPosition;\n\n\t\t\tif ( offset == 'end' ) {\n\t\t\t\toffset = node.maxOffset;\n\t\t\t} else if ( offset == 'before' ) {\n\t\t\t\treturn this.createBefore( node );\n\t\t\t} else if ( offset == 'after' ) {\n\t\t\t\treturn this.createAfter( node );\n\t\t\t} else if ( !offset ) {\n\t\t\t\toffset = 0;\n\t\t\t}\n\n\t\t\treturn this.createFromParentAndOffset( node, offset );\n\t\t}\n\t}\n\n\t/**\n\t * Creates a new position, after given {@link module:engine/model/item~Item model item}.\n\t *\n\t * @param {module:engine/model/item~Item} item Item after which the position should be placed.\n\t * @returns {module:engine/model/position~Position}\n\t */\n\tstatic createAfter( item ) {\n\t\tif ( !item.parent ) {\n\t\t\t/**\n\t\t\t * You can not make a position after a root element.\n\t\t\t *\n\t\t\t * @error model-position-after-root\n\t\t\t * @param {module:engine/model/item~Item} root\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'model-position-after-root: You cannot make a position after root.', { root: item } );\n\t\t}\n\n\t\treturn this.createFromParentAndOffset( item.parent, item.endOffset );\n\t}\n\n\t/**\n\t * Creates a new position, before the given {@link module:engine/model/item~Item model item}.\n\t *\n\t * @param {module:engine/model/item~Item} item Item before which the position should be placed.\n\t * @returns {module:engine/model/position~Position}\n\t */\n\tstatic createBefore( item ) {\n\t\tif ( !item.parent ) {\n\t\t\t/**\n\t\t\t * You can not make a position before a root element.\n\t\t\t *\n\t\t\t * @error model-position-before-root\n\t\t\t * @param {module:engine/model/item~Item} root\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'model-position-before-root: You cannot make a position before root.', { root: item } );\n\t\t}\n\n\t\treturn this.createFromParentAndOffset( item.parent, item.startOffset );\n\t}\n\n\t/**\n\t * Creates a new position from the parent element and an offset in that element.\n\t *\n\t * @param {module:engine/model/element~Element|module:engine/model/documentfragment~DocumentFragment} parent Position's parent.\n\t * @param {Number} offset Position's offset.\n\t * @returns {module:engine/model/position~Position}\n\t */\n\tstatic createFromParentAndOffset( parent, offset ) {\n\t\tif ( !parent.is( 'element' ) && !parent.is( 'documentFragment' ) ) {\n\t\t\t/**\n\t\t\t * Position parent have to be a model element or model document fragment.\n\t\t\t *\n\t\t\t * @error model-position-parent-incorrect\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'model-position-parent-incorrect: Position parent have to be a element or document fragment.' );\n\t\t}\n\n\t\tconst path = parent.getPath();\n\n\t\tpath.push( offset );\n\n\t\treturn new this( parent.root, path );\n\t}\n\n\t/**\n\t * Creates a new position, which is equal to passed position.\n\t *\n\t * @param {module:engine/model/position~Position} position Position to be cloned.\n\t * @returns {module:engine/model/position~Position}\n\t */\n\tstatic createFromPosition( position ) {\n\t\treturn new this( position.root, position.path.slice() );\n\t}\n\n\t/**\n\t * Creates a `Position` instance from given plain object (i.e. parsed JSON string).\n\t *\n\t * @param {Object} json Plain object to be converted to `Position`.\n\t * @returns {module:engine/model/position~Position} `Position` instance created using given plain object.\n\t */\n\tstatic fromJSON( json, doc ) {\n\t\tif ( json.root === '$graveyard' ) {\n\t\t\treturn new Position( doc.graveyard, json.path );\n\t\t}\n\n\t\tif ( !doc.hasRoot( json.root ) ) {\n\t\t\t/**\n\t\t\t * Cannot create position for document. Root with specified name does not exist.\n\t\t\t *\n\t\t\t * @error model-position-fromjson-no-root\n\t\t\t * @param {String} rootName\n\t\t\t */\n\t\t\tthrow new CKEditorError(\n\t\t\t\t'model-position-fromjson-no-root: Cannot create position for document. Root with specified name does not exist.',\n\t\t\t\t{ rootName: json.root }\n\t\t\t);\n\t\t}\n\n\t\treturn new Position( doc.getRoot( json.root ), json.path );\n\t}\n}\n\n/**\n * A flag indicating whether this position is `'before'` or `'after'` or `'same'` as given position.\n * If positions are in different roots `'different'` flag is returned.\n *\n * @typedef {String} module:engine/model/position~PositionRelation\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/position.js\n// module id = 1\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module core/plugin\n */\n\nimport ObservableMixin from '@ckeditor/ckeditor5-utils/src/observablemixin';\nimport mix from '@ckeditor/ckeditor5-utils/src/mix';\n\n/**\n * The base class for CKEditor plugin classes.\n *\n * @implements module:core/plugin~PluginInterface\n * @mixes module:utils/observablemixin~ObservableMixin\n */\nexport default class Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor ) {\n\t\t/**\n\t\t * The editor instance.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:core/editor/editor~Editor} #editor\n\t\t */\n\t\tthis.editor = editor;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tthis.stopListening();\n\t}\n}\n\nmix( Plugin, ObservableMixin );\n\n/**\n * The base interface for CKEditor plugins.\n *\n * In its minimal form it can be a simple function (it will be used as a constructor) which accepts\n * {@link module:core/editor/editor~Editor the editor} as a parm.\n * It can also implement a few methods which, when present, will be used to properly initialize and destroy the plugin.\n *\n *\t\t// A simple plugin which enables a data processor.\n *\t\tfunction MyPlugin( editor ) {\n *\t\t\teditor.data.processor = new MyDataProcessor();\n *\t\t}\n *\n * In most cases, however, you'll want to inherit from the {@link module:core/plugin~Plugin} class which implements the\n * {@link module:utils/observablemixin~ObservableMixin} and is, therefore, more convenient:\n *\n *\t\tclass MyPlugin extends Plugin {\n *\t\t\tinit() {\n *\t\t\t\t// `listenTo()` and `editor` are available thanks to `Plugin`.\n *\t\t\t\t// By using `listenTo()` you'll ensure that the listener will be removed when\n *\t\t\t\t// the plugin is destroyed.\n *\t\t\t\tthis.listenTo( this.editor, 'dataReady', () => {\n *\t\t\t\t\t// Do something when data is ready.\n *\t\t\t\t} );\n *\t\t\t}\n *\t\t}\n *\n * @interface PluginInterface\n */\n\n/**\n * Creates a new plugin instance. This is the first step of a plugin initialization.\n * See also {@link #init} and {@link #afterInit}.\n *\n * A plugin is always instantiated after its {@link module:core/plugin~PluginInterface.requires dependencies} and the\n * {@link #init} and {@link #afterInit} methods are called in the same order.\n *\n * Usually, you'll want to put your plugin's initialization code in the {@link #init} method.\n * The constructor can be understood as \"before init\" and used in special cases, just like\n * {@link #afterInit} servers for the special \"after init\" scenarios (e.g. code which depends on other\n * plugins, but which doesn't {@link module:core/plugin~PluginInterface.requires explicitly require} them).\n *\n * @method #constructor\n * @param {module:core/editor/editor~Editor} editor\n */\n\n/**\n * An array of plugins required by this plugin.\n *\n * To keep a plugin class definition tight it's recommended to define this property as a static getter:\n *\n *\t\timport Image from './image.js';\n *\n *\t\texport default class ImageCaption {\n *\t\t\tstatic get requires() {\n *\t\t\t\treturn [ Image ];\n *\t\t\t}\n *\t\t}\n *\n * @static\n * @readonly\n * @member {Array.|undefined} module:core/plugin~PluginInterface.requires\n */\n\n/**\n * Optional name of the plugin. If set, the plugin will be available in\n * {@link module:core/plugincollection~PluginCollection#get} by its\n * name and its constructor. If not, then only by its constructor.\n *\n * The name should reflect the constructor name.\n *\n * To keep a plugin class definition tight it's recommended to define this property as a static getter:\n *\n *\t\texport default class ImageCaption {\n *\t\t\tstatic get pluginName() {\n *\t\t\t\treturn 'ImageCaption';\n *\t\t\t}\n *\t\t}\n *\n * Note: The native `Function.name` property could not be used to keep the plugin name because\n * it will be mangled during code minification.\n *\n * Naming a plugin is necessary to enable removing it through the\n * {@link module:core/editor/editorconfig~EditorConfig#removePlugins `config.removePlugins`} option.\n *\n * @static\n * @readonly\n * @member {String|undefined} module:core/plugin~PluginInterface.pluginName\n */\n\n/**\n * The second stage (after plugin {@link #constructor}) of plugin initialization.\n * Unlike the plugin constructor this method can be asynchronous.\n *\n * A plugin's `init()` method is called after its {@link module:core/plugin~PluginInterface.requires dependencies} are initialized,\n * so in the same order as constructors of these plugins.\n *\n * **Note:** This method is optional. A plugin instance does not need to have to have it defined.\n *\n * @method #init\n * @returns {null|Promise}\n */\n\n/**\n * The third (and last) stage of plugin initialization. See also {@link #constructor} and {@link #init}.\n *\n * **Note:** This method is optional. A plugin instance does not need to have to have it defined.\n *\n * @method #afterInit\n * @returns {null|Promise}\n */\n\n/**\n * Destroys the plugin.\n *\n * **Note:** This method is optional. A plugin instance does not need to have to have it defined.\n *\n * @method #destroy\n * @returns {null|Promise}\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-core/src/plugin.js\n// module id = 2\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/range\n */\n\nimport Position from './position';\nimport TreeWalker from './treewalker';\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\n\n/**\n * Range class. Range is iterable.\n */\nexport default class Range {\n\t/**\n\t * Creates a range spanning from `start` position to `end` position.\n\t *\n\t * **Note:** Constructor creates it's own {@link module:engine/model/position~Position Position} instances basing on passed values.\n\t *\n\t * @param {module:engine/model/position~Position} start Start position.\n\t * @param {module:engine/model/position~Position} [end] End position. If not set, range will be collapsed at `start` position.\n\t */\n\tconstructor( start, end = null ) {\n\t\t/**\n\t\t * Start position.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/model/position~Position}\n\t\t */\n\t\tthis.start = Position.createFromPosition( start );\n\n\t\t/**\n\t\t * End position.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/model/position~Position}\n\t\t */\n\t\tthis.end = end ? Position.createFromPosition( end ) : Position.createFromPosition( start );\n\t}\n\n\t/**\n\t * Returns an iterator that iterates over all {@link module:engine/model/item~Item items} that are in this range and returns\n\t * them together with additional information like length or {@link module:engine/model/position~Position positions},\n\t * grouped as {@link module:engine/model/treewalker~TreeWalkerValue}.\n\t * It iterates over all {@link module:engine/model/textproxy~TextProxy text contents} that are inside the range\n\t * and all the {@link module:engine/model/element~Element}s that are entered into when iterating over this range.\n\t *\n\t * This iterator uses {@link module:engine/model/treewalker~TreeWalker} with `boundaries` set to this range\n\t * and `ignoreElementEnd` option set to `true`.\n\t *\n\t * @returns {Iterable.}\n\t */\n\t* [ Symbol.iterator ]() {\n\t\tyield* new TreeWalker( { boundaries: this, ignoreElementEnd: true } );\n\t}\n\n\t/**\n\t * Returns whether the range is collapsed, that is if {@link #start} and\n\t * {@link #end} positions are equal.\n\t *\n\t * @type {Boolean}\n\t */\n\tget isCollapsed() {\n\t\treturn this.start.isEqual( this.end );\n\t}\n\n\t/**\n\t * Returns whether this range is flat, that is if {@link #start} position and\n\t * {@link #end} position are in the same {@link module:engine/model/position~Position#parent}.\n\t *\n\t * @type {Boolean}\n\t */\n\tget isFlat() {\n\t\treturn this.start.parent === this.end.parent;\n\t}\n\n\t/**\n\t * Range root element.\n\t *\n\t * @type {module:engine/model/element~Element|module:engine/model/documentfragment~DocumentFragment}\n\t */\n\tget root() {\n\t\treturn this.start.root;\n\t}\n\n\t/**\n\t * Checks whether this range contains given {@link module:engine/model/position~Position position}.\n\t *\n\t * @param {module:engine/model/position~Position} position Position to check.\n\t * @returns {Boolean} `true` if given {@link module:engine/model/position~Position position} is contained\n\t * in this range,`false` otherwise.\n\t */\n\tcontainsPosition( position ) {\n\t\treturn position.isAfter( this.start ) && position.isBefore( this.end );\n\t}\n\n\t/**\n\t * Checks whether this range contains given {@link ~Range range}.\n\t *\n\t * @param {module:engine/model/range~Range} otherRange Range to check.\n\t * @param {Boolean} [loose=false] Whether the check is loose or strict. If the check is strict (`false`), compared range cannot\n\t * start or end at the same position as this range boundaries. If the check is loose (`true`), compared range can start, end or\n\t * even be equal to this range. Note that collapsed ranges are always compared in strict mode.\n\t * @returns {Boolean} `true` if given {@link ~Range range} boundaries are contained by this range, `false` otherwise.\n\t */\n\tcontainsRange( otherRange, loose = false ) {\n\t\tif ( otherRange.isCollapsed ) {\n\t\t\tloose = false;\n\t\t}\n\n\t\tconst containsStart = this.containsPosition( otherRange.start ) || ( loose && this.start.isEqual( otherRange.start ) );\n\t\tconst containsEnd = this.containsPosition( otherRange.end ) || ( loose && this.end.isEqual( otherRange.end ) );\n\n\t\treturn containsStart && containsEnd;\n\t}\n\n\t/**\n\t * Checks whether given {@link module:engine/model/item~Item} is inside this range.\n\t *\n\t * @param {module:engine/model/item~Item} item Model item to check.\n\t */\n\tcontainsItem( item ) {\n\t\tconst pos = Position.createBefore( item );\n\n\t\treturn this.containsPosition( pos ) || this.start.isEqual( pos );\n\t}\n\n\t/**\n\t * Two ranges are equal if their {@link #start} and {@link #end} positions are equal.\n\t *\n\t * @param {module:engine/model/range~Range} otherRange Range to compare with.\n\t * @returns {Boolean} `true` if ranges are equal, `false` otherwise.\n\t */\n\tisEqual( otherRange ) {\n\t\treturn this.start.isEqual( otherRange.start ) && this.end.isEqual( otherRange.end );\n\t}\n\n\t/**\n\t * Checks and returns whether this range intersects with given range.\n\t *\n\t * @param {module:engine/model/range~Range} otherRange Range to compare with.\n\t * @returns {Boolean} `true` if ranges intersect, `false` otherwise.\n\t */\n\tisIntersecting( otherRange ) {\n\t\treturn this.start.isBefore( otherRange.end ) && this.end.isAfter( otherRange.start );\n\t}\n\n\t/**\n\t * Computes which part(s) of this {@link ~Range range} is not a part of given {@link ~Range range}.\n\t * Returned array contains zero, one or two {@link ~Range ranges}.\n\t *\n\t * Examples:\n\t *\n\t *\t\tlet range = new Range( new Position( root, [ 2, 7 ] ), new Position( root, [ 4, 0, 1 ] ) );\n\t *\t\tlet otherRange = new Range( new Position( root, [ 1 ] ), new Position( root, [ 5 ] ) );\n\t *\t\tlet transformed = range.getDifference( otherRange );\n\t *\t\t// transformed array has no ranges because `otherRange` contains `range`\n\t *\n\t *\t\totherRange = new Range( new Position( root, [ 1 ] ), new Position( root, [ 3 ] ) );\n\t *\t\ttransformed = range.getDifference( otherRange );\n\t *\t\t// transformed array has one range: from [ 3 ] to [ 4, 0, 1 ]\n\t *\n\t *\t\totherRange = new Range( new Position( root, [ 3 ] ), new Position( root, [ 4 ] ) );\n\t *\t\ttransformed = range.getDifference( otherRange );\n\t *\t\t// transformed array has two ranges: from [ 2, 7 ] to [ 3 ] and from [ 4 ] to [ 4, 0, 1 ]\n\t *\n\t * @param {module:engine/model/range~Range} otherRange Range to differentiate against.\n\t * @returns {Array.} The difference between ranges.\n\t */\n\tgetDifference( otherRange ) {\n\t\tconst ranges = [];\n\n\t\tif ( this.isIntersecting( otherRange ) ) {\n\t\t\t// Ranges intersect.\n\n\t\t\tif ( this.containsPosition( otherRange.start ) ) {\n\t\t\t\t// Given range start is inside this range. This means that we have to\n\t\t\t\t// add shrunken range - from the start to the middle of this range.\n\t\t\t\tranges.push( new Range( this.start, otherRange.start ) );\n\t\t\t}\n\n\t\t\tif ( this.containsPosition( otherRange.end ) ) {\n\t\t\t\t// Given range end is inside this range. This means that we have to\n\t\t\t\t// add shrunken range - from the middle of this range to the end.\n\t\t\t\tranges.push( new Range( otherRange.end, this.end ) );\n\t\t\t}\n\t\t} else {\n\t\t\t// Ranges do not intersect, return the original range.\n\t\t\tranges.push( Range.createFromRange( this ) );\n\t\t}\n\n\t\treturn ranges;\n\t}\n\n\t/**\n\t * Returns an intersection of this {@link ~Range range} and given {@link ~Range range}.\n\t * Intersection is a common part of both of those ranges. If ranges has no common part, returns `null`.\n\t *\n\t * Examples:\n\t *\n\t *\t\tlet range = new Range( new Position( root, [ 2, 7 ] ), new Position( root, [ 4, 0, 1 ] ) );\n\t *\t\tlet otherRange = new Range( new Position( root, [ 1 ] ), new Position( root, [ 2 ] ) );\n\t *\t\tlet transformed = range.getIntersection( otherRange ); // null - ranges have no common part\n\t *\n\t *\t\totherRange = new Range( new Position( root, [ 3 ] ), new Position( root, [ 5 ] ) );\n\t *\t\ttransformed = range.getIntersection( otherRange ); // range from [ 3 ] to [ 4, 0, 1 ]\n\t *\n\t * @param {module:engine/model/range~Range} otherRange Range to check for intersection.\n\t * @returns {module:engine/model/range~Range|null} A common part of given ranges or `null` if ranges have no common part.\n\t */\n\tgetIntersection( otherRange ) {\n\t\tif ( this.isIntersecting( otherRange ) ) {\n\t\t\t// Ranges intersect, so a common range will be returned.\n\t\t\t// At most, it will be same as this range.\n\t\t\tlet commonRangeStart = this.start;\n\t\t\tlet commonRangeEnd = this.end;\n\n\t\t\tif ( this.containsPosition( otherRange.start ) ) {\n\t\t\t\t// Given range start is inside this range. This means thaNt we have to\n\t\t\t\t// shrink common range to the given range start.\n\t\t\t\tcommonRangeStart = otherRange.start;\n\t\t\t}\n\n\t\t\tif ( this.containsPosition( otherRange.end ) ) {\n\t\t\t\t// Given range end is inside this range. This means that we have to\n\t\t\t\t// shrink common range to the given range end.\n\t\t\t\tcommonRangeEnd = otherRange.end;\n\t\t\t}\n\n\t\t\treturn new Range( commonRangeStart, commonRangeEnd );\n\t\t}\n\n\t\t// Ranges do not intersect, so they do not have common part.\n\t\treturn null;\n\t}\n\n\t/**\n\t * Computes and returns the smallest set of {@link #isFlat flat} ranges, that covers this range in whole.\n\t *\n\t * See an example of a model structure (`[` and `]` are range boundaries):\n\t *\n\t *\t\troot root\n\t *\t\t |- element DIV DIV P2 P3 DIV\n\t *\t\t | |- element H H P1 f o o b a r H P4\n\t *\t\t | | |- \"fir[st\" fir[st lorem se]cond ipsum\n\t *\t\t | |- element P1\n\t *\t\t | | |- \"lorem\" ||\n\t *\t\t |- element P2 ||\n\t *\t\t | |- \"foo\" VV\n\t *\t\t |- element P3\n\t *\t\t | |- \"bar\" root\n\t *\t\t |- element DIV DIV [P2 P3] DIV\n\t *\t\t | |- element H H [P1] f o o b a r H P4\n\t *\t\t | | |- \"se]cond\" fir[st] lorem [se]cond ipsum\n\t *\t\t | |- element P4\n\t *\t\t | | |- \"ipsum\"\n\t *\n\t * As it can be seen, letters contained in the range are: `stloremfoobarse`, spread across different parents.\n\t * We are looking for minimal set of flat ranges that contains the same nodes.\n\t *\n\t * Minimal flat ranges for above range `( [ 0, 0, 3 ], [ 3, 0, 2 ] )` will be:\n\t *\n\t *\t\t( [ 0, 0, 3 ], [ 0, 0, 5 ] ) = \"st\"\n\t *\t\t( [ 0, 1 ], [ 0, 2 ] ) = element P1 (\"lorem\")\n\t *\t\t( [ 1 ], [ 3 ] ) = element P2, element P3 (\"foobar\")\n\t *\t\t( [ 3, 0, 0 ], [ 3, 0, 2 ] ) = \"se\"\n\t *\n\t * **Note:** if an {@link module:engine/model/element~Element element} is not wholly contained in this range, it won't be returned\n\t * in any of the returned flat ranges. See in the example how `H` elements at the beginning and at the end of the range\n\t * were omitted. Only their parts that were wholly in the range were returned.\n\t *\n\t * **Note:** this method is not returning flat ranges that contain no nodes.\n\t *\n\t * @returns {Array.} Array of flat ranges covering this range.\n\t */\n\tgetMinimalFlatRanges() {\n\t\tconst ranges = [];\n\t\tconst diffAt = this.start.getCommonPath( this.end ).length;\n\n\t\tconst pos = Position.createFromPosition( this.start );\n\t\tlet posParent = pos.parent;\n\n\t\t// Go up.\n\t\twhile ( pos.path.length > diffAt + 1 ) {\n\t\t\tconst howMany = posParent.maxOffset - pos.offset;\n\n\t\t\tif ( howMany !== 0 ) {\n\t\t\t\tranges.push( new Range( pos, pos.getShiftedBy( howMany ) ) );\n\t\t\t}\n\n\t\t\tpos.path = pos.path.slice( 0, -1 );\n\t\t\tpos.offset++;\n\t\t\tposParent = posParent.parent;\n\t\t}\n\n\t\t// Go down.\n\t\twhile ( pos.path.length <= this.end.path.length ) {\n\t\t\tconst offset = this.end.path[ pos.path.length - 1 ];\n\t\t\tconst howMany = offset - pos.offset;\n\n\t\t\tif ( howMany !== 0 ) {\n\t\t\t\tranges.push( new Range( pos, pos.getShiftedBy( howMany ) ) );\n\t\t\t}\n\n\t\t\tpos.offset = offset;\n\t\t\tpos.path.push( 0 );\n\t\t}\n\n\t\treturn ranges;\n\t}\n\n\t/**\n\t * Creates a {@link module:engine/model/treewalker~TreeWalker TreeWalker} instance with this range as a boundary.\n\t *\n\t * @param {Object} options Object with configuration options. See {@link module:engine/model/treewalker~TreeWalker}.\n\t * @param {module:engine/model/position~Position} [options.startPosition]\n\t * @param {Boolean} [options.singleCharacters=false]\n\t * @param {Boolean} [options.shallow=false]\n\t * @param {Boolean} [options.ignoreElementEnd=false]\n\t */\n\tgetWalker( options = {} ) {\n\t\toptions.boundaries = this;\n\n\t\treturn new TreeWalker( options );\n\t}\n\n\t/**\n\t * Returns an iterator that iterates over all {@link module:engine/model/item~Item items} that are in this range and returns\n\t * them.\n\t *\n\t * This method uses {@link module:engine/model/treewalker~TreeWalker} with `boundaries` set to this range and `ignoreElementEnd` option\n\t * set to `true`. However it returns only {@link module:engine/model/item~Item model items},\n\t * not {@link module:engine/model/treewalker~TreeWalkerValue}.\n\t *\n\t * You may specify additional options for the tree walker. See {@link module:engine/model/treewalker~TreeWalker} for\n\t * a full list of available options.\n\t *\n\t * @method getItems\n\t * @param {Object} options Object with configuration options. See {@link module:engine/model/treewalker~TreeWalker}.\n\t * @returns {Iterable.}\n\t */\n\t* getItems( options = {} ) {\n\t\toptions.boundaries = this;\n\t\toptions.ignoreElementEnd = true;\n\n\t\tconst treeWalker = new TreeWalker( options );\n\n\t\tfor ( const value of treeWalker ) {\n\t\t\tyield value.item;\n\t\t}\n\t}\n\n\t/**\n\t * Returns an iterator that iterates over all {@link module:engine/model/position~Position positions} that are boundaries or\n\t * contained in this range.\n\t *\n\t * This method uses {@link module:engine/model/treewalker~TreeWalker} with `boundaries` set to this range. However it returns only\n\t * {@link module:engine/model/position~Position positions}, not {@link module:engine/model/treewalker~TreeWalkerValue}.\n\t *\n\t * You may specify additional options for the tree walker. See {@link module:engine/model/treewalker~TreeWalker} for\n\t * a full list of available options.\n\t *\n\t * @param {Object} options Object with configuration options. See {@link module:engine/model/treewalker~TreeWalker}.\n\t * @returns {Iterable.}\n\t */\n\t* getPositions( options = {} ) {\n\t\toptions.boundaries = this;\n\n\t\tconst treeWalker = new TreeWalker( options );\n\n\t\tyield treeWalker.position;\n\n\t\tfor ( const value of treeWalker ) {\n\t\t\tyield value.nextPosition;\n\t\t}\n\t}\n\n\t/**\n\t * Returns a range that is a result of transforming this range by given `delta`.\n\t *\n\t * **Note:** transformation may break one range into multiple ranges (e.g. when a part of the range is\n\t * moved to a different part of document tree). For this reason, an array is returned by this method and it\n\t * may contain one or more `Range` instances.\n\t *\n\t * @param {module:engine/model/delta/delta~Delta} delta Delta to transform range by.\n\t * @returns {Array.} Range which is the result of transformation.\n\t */\n\tgetTransformedByDelta( delta ) {\n\t\tconst ranges = [ Range.createFromRange( this ) ];\n\n\t\t// Operation types that a range can be transformed by.\n\t\tconst supportedTypes = new Set( [ 'insert', 'move', 'remove', 'reinsert' ] );\n\n\t\tfor ( const operation of delta.operations ) {\n\t\t\tif ( supportedTypes.has( operation.type ) ) {\n\t\t\t\tfor ( let i = 0; i < ranges.length; i++ ) {\n\t\t\t\t\tconst result = ranges[ i ]._getTransformedByDocumentChange(\n\t\t\t\t\t\toperation.type,\n\t\t\t\t\t\tdelta.type,\n\t\t\t\t\t\toperation.targetPosition || operation.position,\n\t\t\t\t\t\toperation.howMany || operation.nodes.maxOffset,\n\t\t\t\t\t\toperation.sourcePosition\n\t\t\t\t\t);\n\n\t\t\t\t\tranges.splice( i, 1, ...result );\n\n\t\t\t\t\ti += result.length - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ranges;\n\t}\n\n\t/**\n\t * Returns a range that is a result of transforming this range by multiple `deltas`.\n\t *\n\t * **Note:** transformation may break one range into multiple ranges (e.g. when a part of the range is\n\t * moved to a different part of document tree). For this reason, an array is returned by this method and it\n\t * may contain one or more `Range` instances.\n\t *\n\t * @param {Iterable.} deltas Deltas to transform the range by.\n\t * @returns {Array.} Range which is the result of transformation.\n\t */\n\tgetTransformedByDeltas( deltas ) {\n\t\tconst ranges = [ Range.createFromRange( this ) ];\n\n\t\tfor ( const delta of deltas ) {\n\t\t\tfor ( let i = 0; i < ranges.length; i++ ) {\n\t\t\t\tconst result = ranges[ i ].getTransformedByDelta( delta );\n\n\t\t\t\tranges.splice( i, 1, ...result );\n\t\t\t\ti += result.length - 1;\n\t\t\t}\n\t\t}\n\n\t\t// It may happen that a range is split into two, and then the part of second \"piece\" is moved into first\n\t\t// \"piece\". In this case we will have incorrect third range, which should not be included in the result --\n\t\t// because it is already included in the first \"piece\". In this loop we are looking for all such ranges that\n\t\t// are inside other ranges and we simply remove them.\n\t\tfor ( let i = 0; i < ranges.length; i++ ) {\n\t\t\tconst range = ranges[ i ];\n\n\t\t\tfor ( let j = i + 1; j < ranges.length; j++ ) {\n\t\t\t\tconst next = ranges[ j ];\n\n\t\t\t\tif ( range.containsRange( next ) || next.containsRange( range ) || range.isEqual( next ) ) {\n\t\t\t\t\tranges.splice( j, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ranges;\n\t}\n\n\t/**\n\t * Returns an {@link module:engine/model/element~Element} or {@link module:engine/model/documentfragment~DocumentFragment}\n\t * which is a common ancestor of the range's both ends (in which the entire range is contained).\n\t *\n\t * @returns {module:engine/model/element~Element|module:engine/model/documentfragment~DocumentFragment|null}\n\t */\n\tgetCommonAncestor() {\n\t\treturn this.start.getCommonAncestor( this.end );\n\t}\n\n\t/**\n\t * Returns a range that is a result of transforming this range by a change in the model document.\n\t *\n\t * @protected\n\t * @param {'insert'|'move'|'remove'|'reinsert'} type Change type.\n\t * @param {String} deltaType Type of delta that introduced the change.\n\t * @param {module:engine/model/position~Position} targetPosition Position before the first changed node.\n\t * @param {Number} howMany How many nodes has been changed.\n\t * @param {module:engine/model/position~Position} sourcePosition Source position of changes.\n\t * @returns {Array.}\n\t */\n\t_getTransformedByDocumentChange( type, deltaType, targetPosition, howMany, sourcePosition ) {\n\t\tif ( type == 'insert' ) {\n\t\t\treturn this._getTransformedByInsertion( targetPosition, howMany, false, false );\n\t\t} else {\n\t\t\tconst sourceRange = Range.createFromPositionAndShift( sourcePosition, howMany );\n\n\t\t\t// Edge case for merge delta.\n\t\t\tif (\n\t\t\t\tdeltaType == 'merge' &&\n\t\t\t\tthis.isCollapsed &&\n\t\t\t\t( this.start.isEqual( sourceRange.start ) || this.start.isEqual( sourceRange.end ) )\n\t\t\t) {\n\t\t\t\t// Collapsed range is in merged element, at the beginning or at the end of it.\n\t\t\t\t// Without fix, the range would end up in the graveyard, together with removed element.\n\t\t\t\t//

foo

[]bar

->

foobar

[]

->

foobar

->

foo[]bar

\n\t\t\t\t//

foo

bar[]

->

foobar

[]

->

foobar

->

foobar[]

\n\t\t\t\t//\n\t\t\t\t// In most cases, `sourceRange.start.offset` for merge delta's move operation would be 0,\n\t\t\t\t// so this formula might look overcomplicated.\n\t\t\t\t// However in some scenarios, after operational transformation, move operation might not\n\t\t\t\t// in fact start from 0 and we need to properly count new offset.\n\t\t\t\t// https://github.com/ckeditor/ckeditor5-engine/pull/1133#issuecomment-329080668.\n\t\t\t\tconst offset = this.start.offset - sourceRange.start.offset;\n\n\t\t\t\treturn [ new Range( targetPosition.getShiftedBy( offset ) ) ];\n\t\t\t}\n\t\t\t//\n\t\t\t// Edge case for split delta.\n\t\t\t//\n\t\t\tif ( deltaType == 'split' && this.isCollapsed && this.end.isEqual( sourceRange.end ) ) {\n\t\t\t\t// Collapsed range is at the end of split element.\n\t\t\t\t// Without fix, the range would end up at the end of split (old) element instead of at the end of new element.\n\t\t\t\t// That would happen because this range is not technically inside moved range. Last step below shows the fix.\n\t\t\t\t//

foobar[]

->

foobar[]

->

foo[]

bar

->

foo

bar[]

\n\t\t\t\treturn [ new Range( targetPosition.getShiftedBy( howMany ) ) ];\n\t\t\t}\n\t\t\t//\n\t\t\t// Other edge cases:\n\t\t\t//\n\t\t\t// In all examples `[]` is `this` and `{}` is `sourceRange`, while `^` is move target position.\n\t\t\t//\n\t\t\t// Example:\n\t\t\t//

xx

^{

a[b

}

c]d

-->

xx

a[b

c]d

\n\t\t\t// ^

xx

{

a[b

}

c]d

-->

a[b

xx

c]d

// Note

xx

inclusion.\n\t\t\t// {

a[b

}
^

c]d

-->

a[b

c]d

\n\t\t\tif (\n\t\t\t\t( sourceRange.containsPosition( this.start ) || sourceRange.start.isEqual( this.start ) ) &&\n\t\t\t\tthis.containsPosition( sourceRange.end ) &&\n\t\t\t\tthis.end.isAfter( targetPosition )\n\t\t\t) {\n\t\t\t\tconst start = this.start._getCombined(\n\t\t\t\t\tsourcePosition,\n\t\t\t\t\ttargetPosition._getTransformedByDeletion( sourcePosition, howMany )\n\t\t\t\t);\n\t\t\t\tconst end = this.end._getTransformedByMove( sourcePosition, targetPosition, howMany, false, false );\n\n\t\t\t\treturn [ new Range( start, end ) ];\n\t\t\t}\n\n\t\t\t// Example:\n\t\t\t//

c[d

{

a]b

}
^

xx

-->

c[d

a]b

xx

\n\t\t\t//

c[d

{

a]b

}

xx

^ -->

c[d

xx

a]b

// Note

xx

inclusion.\n\t\t\t//

c[d

^{

a]b

}
-->

c[d

a]b

\n\t\t\tif (\n\t\t\t\t( sourceRange.containsPosition( this.end ) || sourceRange.end.isEqual( this.end ) ) &&\n\t\t\t\tthis.containsPosition( sourceRange.start ) &&\n\t\t\t\tthis.start.isBefore( targetPosition )\n\t\t\t) {\n\t\t\t\tconst start = this.start._getTransformedByMove(\n\t\t\t\t\tsourcePosition,\n\t\t\t\t\ttargetPosition,\n\t\t\t\t\thowMany,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tconst end = this.end._getCombined(\n\t\t\t\t\tsourcePosition,\n\t\t\t\t\ttargetPosition._getTransformedByDeletion( sourcePosition, howMany )\n\t\t\t\t);\n\n\t\t\t\treturn [ new Range( start, end ) ];\n\t\t\t}\n\n\t\t\treturn this._getTransformedByMove( sourcePosition, targetPosition, howMany );\n\t\t}\n\t}\n\n\t/**\n\t * Returns an array containing one or two {@link ~Range ranges} that are a result of transforming this\n\t * {@link ~Range range} by inserting `howMany` nodes at `insertPosition`. Two {@link ~Range ranges} are\n\t * returned if the insertion was inside this {@link ~Range range} and `spread` is set to `true`.\n\t *\n\t * Examples:\n\t *\n\t *\t\tlet range = new Range( new Position( root, [ 2, 7 ] ), new Position( root, [ 4, 0, 1 ] ) );\n\t *\t\tlet transformed = range._getTransformedByInsertion( new Position( root, [ 1 ] ), 2 );\n\t *\t\t// transformed array has one range from [ 4, 7 ] to [ 6, 0, 1 ]\n\t *\n\t *\t\ttransformed = range._getTransformedByInsertion( new Position( root, [ 4, 0, 0 ] ), 4 );\n\t *\t\t// transformed array has one range from [ 2, 7 ] to [ 4, 0, 5 ]\n\t *\n\t *\t\ttransformed = range._getTransformedByInsertion( new Position( root, [ 3, 2 ] ), 4 );\n\t *\t\t// transformed array has one range, which is equal to original range\n\t *\n\t *\t\ttransformed = range._getTransformedByInsertion( new Position( root, [ 3, 2 ] ), 4, true );\n\t *\t\t// transformed array has two ranges: from [ 2, 7 ] to [ 3, 2 ] and from [ 3, 6 ] to [ 4, 0, 1 ]\n\t *\n\t *\t\ttransformed = range._getTransformedByInsertion( new Position( root, [ 4, 0, 1 ] ), 4, false, false );\n\t *\t\t// transformed array has one range which is equal to original range because insertion is after the range boundary\n\t *\n\t *\t\ttransformed = range._getTransformedByInsertion( new Position( root, [ 4, 0, 1 ] ), 4, false, true );\n\t *\t\t// transformed array has one range: from [ 2, 7 ] to [ 4, 0, 5 ] because range was expanded\n\t *\n\t * @protected\n\t * @param {module:engine/model/position~Position} insertPosition Position where nodes are inserted.\n\t * @param {Number} howMany How many nodes are inserted.\n\t * @param {Boolean} [spread] Flag indicating whether this {~Range range} should be spread if insertion\n\t * was inside the range. Defaults to `false`.\n\t * @param {Boolean} [isSticky] Flag indicating whether insertion should expand a range if it is in a place of\n\t * range boundary. Defaults to `false`.\n\t * @returns {Array.} Result of the transformation.\n\t */\n\t_getTransformedByInsertion( insertPosition, howMany, spread = false, isSticky = false ) {\n\t\tif ( spread && this.containsPosition( insertPosition ) ) {\n\t\t\t// Range has to be spread. The first part is from original start to the spread point.\n\t\t\t// The other part is from spread point to the original end, but transformed by\n\t\t\t// insertion to reflect insertion changes.\n\n\t\t\treturn [\n\t\t\t\tnew Range( this.start, insertPosition ),\n\t\t\t\tnew Range(\n\t\t\t\t\tinsertPosition._getTransformedByInsertion( insertPosition, howMany, true ),\n\t\t\t\t\tthis.end._getTransformedByInsertion( insertPosition, howMany, this.isCollapsed )\n\t\t\t\t)\n\t\t\t];\n\t\t} else {\n\t\t\tconst range = Range.createFromRange( this );\n\n\t\t\tconst insertBeforeStart = range.isCollapsed ? true : !isSticky;\n\t\t\tconst insertBeforeEnd = range.isCollapsed ? true : isSticky;\n\n\t\t\trange.start = range.start._getTransformedByInsertion( insertPosition, howMany, insertBeforeStart );\n\t\t\trange.end = range.end._getTransformedByInsertion( insertPosition, howMany, insertBeforeEnd );\n\n\t\t\treturn [ range ];\n\t\t}\n\t}\n\n\t/**\n\t * Returns an array containing {@link ~Range ranges} that are a result of transforming this\n\t * {@link ~Range range} by moving `howMany` nodes from `sourcePosition` to `targetPosition`.\n\t *\n\t * @protected\n\t * @param {module:engine/model/position~Position} sourcePosition Position from which nodes are moved.\n\t * @param {module:engine/model/position~Position} targetPosition Position to where nodes are moved.\n\t * @param {Number} howMany How many nodes are moved.\n\t * @returns {Array.} Result of the transformation.\n\t */\n\t_getTransformedByMove( sourcePosition, targetPosition, howMany ) {\n\t\tif ( this.isCollapsed ) {\n\t\t\tconst newPos = this.start._getTransformedByMove( sourcePosition, targetPosition, howMany, true, false );\n\n\t\t\treturn [ new Range( newPos ) ];\n\t\t}\n\n\t\tlet result;\n\n\t\tconst moveRange = new Range( sourcePosition, sourcePosition.getShiftedBy( howMany ) );\n\n\t\tconst differenceSet = this.getDifference( moveRange );\n\t\tlet difference = null;\n\n\t\tconst common = this.getIntersection( moveRange );\n\n\t\tif ( differenceSet.length == 1 ) {\n\t\t\t// `moveRange` and this range may intersect.\n\t\t\tdifference = new Range(\n\t\t\t\tdifferenceSet[ 0 ].start._getTransformedByDeletion( sourcePosition, howMany ),\n\t\t\t\tdifferenceSet[ 0 ].end._getTransformedByDeletion( sourcePosition, howMany )\n\t\t\t);\n\t\t} else if ( differenceSet.length == 2 ) {\n\t\t\t// `moveRange` is inside this range.\n\t\t\tdifference = new Range(\n\t\t\t\tthis.start,\n\t\t\t\tthis.end._getTransformedByDeletion( sourcePosition, howMany )\n\t\t\t);\n\t\t} // else, `moveRange` contains this range.\n\n\t\tconst insertPosition = targetPosition._getTransformedByDeletion( sourcePosition, howMany );\n\n\t\tif ( difference ) {\n\t\t\tresult = difference._getTransformedByInsertion( insertPosition, howMany, common !== null );\n\t\t} else {\n\t\t\tresult = [];\n\t\t}\n\n\t\tif ( common ) {\n\t\t\tresult.push( new Range(\n\t\t\t\tcommon.start._getCombined( moveRange.start, insertPosition ),\n\t\t\t\tcommon.end._getCombined( moveRange.start, insertPosition )\n\t\t\t) );\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Creates a new range, spreading from specified {@link module:engine/model/position~Position position} to a position moved by\n\t * given `shift`. If `shift` is a negative value, shifted position is treated as the beginning of the range.\n\t *\n\t * @param {module:engine/model/position~Position} position Beginning of the range.\n\t * @param {Number} shift How long the range should be.\n\t * @returns {module:engine/model/range~Range}\n\t */\n\tstatic createFromPositionAndShift( position, shift ) {\n\t\tconst start = position;\n\t\tconst end = position.getShiftedBy( shift );\n\n\t\treturn shift > 0 ? new this( start, end ) : new this( end, start );\n\t}\n\n\t/**\n\t * Creates a range from given parents and offsets.\n\t *\n\t * @param {module:engine/model/element~Element} startElement Start position parent element.\n\t * @param {Number} startOffset Start position offset.\n\t * @param {module:engine/model/element~Element} endElement End position parent element.\n\t * @param {Number} endOffset End position offset.\n\t * @returns {module:engine/model/range~Range}\n\t */\n\tstatic createFromParentsAndOffsets( startElement, startOffset, endElement, endOffset ) {\n\t\treturn new this(\n\t\t\tPosition.createFromParentAndOffset( startElement, startOffset ),\n\t\t\tPosition.createFromParentAndOffset( endElement, endOffset )\n\t\t);\n\t}\n\n\t/**\n\t * Creates a new instance of `Range` which is equal to passed range.\n\t *\n\t * @param {module:engine/model/range~Range} range Range to clone.\n\t * @returns {module:engine/model/range~Range}\n\t */\n\tstatic createFromRange( range ) {\n\t\treturn new this( range.start, range.end );\n\t}\n\n\t/**\n\t * Creates a range inside an {@link module:engine/model/element~Element element} which starts before the first child of\n\t * that element and ends after the last child of that element.\n\t *\n\t * @param {module:engine/model/element~Element} element Element which is a parent for the range.\n\t * @returns {module:engine/model/range~Range}\n\t */\n\tstatic createIn( element ) {\n\t\treturn this.createFromParentsAndOffsets( element, 0, element, element.maxOffset );\n\t}\n\n\t/**\n\t * Creates a range that starts before given {@link module:engine/model/item~Item model item} and ends after it.\n\t *\n\t * @param {module:engine/model/item~Item} item\n\t * @returns {module:engine/model/range~Range}\n\t */\n\tstatic createOn( item ) {\n\t\treturn this.createFromPositionAndShift( Position.createBefore( item ), item.offsetSize );\n\t}\n\n\t/**\n\t * Creates a collapsed range at given {@link module:engine/model/position~Position position}\n\t * or on the given {@link module:engine/model/item~Item item}.\n\t *\n\t * @param {module:engine/model/item~Item|module:engine/model/position~Position} itemOrPosition\n\t * @param {Number|'end'|'before'|'after'} [offset=0] Offset or one of the flags. Used only when\n\t * first parameter is a {@link module:engine/model/item~Item model item}.\n\t */\n\tstatic createCollapsedAt( itemOrPosition, offset ) {\n\t\tconst start = Position.createAt( itemOrPosition, offset );\n\t\tconst end = Position.createFromPosition( start );\n\n\t\treturn new Range( start, end );\n\t}\n\n\t/**\n\t * Combines all ranges from the passed array into a one range. At least one range has to be passed.\n\t * Passed ranges must not have common parts.\n\t *\n\t * The first range from the array is a reference range. If other ranges start or end on the exactly same position where\n\t * the reference range, they get combined into one range.\n\t *\n\t *\t\t[ ][] [ ][ ][ ][ ][] [ ] // Passed ranges, shown sorted\n\t *\t\t[ ] // The result of the function if the first range was a reference range.\n\t *\t [ ] // The result of the function if the third-to-seventh range was a reference range.\n\t *\t [ ] // The result of the function if the last range was a reference range.\n\t *\n\t * @param {Array.} ranges Ranges to combine.\n\t * @returns {module:engine/model/range~Range} Combined range.\n\t */\n\tstatic createFromRanges( ranges ) {\n\t\tif ( ranges.length === 0 ) {\n\t\t\t/**\n\t\t\t * At least one range has to be passed to\n\t\t\t * {@link module:engine/model/range~Range.createFromRanges `Range.createFromRanges()`}.\n\t\t\t *\n\t\t\t * @error range-create-from-ranges-empty-array\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'range-create-from-ranges-empty-array: At least one range has to be passed.' );\n\t\t} else if ( ranges.length == 1 ) {\n\t\t\treturn this.createFromRange( ranges[ 0 ] );\n\t\t}\n\n\t\t// 1. Set the first range in `ranges` array as a reference range.\n\t\t// If we are going to return just a one range, one of the ranges need to be the reference one.\n\t\t// Other ranges will be stuck to that range, if possible.\n\t\tconst ref = ranges[ 0 ];\n\n\t\t// 2. Sort all the ranges so it's easier to process them.\n\t\tranges.sort( ( a, b ) => {\n\t\t\treturn a.start.isAfter( b.start ) ? 1 : -1;\n\t\t} );\n\n\t\t// 3. Check at which index the reference range is now.\n\t\tconst refIndex = ranges.indexOf( ref );\n\n\t\t// 4. At this moment we don't need the original range.\n\t\t// We are going to modify the result and we need to return a new instance of Range.\n\t\t// We have to create a copy of the reference range.\n\t\tconst result = new this( ref.start, ref.end );\n\n\t\t// 5. Ranges should be checked and glued starting from the range that is closest to the reference range.\n\t\t// Since ranges are sorted, start with the range with index that is closest to reference range index.\n\t\tfor ( let i = refIndex - 1; i >= 0; i++ ) {\n\t\t\tif ( ranges[ i ].end.isEqual( result.start ) ) {\n\t\t\t\tresult.start = Position.createFromPosition( ranges[ i ].start );\n\t\t\t} else {\n\t\t\t\t// If ranges are not starting/ending at the same position there is no point in looking further.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// 6. Ranges should be checked and glued starting from the range that is closest to the reference range.\n\t\t// Since ranges are sorted, start with the range with index that is closest to reference range index.\n\t\tfor ( let i = refIndex + 1; i < ranges.length; i++ ) {\n\t\t\tif ( ranges[ i ].start.isEqual( result.end ) ) {\n\t\t\t\tresult.end = Position.createFromPosition( ranges[ i ].end );\n\t\t\t} else {\n\t\t\t\t// If ranges are not starting/ending at the same position there is no point in looking further.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Creates a `Range` instance from given plain object (i.e. parsed JSON string).\n\t *\n\t * @param {Object} json Plain object to be converted to `Range`.\n\t * @param {module:engine/model/document~Document} doc Document object that will be range owner.\n\t * @returns {module:engine/model/element~Element} `Range` instance created using given plain object.\n\t */\n\tstatic fromJSON( json, doc ) {\n\t\treturn new this( Position.fromJSON( json.start, doc ), Position.fromJSON( json.end, doc ) );\n\t}\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/range.js\n// module id = 3\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module utils/mix\n */\n\n/**\n * Copies enumerable properties and symbols from the objects given as 2nd+ parameters to the\n * prototype of first object (a constructor).\n *\n *\t\tclass Editor {\n *\t\t\t...\n *\t\t}\n *\n *\t\tconst SomeMixin = {\n *\t\t\ta() {\n *\t\t\t\treturn 'a';\n *\t\t\t}\n *\t\t};\n *\n *\t\tmix( Editor, SomeMixin, ... );\n *\n *\t\tnew Editor().a(); // -> 'a'\n *\n * Note: Properties which already exist in the base class will not be overriden.\n *\n * @param {Function} [baseClass] Class which prototype will be extended.\n * @param {Object} [...mixins] Objects from which to get properties.\n */\nexport default function mix( baseClass, ...mixins ) {\n\tmixins.forEach( mixin => {\n\t\tObject.getOwnPropertyNames( mixin ).concat( Object.getOwnPropertySymbols( mixin ) )\n\t\t\t.forEach( key => {\n\t\t\t\tif ( key in baseClass.prototype ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst sourceDescriptor = Object.getOwnPropertyDescriptor( mixin, key );\n\t\t\t\tsourceDescriptor.enumerable = false;\n\n\t\t\t\tObject.defineProperty( baseClass.prototype, key, sourceDescriptor );\n\t\t\t} );\n\t} );\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/mix.js\n// module id = 4\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/element\n */\n\nimport Node from './node';\nimport NodeList from './nodelist';\nimport Text from './text';\nimport isIterable from '@ckeditor/ckeditor5-utils/src/isiterable';\n\n/**\n * Model element. Type of {@link module:engine/model/node~Node node} that has a {@link module:engine/model/element~Element#name name} and\n * {@link module:engine/model/element~Element#getChildren child nodes}.\n *\n * **Important**: see {@link module:engine/model/node~Node} to read about restrictions using `Element` and `Node` API.\n */\nexport default class Element extends Node {\n\t/**\n\t * Creates a model element.\n\t *\n\t * @param {String} name Element's name.\n\t * @param {Object} [attrs] Element's attributes. See {@link module:utils/tomap~toMap} for a list of accepted values.\n\t * @param {module:engine/model/node~Node|Iterable.} [children]\n\t * One or more nodes to be inserted as children of created element.\n\t */\n\tconstructor( name, attrs, children ) {\n\t\tsuper( attrs );\n\n\t\t/**\n\t\t * Element name.\n\t\t *\n\t\t * @member {String} module:engine/model/element~Element#name\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * List of children nodes.\n\t\t *\n\t\t * @private\n\t\t * @member {module:engine/model/nodelist~NodeList} module:engine/model/element~Element#_children\n\t\t */\n\t\tthis._children = new NodeList();\n\n\t\tif ( children ) {\n\t\t\tthis.insertChildren( 0, children );\n\t\t}\n\t}\n\n\t/**\n\t * Number of this element's children.\n\t *\n\t * @readonly\n\t * @type {Number}\n\t */\n\tget childCount() {\n\t\treturn this._children.length;\n\t}\n\n\t/**\n\t * Sum of {module:engine/model/node~Node#offsetSize offset sizes} of all of this element's children.\n\t *\n\t * @readonly\n\t * @type {Number}\n\t */\n\tget maxOffset() {\n\t\treturn this._children.maxOffset;\n\t}\n\n\t/**\n\t * Is `true` if there are no nodes inside this element, `false` otherwise.\n\t *\n\t * @readonly\n\t * @type {Boolean}\n\t */\n\tget isEmpty() {\n\t\treturn this.childCount === 0;\n\t}\n\n\t/**\n\t * Checks whether given model tree object is of given type.\n\t *\n\t *\t\tobj.name; // 'listItem'\n\t *\t\tobj instanceof Element; // true\n\t *\n\t *\t\tobj.is( 'element' ); // true\n\t *\t\tobj.is( 'listItem' ); // true\n\t *\t\tobj.is( 'element', 'listItem' ); // true\n\t *\t\tobj.is( 'text' ); // false\n\t *\t\tobj.is( 'element', 'image' ); // false\n\t *\n\t * Read more in {@link module:engine/model/node~Node#is}.\n\t *\n\t * @param {String} type Type to check when `name` parameter is present.\n\t * Otherwise, it acts like the `name` parameter.\n\t * @param {String} [name] Element name.\n\t * @returns {Boolean}\n\t */\n\tis( type, name = null ) {\n\t\tif ( !name ) {\n\t\t\treturn type == 'element' || type == this.name;\n\t\t} else {\n\t\t\treturn type == 'element' && name == this.name;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the child at the given index.\n\t *\n\t * @param {Number} index Index of child.\n\t * @returns {module:engine/model/node~Node} Child node.\n\t */\n\tgetChild( index ) {\n\t\treturn this._children.getNode( index );\n\t}\n\n\t/**\n\t * Returns an iterator that iterates over all of this element's children.\n\t *\n\t * @returns {Iterable.}\n\t */\n\tgetChildren() {\n\t\treturn this._children[ Symbol.iterator ]();\n\t}\n\n\t/**\n\t * Returns an index of the given child node. Returns `null` if given node is not a child of this element.\n\t *\n\t * @param {module:engine/model/node~Node} node Child node to look for.\n\t * @returns {Number} Child node's index in this element.\n\t */\n\tgetChildIndex( node ) {\n\t\treturn this._children.getNodeIndex( node );\n\t}\n\n\t/**\n\t * Returns the starting offset of given child. Starting offset is equal to the sum of\n\t * {module:engine/model/node~Node#offsetSize offset sizes} of all node's siblings that are before it. Returns `null` if\n\t * given node is not a child of this element.\n\t *\n\t * @param {module:engine/model/node~Node} node Child node to look for.\n\t * @returns {Number} Child node's starting offset.\n\t */\n\tgetChildStartOffset( node ) {\n\t\treturn this._children.getNodeStartOffset( node );\n\t}\n\n\t/**\n\t * Creates a copy of this element and returns it. Created element has the same name and attributes as the original element.\n\t * If clone is deep, the original element's children are also cloned. If not, then empty element is removed.\n\t *\n\t * @param {Boolean} [deep=false] If set to `true` clones element and all its children recursively. When set to `false`,\n\t * element will be cloned without any child.\n\t */\n\tclone( deep = false ) {\n\t\tconst children = deep ? Array.from( this._children ).map( node => node.clone( true ) ) : null;\n\n\t\treturn new Element( this.name, this.getAttributes(), children );\n\t}\n\n\t/**\n\t * Returns index of a node that occupies given offset. If given offset is too low, returns `0`. If given offset is\n\t * too high, returns {@link module:engine/model/element~Element#getChildIndex index after last child}.\n\t *\n\t *\t\tconst textNode = new Text( 'foo' );\n\t *\t\tconst pElement = new Element( 'p' );\n\t *\t\tconst divElement = new Element( [ textNode, pElement ] );\n\t *\t\tdivElement.offsetToIndex( -1 ); // Returns 0, because offset is too low.\n\t *\t\tdivElement.offsetToIndex( 0 ); // Returns 0, because offset 0 is taken by `textNode` which is at index 0.\n\t *\t\tdivElement.offsetToIndex( 1 ); // Returns 0, because `textNode` has `offsetSize` equal to 3, so it occupies offset 1 too.\n\t *\t\tdivElement.offsetToIndex( 2 ); // Returns 0.\n\t *\t\tdivElement.offsetToIndex( 3 ); // Returns 1.\n\t *\t\tdivElement.offsetToIndex( 4 ); // Returns 2. There are no nodes at offset 4, so last available index is returned.\n\t *\n\t * @param {Number} offset Offset to look for.\n\t * @returns {Number}\n\t */\n\toffsetToIndex( offset ) {\n\t\treturn this._children.offsetToIndex( offset );\n\t}\n\n\t/**\n\t * {@link module:engine/model/element~Element#insertChildren Inserts} one or more nodes at the end of this element.\n\t *\n\t * @param {module:engine/model/node~Node|Iterable.} nodes Nodes to be inserted.\n\t */\n\tappendChildren( nodes ) {\n\t\tthis.insertChildren( this.childCount, nodes );\n\t}\n\n\t/**\n\t * Inserts one or more nodes at the given index and sets {@link module:engine/model/node~Node#parent parent} of these nodes\n\t * to this element.\n\t *\n\t * @param {Number} index Index at which nodes should be inserted.\n\t * @param {module:engine/model/node~Node|Iterable.} nodes Nodes to be inserted.\n\t */\n\tinsertChildren( index, nodes ) {\n\t\tnodes = normalize( nodes );\n\n\t\tfor ( const node of nodes ) {\n\t\t\t// If node that is being added to this element is already inside another element, first remove it from the old parent.\n\t\t\tif ( node.parent !== null ) {\n\t\t\t\tnode.remove();\n\t\t\t}\n\n\t\t\tnode.parent = this;\n\t\t}\n\n\t\tthis._children.insertNodes( index, nodes );\n\t}\n\n\t/**\n\t * Removes one or more nodes starting at the given index and sets\n\t * {@link module:engine/model/node~Node#parent parent} of these nodes to `null`.\n\t *\n\t * @param {Number} index Index of the first node to remove.\n\t * @param {Number} [howMany=1] Number of nodes to remove.\n\t * @returns {Array.} Array containing removed nodes.\n\t */\n\tremoveChildren( index, howMany = 1 ) {\n\t\tconst nodes = this._children.removeNodes( index, howMany );\n\n\t\tfor ( const node of nodes ) {\n\t\t\tnode.parent = null;\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * Returns a descendant node by its path relative to this element.\n\t *\n\t *\t\t// ac\n\t *\t\tthis.getNodeByPath( [ 0 ] ); // -> \"a\"\n\t *\t\tthis.getNodeByPath( [ 1 ] ); // -> \n\t *\t\tthis.getNodeByPath( [ 1, 0 ] ); // -> \"c\"\n\t *\n\t * @param {Array.} relativePath Path of the node to find, relative to this element.\n\t * @returns {module:engine/model/node~Node}\n\t */\n\tgetNodeByPath( relativePath ) {\n\t\tlet node = this; // eslint-disable-line consistent-this\n\n\t\tfor ( const index of relativePath ) {\n\t\t\tnode = node.getChild( node.offsetToIndex( index ) );\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Converts `Element` instance to plain object and returns it. Takes care of converting all of this element's children.\n\t *\n\t * @returns {Object} `Element` instance converted to plain object.\n\t */\n\ttoJSON() {\n\t\tconst json = super.toJSON();\n\n\t\tjson.name = this.name;\n\n\t\tif ( this._children.length > 0 ) {\n\t\t\tjson.children = [];\n\n\t\t\tfor ( const node of this._children ) {\n\t\t\t\tjson.children.push( node.toJSON() );\n\t\t\t}\n\t\t}\n\n\t\treturn json;\n\t}\n\n\t/**\n\t * Creates an `Element` instance from given plain object (i.e. parsed JSON string).\n\t * Converts `Element` children to proper nodes.\n\t *\n\t * @param {Object} json Plain object to be converted to `Element`.\n\t * @returns {module:engine/model/element~Element} `Element` instance created using given plain object.\n\t */\n\tstatic fromJSON( json ) {\n\t\tlet children = null;\n\n\t\tif ( json.children ) {\n\t\t\tchildren = [];\n\n\t\t\tfor ( const child of json.children ) {\n\t\t\t\tif ( child.name ) {\n\t\t\t\t\t// If child has name property, it is an Element.\n\t\t\t\t\tchildren.push( Element.fromJSON( child ) );\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise, it is a Text node.\n\t\t\t\t\tchildren.push( Text.fromJSON( child ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new Element( json.name, json.attributes, children );\n\t}\n}\n\n// Converts strings to Text and non-iterables to arrays.\n//\n// @param {String|module:engine/model/node~Node|Iterable.}\n// @return {Iterable.}\nfunction normalize( nodes ) {\n\t// Separate condition because string is iterable.\n\tif ( typeof nodes == 'string' ) {\n\t\treturn [ new Text( nodes ) ];\n\t}\n\n\tif ( !isIterable( nodes ) ) {\n\t\tnodes = [ nodes ];\n\t}\n\n\t// Array.from to enable .map() on non-arrays.\n\treturn Array.from( nodes )\n\t\t.map( node => {\n\t\t\treturn typeof node == 'string' ? new Text( node ) : node;\n\t\t} );\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/element.js\n// module id = 5\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module ui/template\n */\n\n/* global document */\n\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport mix from '@ckeditor/ckeditor5-utils/src/mix';\nimport EmitterMixin from '@ckeditor/ckeditor5-utils/src/emittermixin';\nimport View from './view';\nimport ViewCollection from './viewcollection';\nimport cloneDeepWith from '@ckeditor/ckeditor5-utils/src/lib/lodash/cloneDeepWith';\nimport isObject from '@ckeditor/ckeditor5-utils/src/lib/lodash/isObject';\nimport log from '@ckeditor/ckeditor5-utils/src/log';\n\nconst xhtmlNs = 'http://www.w3.org/1999/xhtml';\n\n/**\n * A basic Template class. It renders a DOM HTML element or text from a\n * {@link module:ui/template~TemplateDefinition definition} and supports element attributes, children,\n * bindings to {@link module:utils/observablemixin~Observable observables} and DOM event propagation.\n *\n * A simple template can look like this:\n *\n *\t\tconst bind = Template.bind( observable, emitter );\n *\n *\t\tnew Template( {\n *\t\t\ttag: 'p',\n *\t\t\tattributes: {\n *\t\t\t\tclass: 'foo',\n *\t\t\t\tstyle: {\n *\t\t\t\t\tbackgroundColor: 'yellow'\n *\t\t\t\t}\n *\t\t\t},\n *\t\t\ton: {\n *\t\t\t\tclick: bind.to( 'clicked' )\n *\t\t\t}\n *\t\t\tchildren: [\n *\t\t\t\t'A paragraph.'\n *\t\t\t]\n *\t\t} ).render();\n *\n * and it will render the following HTML element:\n *\n *\t\t

A paragraph.

\n *\n * Additionally, the `observable` will always fire `clicked` upon clicking `

` in DOM.\n *\n * See {@link module:ui/template~TemplateDefinition} to know more about templates and complex\n * template definitions.\n *\n* @mixes module:utils/emittermixin~EmitterMixin\n */\nexport default class Template {\n\t/**\n\t * Creates an instance of the {@link ~Template} class.\n\t *\n\t * @param {module:ui/template~TemplateDefinition} def The definition of the template.\n\t */\n\tconstructor( def ) {\n\t\tObject.assign( this, normalize( clone( def ) ) );\n\n\t\t/**\n\t\t * Indicates whether this particular Template instance has been\n\t\t * {@link #render rendered}.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {Boolean}\n\t\t */\n\t\tthis._isRendered = false;\n\n\t\t/**\n\t\t * The tag (`tagName`) of this template, e.g. `div`. It also indicates that the template\n\t\t * renders to an HTML element.\n\t\t *\n\t\t * @member {String} #tag\n\t\t */\n\n\t\t/**\n\t\t * Text of the template. It also indicates that the template renders to a DOM text node.\n\t\t *\n\t\t * @member {Array.} #text\n\t\t */\n\n\t\t/**\n\t\t * Attributes of the template, e.g. `{ id: [ 'ck-id' ] }`, corresponding with\n\t\t * attributes of an HTML element.\n\t\t *\n\t\t * **Note**: This property only makes sense when {@link #tag} is defined.\n\t\t *\n\t\t * @member {Object} #attributes\n\t\t */\n\n\t\t/**\n\t\t * Children of the template, sub–templates. Each one is an independent\n\t\t * instance of {@link ~Template}.\n\t\t *\n\t\t * **Note**: This property only makes sense when {@link #tag} is defined.\n\t\t *\n\t\t * @member {module:utils/collection~Collection.} #children\n\t\t */\n\n\t\t/**\n\t\t * DOM event listeners of the template.\n\t\t *\n\t\t * @member {Object} #eventListeners\n\t\t */\n\n\t\t/**\n\t\t * Data used by the {@link #revert} method to restore a node to its original state.\n\t\t *\n\t\t * See: {@link #apply}.\n\t\t *\n\t\t * @readonly\n\t\t * @protected\n\t\t * @member {module:ui/template~RenderData}\n\t\t */\n\t\tthis._revertData = null;\n\t}\n\n\t/**\n\t * Renders a DOM Node (an HTML element or text) out of the template.\n\t *\n\t *\t\tconst domNode = new Template( { ... } ).render();\n\t *\n\t * See: {@link #apply}.\n\t *\n\t * @returns {HTMLElement|Text}\n\t */\n\trender() {\n\t\tconst node = this._renderNode( {\n\t\t\tintoFragment: true\n\t\t} );\n\n\t\tthis._isRendered = true;\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Applies the template to an existing DOM Node, either HTML element or text.\n\t *\n\t * **Note:** No new DOM nodes will be created. Applying extends\n\t * {@link module:ui/template~TemplateDefinition attributes} and\n\t * {@link module:ui/template~TemplateDefinition event listeners} only.\n\t *\n\t * **Note:** Existing `class` and `style` attributes are extended when a template\n\t * is applied to an HTML element, while other attributes and `textContent` are overridden.\n\t *\n\t * **Note:** The process of applying a template can be easily reverted using\n\t * {@link module:ui/template~Template#revert} method.\n\t *\n\t *\t\tconst element = document.createElement( 'div' );\n\t *\t\tconst bind = Template.bind( observable, emitter );\n\t *\n\t *\t\tnew Template( {\n\t *\t\t\tattrs: {\n\t *\t\t\t\tid: 'first-div',\n\t *\t\t\t\tclass: bind.to( 'divClass' )\n\t *\t\t\t},\n\t *\t\t\ton: {\n\t *\t\t\t\tclick: bind( 'elementClicked' ) // Will be fired by the observable.\n\t *\t\t\t}\n\t *\t\t\tchildren: [\n\t *\t\t\t\t'Div text.'\n\t *\t\t\t]\n\t *\t\t} ).apply( element );\n\t *\n\t *\t\telement.outerHTML == \"

Div text.
\"\n\t *\n\t * @see module:ui/template~Template#render\n\t * @see module:ui/template~Template#revert\n\t * @param {Node} node Root node for the template to apply.\n\t */\n\tapply( node ) {\n\t\tthis._revertData = getEmptyRevertData();\n\n\t\tthis._renderNode( {\n\t\t\tnode,\n\t\t\tisApplying: true,\n\t\t\trevertData: this._revertData\n\t\t} );\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Reverts a template {@link module:ui/template~Template#apply applied} to a DOM node.\n\t *\n\t * @param {Node} node Root node for the template to revert. In most of the cases, it is the\n\t * same node used by {@link module:ui/template~Template#apply}.\n\t */\n\trevert( node ) {\n\t\tif ( !this._revertData ) {\n\t\t\t/**\n\t\t\t * Attempting reverting a template which has not been applied yet.\n\t\t\t *\n\t\t\t * @error ui-template-revert-not-applied\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'ui-template-revert-not-applied: Attempting reverting a template which has not been applied yet.' );\n\t\t}\n\n\t\tthis._revertTemplateFromNode( node, this._revertData );\n\t}\n\n\t/**\n\t * An entry point to the interface which binds DOM nodes to\n\t * {@link module:utils/observablemixin~Observable observables}.\n\t * There are two types of bindings:\n\t *\n\t * * HTML element attributes or text `textContent` synchronized with attributes of an\n\t * {@link module:utils/observablemixin~Observable}. Learn more about {@link module:ui/template~BindChain#to}\n\t * and {@link module:ui/template~BindChain#if}.\n\t *\n\t *\t\tconst bind = Template.bind( observable, emitter );\n\t *\n\t *\t\tnew Template( {\n\t *\t\t\tattrs: {\n\t *\t\t\t\t// Binds element's \"class\" attribute to observable#classAttribute.\n\t *\t\t\t\tclass: bind.to( 'classAttribute' )\n\t *\t\t\t}\n\t *\t\t} ).render();\n\t *\n\t * * DOM events fired on HTML element propagated through\n\t * {@link module:utils/observablemixin~Observable}. Learn more about {@link module:ui/template~BindChain#to}.\n\t *\n\t *\t\tconst bind = Template.bind( observable, emitter );\n\t *\n\t *\t\tnew Template( {\n\t *\t\t\ton: {\n\t *\t\t\t\t// Will be fired by the observable.\n\t *\t\t\t\tclick: bind( 'elementClicked' )\n\t *\t\t\t}\n\t *\t\t} ).render();\n\t *\n\t * Also see {@link module:ui/view~View#bindTemplate}.\n\t *\n\t * @param {module:utils/observablemixin~Observable} observable An observable which provides boundable attributes.\n\t * @param {module:utils/emittermixin~Emitter} emitter An emitter that listens to observable attribute\n\t * changes or DOM Events (depending on the kind of the binding). Usually, a {@link module:ui/view~View} instance.\n\t * @returns {module:ui/template~BindChain}\n\t */\n\tstatic bind( observable, emitter ) {\n\t\treturn {\n\t\t\tto( eventNameOrFunctionOrAttribute, callback ) {\n\t\t\t\treturn new TemplateToBinding( {\n\t\t\t\t\teventNameOrFunction: eventNameOrFunctionOrAttribute,\n\t\t\t\t\tattribute: eventNameOrFunctionOrAttribute,\n\t\t\t\t\tobservable, emitter, callback\n\t\t\t\t} );\n\t\t\t},\n\n\t\t\tif( attribute, valueIfTrue, callback ) {\n\t\t\t\treturn new TemplateIfBinding( {\n\t\t\t\t\tobservable, emitter, attribute, valueIfTrue, callback\n\t\t\t\t} );\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Extends an existing {@link module:ui/template~Template} instance with some additional content\n\t * from another {@link module:ui/template~TemplateDefinition}.\n\t *\n\t *\t\tconst bind = Template.bind( observable, emitter );\n\t *\n\t *\t\tconst template = new Template( {\n\t *\t\t\ttag: 'p',\n\t *\t\t\tattributes: {\n\t *\t\t\t\tclass: 'a',\n\t *\t\t\t\tdata-x: bind.to( 'foo' )\n\t *\t\t\t},\n\t *\t\t\tchildren: [\n\t *\t\t\t\t{\n\t *\t\t\t\t\ttag: 'span',\n\t *\t\t\t\t\tattributes: {\n\t *\t\t\t\t\t\tclass: 'b'\n\t *\t\t\t\t\t},\n\t *\t\t\t\t\tchildren: [\n\t *\t\t\t\t\t\t'Span'\n\t *\t\t\t\t\t]\n\t *\t\t\t\t}\n\t *\t\t\t]\n\t *\t\t } );\n\t *\n\t *\t\t// Instance-level extension.\n\t *\t\tTemplate.extend( template, {\n\t *\t\t\tattributes: {\n\t *\t\t\t\tclass: 'b',\n\t *\t\t\t\tdata-x: bind.to( 'bar' )\n\t *\t\t\t},\n\t *\t\t\tchildren: [\n\t *\t\t\t\t{\n\t *\t\t\t\t\tattributes: {\n\t *\t\t\t\t\t\tclass: 'c'\n\t *\t\t\t\t\t}\n\t *\t\t\t\t}\n\t *\t\t\t]\n\t *\t\t} );\n\t *\n\t *\t\t// Child extension.\n\t *\t\tTemplate.extend( template.children.get( 0 ), {\n\t *\t\t\tattributes: {\n\t *\t\t\t\tclass: 'd'\n\t *\t\t\t}\n\t *\t\t} );\n\t *\n\t * the `outerHTML` of `template.render()` is:\n\t *\n\t *\t\t

\n\t *\t\t\tSpan\n\t *\t\t

\n\t *\n\t * @param {module:ui/template~Template} template An existing template instance to be extended.\n\t * @param {module:ui/template~TemplateDefinition} def Additional definition to be applied to a template.\n\t */\n\tstatic extend( template, def ) {\n\t\tif ( template._isRendered ) {\n\t\t\t/**\n\t\t\t * Extending a template after rendering may not work as expected. To make sure\n\t\t\t * the {@link module:ui/template~Template.extend extending} works for an element,\n\t\t\t * make sure it happens before {@link #render} is called.\n\t\t\t *\n\t\t\t * @error template-extend-render\n\t\t\t */\n\t\t\tlog.warn( 'template-extend-render: Attempting to extend a template which has already been rendered.' );\n\t\t}\n\n\t\textendTemplate( template, normalize( clone( def ) ) );\n\t}\n\n\t/**\n\t * Renders a DOM Node (either an HTML element or text) out of the template.\n\t *\n\t * @protected\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t */\n\t_renderNode( data ) {\n\t\tlet isInvalid;\n\n\t\tif ( data.node ) {\n\t\t\t// When applying, a definition cannot have \"tag\" and \"text\" at the same time.\n\t\t\tisInvalid = this.tag && this.text;\n\t\t} else {\n\t\t\t// When rendering, a definition must have either \"tag\" or \"text\": XOR( this.tag, this.text ).\n\t\t\tisInvalid = this.tag ? this.text : !this.text;\n\t\t}\n\n\t\tif ( isInvalid ) {\n\t\t\t/**\n\t\t\t * Node definition cannot have \"tag\" and \"text\" properties at the same time.\n\t\t\t * Node definition must have either \"tag\" or \"text\" when rendering new Node.\n\t\t\t *\n\t\t\t * @error ui-template-wrong-syntax\n\t\t\t */\n\t\t\tthrow new CKEditorError(\n\t\t\t\t'ui-template-wrong-syntax: Node definition must have either \"tag\" or \"text\" when rendering new Node.'\n\t\t\t);\n\t\t}\n\n\t\tif ( this.text ) {\n\t\t\treturn this._renderText( data );\n\t\t} else {\n\t\t\treturn this._renderElement( data );\n\t\t}\n\t}\n\n\t/**\n\t * Renders an HTML element out of the template.\n\t *\n\t * @protected\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t */\n\t_renderElement( data ) {\n\t\tlet node = data.node;\n\n\t\tif ( !node ) {\n\t\t\tnode = data.node = document.createElementNS( this.ns || xhtmlNs, this.tag );\n\t\t}\n\n\t\tthis._renderAttributes( data );\n\t\tthis._renderElementChildren( data );\n\t\tthis._setUpListeners( data );\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Renders a text node out of {@link module:ui/template~Template#text}.\n\t *\n\t * @protected\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t */\n\t_renderText( data ) {\n\t\tlet node = data.node;\n\n\t\t// Save the original textContent to revert it in #revert().\n\t\tif ( node ) {\n\t\t\tdata.revertData.text = node.textContent;\n\t\t} else {\n\t\t\tnode = data.node = document.createTextNode( '' );\n\t\t}\n\n\t\t// Check if this Text Node is bound to Observable. Cases:\n\t\t//\n\t\t//\t\ttext: [ Template.bind( ... ).to( ... ) ]\n\t\t//\n\t\t//\t\ttext: [\n\t\t//\t\t\t'foo',\n\t\t//\t\t\tTemplate.bind( ... ).to( ... ),\n\t\t//\t\t\t...\n\t\t//\t\t]\n\t\t//\n\t\tif ( hasTemplateBinding( this.text ) ) {\n\t\t\tthis._bindToObservable( {\n\t\t\t\tschema: this.text,\n\t\t\t\tupdater: getTextUpdater( node ),\n\t\t\t\tdata\n\t\t\t} );\n\t\t}\n\t\t// Simply set text. Cases:\n\t\t//\n\t\t//\t\ttext: [ 'all', 'are', 'static' ]\n\t\t//\n\t\t//\t\ttext: [ 'foo' ]\n\t\t//\n\t\telse {\n\t\t\tnode.textContent = this.text.join( '' );\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Renders an HTML element attributes out of {@link module:ui/template~Template#attributes}.\n\t *\n\t * @protected\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t */\n\t_renderAttributes( data ) {\n\t\tlet attrName, attrValue, domAttrValue, attrNs;\n\n\t\tif ( !this.attributes ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst node = data.node;\n\t\tconst revertData = data.revertData;\n\n\t\tfor ( attrName in this.attributes ) {\n\t\t\t// Current attribute value in DOM.\n\t\t\tdomAttrValue = node.getAttribute( attrName );\n\n\t\t\t// The value to be set.\n\t\t\tattrValue = this.attributes[ attrName ];\n\n\t\t\t// Save revert data.\n\t\t\tif ( revertData ) {\n\t\t\t\trevertData.attributes[ attrName ] = domAttrValue;\n\t\t\t}\n\n\t\t\t// Detect custom namespace:\n\t\t\t//\n\t\t\t//\t\tclass: {\n\t\t\t//\t\t\tns: 'abc',\n\t\t\t//\t\t\tvalue: Template.bind( ... ).to( ... )\n\t\t\t//\t\t}\n\t\t\t//\n\t\t\tattrNs = ( isObject( attrValue[ 0 ] ) && attrValue[ 0 ].ns ) ? attrValue[ 0 ].ns : null;\n\n\t\t\t// Activate binding if one is found. Cases:\n\t\t\t//\n\t\t\t//\t\tclass: [\n\t\t\t//\t\t\tTemplate.bind( ... ).to( ... )\n\t\t\t//\t\t]\n\t\t\t//\n\t\t\t//\t\tclass: [\n\t\t\t//\t\t\t'bar',\n\t\t\t//\t\t\tTemplate.bind( ... ).to( ... ),\n\t\t\t//\t\t\t'baz'\n\t\t\t//\t\t]\n\t\t\t//\n\t\t\t//\t\tclass: {\n\t\t\t//\t\t\tns: 'abc',\n\t\t\t//\t\t\tvalue: Template.bind( ... ).to( ... )\n\t\t\t//\t\t}\n\t\t\t//\n\t\t\tif ( hasTemplateBinding( attrValue ) ) {\n\t\t\t\t// Normalize attributes with additional data like namespace:\n\t\t\t\t//\n\t\t\t\t//\t\tclass: {\n\t\t\t\t//\t\t\tns: 'abc',\n\t\t\t\t//\t\t\tvalue: [ ... ]\n\t\t\t\t//\t\t}\n\t\t\t\t//\n\t\t\t\tconst valueToBind = attrNs ? attrValue[ 0 ].value : attrValue;\n\n\t\t\t\t// Extend the original value of attributes like \"style\" and \"class\",\n\t\t\t\t// don't override them.\n\t\t\t\tif ( revertData && shouldExtend( attrName ) ) {\n\t\t\t\t\tvalueToBind.unshift( domAttrValue );\n\t\t\t\t}\n\n\t\t\t\tthis._bindToObservable( {\n\t\t\t\t\tschema: valueToBind,\n\t\t\t\t\tupdater: getAttributeUpdater( node, attrName, attrNs ),\n\t\t\t\t\tdata\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Style attribute could be an Object so it needs to be parsed in a specific way.\n\t\t\t//\n\t\t\t//\t\tstyle: {\n\t\t\t//\t\t\twidth: '100px',\n\t\t\t//\t\t\theight: Template.bind( ... ).to( ... )\n\t\t\t//\t\t}\n\t\t\t//\n\t\t\telse if ( attrName == 'style' && typeof attrValue[ 0 ] !== 'string' ) {\n\t\t\t\tthis._renderStyleAttribute( attrValue[ 0 ], data );\n\t\t\t}\n\n\t\t\t// Otherwise simply set the static attribute:\n\t\t\t//\n\t\t\t//\t\tclass: [ 'foo' ]\n\t\t\t//\n\t\t\t//\t\tclass: [ 'all', 'are', 'static' ]\n\t\t\t//\n\t\t\t//\t\tclass: [\n\t\t\t//\t\t\t{\n\t\t\t//\t\t\t\tns: 'abc',\n\t\t\t//\t\t\t\tvalue: [ 'foo' ]\n\t\t\t//\t\t\t}\n\t\t\t//\t\t]\n\t\t\t//\n\t\t\telse {\n\t\t\t\t// Extend the original value of attributes like \"style\" and \"class\",\n\t\t\t\t// don't override them.\n\t\t\t\tif ( revertData && domAttrValue && shouldExtend( attrName ) ) {\n\t\t\t\t\tattrValue.unshift( domAttrValue );\n\t\t\t\t}\n\n\t\t\t\tattrValue = attrValue\n\t\t\t\t\t// Retrieve \"values\" from:\n\t\t\t\t\t//\n\t\t\t\t\t//\t\tclass: [\n\t\t\t\t\t//\t\t\t{\n\t\t\t\t\t//\t\t\t\tns: 'abc',\n\t\t\t\t\t//\t\t\t\tvalue: [ ... ]\n\t\t\t\t\t//\t\t\t}\n\t\t\t\t\t//\t\t]\n\t\t\t\t\t//\n\t\t\t\t\t.map( val => val ? ( val.value || val ) : val )\n\t\t\t\t\t// Flatten the array.\n\t\t\t\t\t.reduce( ( prev, next ) => prev.concat( next ), [] )\n\t\t\t\t\t// Convert into string.\n\t\t\t\t\t.reduce( arrayValueReducer, '' );\n\n\t\t\t\tif ( !isFalsy( attrValue ) ) {\n\t\t\t\t\tnode.setAttributeNS( attrNs, attrName, attrValue );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Renders the `style` attribute of an HTML element based on\n\t * {@link module:ui/template~Template#attributes}.\n\t *\n\t * Style attribute is an {Object} with static values:\n\t *\n\t *\t\tattributes: {\n\t *\t\t\tstyle: {\n\t *\t\t\t\tcolor: 'red'\n\t *\t\t\t}\n\t *\t\t}\n\t *\n\t * or values bound to {@link module:ui/model~Model} properties:\n\t *\n\t *\t\tattributes: {\n\t *\t\t\tstyle: {\n\t *\t\t\t\tcolor: bind.to( ... )\n\t *\t\t\t}\n\t *\t\t}\n\t *\n\t * Note: `style` attribute is rendered without setting the namespace. It does not seem to be\n\t * needed.\n\t *\n\t * @private\n\t * @param {Object} styles Styles located in `attributes.style` of {@link module:ui/template~TemplateDefinition}.\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t */\n\t_renderStyleAttribute( styles, data ) {\n\t\tconst node = data.node;\n\n\t\tfor ( const styleName in styles ) {\n\t\t\tconst styleValue = styles[ styleName ];\n\n\t\t\t// Cases:\n\t\t\t//\n\t\t\t//\t\tstyle: {\n\t\t\t//\t\t\tcolor: bind.to( 'attribute' )\n\t\t\t//\t\t}\n\t\t\t//\n\t\t\tif ( hasTemplateBinding( styleValue ) ) {\n\t\t\t\tthis._bindToObservable( {\n\t\t\t\t\tschema: [ styleValue ],\n\t\t\t\t\tupdater: getStyleUpdater( node, styleName ),\n\t\t\t\t\tdata\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Cases:\n\t\t\t//\n\t\t\t//\t\tstyle: {\n\t\t\t//\t\t\tcolor: 'red'\n\t\t\t//\t\t}\n\t\t\t//\n\t\t\telse {\n\t\t\t\tnode.style[ styleName ] = styleValue;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Recursively renders HTML element's children from {@link module:ui/template~Template#children}.\n\t *\n\t * @protected\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t */\n\t_renderElementChildren( data ) {\n\t\tconst node = data.node;\n\t\tconst container = data.intoFragment ? document.createDocumentFragment() : node;\n\t\tconst isApplying = data.isApplying;\n\t\tlet childIndex = 0;\n\n\t\tfor ( const child of this.children ) {\n\t\t\tif ( isViewCollection( child ) ) {\n\t\t\t\tif ( !isApplying ) {\n\t\t\t\t\tchild.setParent( node );\n\n\t\t\t\t\tfor ( const view of child ) {\n\t\t\t\t\t\tcontainer.appendChild( view.element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if ( isView( child ) ) {\n\t\t\t\tif ( !isApplying ) {\n\t\t\t\t\tcontainer.appendChild( child.element );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( isApplying ) {\n\t\t\t\t\tconst revertData = data.revertData;\n\t\t\t\t\tconst childRevertData = getEmptyRevertData();\n\n\t\t\t\t\trevertData.children.push( childRevertData );\n\n\t\t\t\t\tchild._renderNode( {\n\t\t\t\t\t\tnode: container.childNodes[ childIndex++ ],\n\t\t\t\t\t\tisApplying: true,\n\t\t\t\t\t\trevertData: childRevertData\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tcontainer.appendChild( child.render() );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( data.intoFragment ) {\n\t\t\tnode.appendChild( container );\n\t\t}\n\t}\n\n\t/**\n\t * Activates `on` event listeners from the {@link module:ui/template~TemplateDefinition}\n\t * on an HTML element.\n\t *\n\t * @protected\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t */\n\t_setUpListeners( data ) {\n\t\tif ( !this.eventListeners ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( const key in this.eventListeners ) {\n\t\t\tconst revertBindings = this.eventListeners[ key ].map( schemaItem => {\n\t\t\t\tconst [ domEvtName, domSelector ] = key.split( '@' );\n\n\t\t\t\treturn schemaItem.activateDomEventListener( domEvtName, domSelector, data );\n\t\t\t} );\n\n\t\t\tif ( data.revertData ) {\n\t\t\t\tdata.revertData.bindings.push( revertBindings );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * For a given {@link module:ui/template~TemplateValueSchema} containing {@link module:ui/template~TemplateBinding}\n\t * activates the binding and sets its initial value.\n\t *\n\t * Note: {@link module:ui/template~TemplateValueSchema} can be for an HTML element attributes or\n\t * text node `textContent`.\n\t *\n\t * @protected\n\t * @param {Object} options Binding options.\n\t * @param {module:ui/template~TemplateValueSchema} options.schema\n\t * @param {Function} options.updater A function which updates DOM (like attribute or text).\n\t * @param {module:ui/template~RenderData} options.data Rendering data.\n\t */\n\t_bindToObservable( { schema, updater, data } ) {\n\t\tconst revertData = data.revertData;\n\n\t\t// Set initial values.\n\t\tsyncValueSchemaValue( schema, updater, data );\n\n\t\tconst revertBindings = schema\n\t\t\t// Filter \"falsy\" (false, undefined, null, '') value schema components out.\n\t\t\t.filter( item => !isFalsy( item ) )\n\t\t\t// Filter inactive bindings from schema, like static strings ('foo'), numbers (42), etc.\n\t\t\t.filter( item => item.observable )\n\t\t\t// Once only the actual binding are left, let the emitter listen to observable change:attribute event.\n\t\t\t// TODO: Reduce the number of listeners attached as many bindings may listen\n\t\t\t// to the same observable attribute.\n\t\t\t.map( templateBinding => templateBinding.activateAttributeListener( schema, updater, data ) );\n\n\t\tif ( revertData ) {\n\t\t\trevertData.bindings.push( revertBindings );\n\t\t}\n\t}\n\n\t/**\n\t * Reverts {@link module:ui/template~RenderData#revertData template data} from a node to\n\t * return it to the the original state.\n\t *\n\t * @protected\n\t * @param {HTMLElement|Text} node A node to be reverted.\n\t * @param {module:ui/template~RenderData#revertData} revertData Stores information about\n\t * what changes have been made by {@link #apply} to the node.\n\t */\n\t_revertTemplateFromNode( node, revertData ) {\n\t\tfor ( const binding of revertData.bindings ) {\n\t\t\t// Each binding may consist of several observable+observable#attribute.\n\t\t\t// like the following has 2:\n\t\t\t//\n\t\t\t//\t\tclass: [\n\t\t\t//\t\t\t'x',\n\t\t\t//\t\t\tbind.to( 'foo' ),\n\t\t\t//\t\t\t'y',\n\t\t\t//\t\t\tbind.to( 'bar' )\n\t\t\t//\t\t]\n\t\t\t//\n\t\t\tfor ( const revertBinding of binding ) {\n\t\t\t\trevertBinding();\n\t\t\t}\n\t\t}\n\n\t\tif ( revertData.text ) {\n\t\t\tnode.textContent = revertData.text;\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( const attrName in revertData.attributes ) {\n\t\t\tconst attrValue = revertData.attributes[ attrName ];\n\n\t\t\t// When the attribute has **not** been set before #apply().\n\t\t\tif ( attrValue === null ) {\n\t\t\t\tnode.removeAttribute( attrName );\n\t\t\t} else {\n\t\t\t\tnode.setAttribute( attrName, attrValue );\n\t\t\t}\n\t\t}\n\n\t\tfor ( let i = 0; i < revertData.children.length; ++i ) {\n\t\t\tthis._revertTemplateFromNode( node.childNodes[ i ], revertData.children[ i ] );\n\t\t}\n\t}\n}\n\nmix( Template, EmitterMixin );\n\n/**\n * Describes a binding created by {@link module:ui/template~Template.bind} interface.\n *\n * @protected\n */\nexport class TemplateBinding {\n\t/**\n\t * Creates an instance of the {@link module:ui/template~TemplateBinding} class.\n\t *\n\t * @param {module:ui/template~TemplateDefinition} def The definition of the binding.\n\t */\n\tconstructor( def ) {\n\t\tObject.assign( this, def );\n\n\t\t/**\n\t\t * An observable instance of the binding. It either:\n\t\t *\n\t\t * * provides the attribute with the value\n\t\t * * or passes the event when a corresponding DOM event is fired.\n\t\t *\n\t\t * @member {module:utils/observablemixin~ObservableMixin} module:ui/template~TemplateBinding#observable\n\t\t */\n\n\t\t/**\n\t\t * An {@link module:utils/emittermixin~Emitter} used by the binding to:\n\t\t *\n\t\t * * listen to the attribute change in the {@link module:ui/template~TemplateBinding#observable},\n\t\t * * or listen to the event in the DOM.\n\t\t *\n\t\t * @member {module:utils/emittermixin~EmitterMixin} module:ui/template~TemplateBinding#emitter\n\t\t */\n\n\t\t/**\n\t\t * The name of the {@link module:ui/template~TemplateBinding#observable observed attribute}.\n\t\t *\n\t\t * @member {String} module:ui/template~TemplateBinding#attribute\n\t\t */\n\n\t\t/**\n\t\t * A custom function to process the value of the {@link module:ui/template~TemplateBinding#attribute}.\n\t\t *\n\t\t * @member {Function} [module:ui/template~TemplateBinding#callback]\n\t\t */\n\t}\n\n\t/**\n\t * Returns the value of the binding. It is the value of the {@link module:ui/template~TemplateBinding#attribute} in\n\t * {@link module:ui/template~TemplateBinding#observable}. The value may be processed by the\n\t * {@link module:ui/template~TemplateBinding#callback}, if such has been passed to the binding.\n\t *\n\t * @param {Node} [node] A native DOM node, passed to the custom {@link module:ui/template~TemplateBinding#callback}.\n\t * @returns {*} The value of {@link module:ui/template~TemplateBinding#attribute} in\n\t * {@link module:ui/template~TemplateBinding#observable}.\n\t */\n\tgetValue( node ) {\n\t\tconst value = this.observable[ this.attribute ];\n\n\t\treturn this.callback ? this.callback( value, node ) : value;\n\t}\n\n\t/**\n\t * Activates the listener which waits for changes of the {@link module:ui/template~TemplateBinding#attribute} in\n\t * {@link module:ui/template~TemplateBinding#observable}, then updates the DOM with the aggregated\n\t * value of {@link module:ui/template~TemplateValueSchema}.\n\t *\n\t * @param {module:ui/template~TemplateValueSchema} schema A full schema to generate an attribute or text in DOM.\n\t * @param {Function} updater A DOM updater function used to update native DOM attribute or text.\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t * @returns {Function} A function to sever the listener binding.\n\t */\n\tactivateAttributeListener( schema, updater, data ) {\n\t\tconst callback = () => syncValueSchemaValue( schema, updater, data );\n\n\t\tthis.emitter.listenTo( this.observable, 'change:' + this.attribute, callback );\n\n\t\t// Allows revert of the listener.\n\t\treturn () => {\n\t\t\tthis.emitter.stopListening( this.observable, 'change:' + this.attribute, callback );\n\t\t};\n\t}\n}\n\n/**\n * Describes either:\n *\n * * a binding to an {@link module:utils/observablemixin~Observable},\n * * or a native DOM event binding.\n *\n * It is created by the {@link module:ui/template~BindChain#to} method.\n *\n * @protected\n */\nexport class TemplateToBinding extends TemplateBinding {\n\t/**\n\t * Activates the listener for the native DOM event, which when fired, is propagated by\n\t * the {@link module:ui/template~TemplateBinding#emitter}.\n\t *\n\t * @param {String} domEvtName A name of the native DOM event.\n\t * @param {String} domSelector A selector in DOM to filter delegated events.\n\t * @param {module:ui/template~RenderData} data Rendering data.\n\t * @returns {Function} A function to sever the listener binding.\n\t */\n\tactivateDomEventListener( domEvtName, domSelector, data ) {\n\t\tconst callback = ( evt, domEvt ) => {\n\t\t\tif ( !domSelector || domEvt.target.matches( domSelector ) ) {\n\t\t\t\tif ( typeof this.eventNameOrFunction == 'function' ) {\n\t\t\t\t\tthis.eventNameOrFunction( domEvt );\n\t\t\t\t} else {\n\t\t\t\t\tthis.observable.fire( this.eventNameOrFunction, domEvt );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tthis.emitter.listenTo( data.node, domEvtName, callback );\n\n\t\t// Allows revert of the listener.\n\t\treturn () => {\n\t\t\tthis.emitter.stopListening( data.node, domEvtName, callback );\n\t\t};\n\t}\n}\n\n/**\n * Describes a binding to {@link module:utils/observablemixin~ObservableMixin} created by {@link module:ui/template~BindChain#if}\n * method.\n *\n * @protected\n */\nexport class TemplateIfBinding extends TemplateBinding {\n\t/**\n\t * @inheritDoc\n\t */\n\tgetValue( node ) {\n\t\tconst value = super.getValue( node );\n\n\t\treturn isFalsy( value ) ? false : ( this.valueIfTrue || true );\n\t}\n\n\t/**\n\t * The value of the DOM attribute/text to be set if the {@link module:ui/template~TemplateBinding#attribute} in\n\t * {@link module:ui/template~TemplateBinding#observable} is `true`.\n\t *\n\t * @member {String} [module:ui/template~TemplateIfBinding#valueIfTrue]\n\t */\n}\n\n// Checks whether given {@link module:ui/template~TemplateValueSchema} contains a\n// {@link module:ui/template~TemplateBinding}.\n//\n// @param {module:ui/template~TemplateValueSchema} schema\n// @returns {Boolean}\nfunction hasTemplateBinding( schema ) {\n\tif ( !schema ) {\n\t\treturn false;\n\t}\n\n\t// Normalize attributes with additional data like namespace:\n\t//\n\t//\t\tclass: {\n\t//\t\t\tns: 'abc',\n\t//\t\t\tvalue: [ ... ]\n\t//\t\t}\n\t//\n\tif ( schema.value ) {\n\t\tschema = schema.value;\n\t}\n\n\tif ( Array.isArray( schema ) ) {\n\t\treturn schema.some( hasTemplateBinding );\n\t} else if ( schema instanceof TemplateBinding ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n// Assembles the value using {@link module:ui/template~TemplateValueSchema} and stores it in a form of\n// an Array. Each entry of an Array corresponds to one of {@link module:ui/template~TemplateValueSchema}\n// items.\n//\n// @param {module:ui/template~TemplateValueSchema} schema\n// @param {Node} node DOM Node updated when {@link module:utils/observablemixin~ObservableMixin} changes.\n// @return {Array}\nfunction getValueSchemaValue( schema, node ) {\n\treturn schema.map( schemaItem => {\n\t\t// Process {@link module:ui/template~TemplateBinding} bindings.\n\t\tif ( schemaItem instanceof TemplateBinding ) {\n\t\t\treturn schemaItem.getValue( node );\n\t\t}\n\n\t\t// All static values like strings, numbers, and \"falsy\" values (false, null, undefined, '', etc.) just pass.\n\t\treturn schemaItem;\n\t} );\n}\n\n// A function executed each time bound Observable attribute changes, which updates DOM with a value\n// constructed from {@link module:ui/template~TemplateValueSchema}.\n//\n// @param {module:ui/template~TemplateValueSchema} schema\n// @param {Function} updater A function which updates DOM (like attribute or text).\n// @param {Node} node DOM Node updated when {@link module:utils/observablemixin~ObservableMixin} changes.\nfunction syncValueSchemaValue( schema, updater, { node } ) {\n\tlet value = getValueSchemaValue( schema, node );\n\n\t// Check if schema is a single Template.bind.if, like:\n\t//\n\t//\t\tclass: Template.bind.if( 'foo' )\n\t//\n\tif ( schema.length == 1 && schema[ 0 ] instanceof TemplateIfBinding ) {\n\t\tvalue = value[ 0 ];\n\t} else {\n\t\tvalue = value.reduce( arrayValueReducer, '' );\n\t}\n\n\tif ( isFalsy( value ) ) {\n\t\tupdater.remove();\n\t} else {\n\t\tupdater.set( value );\n\t}\n}\n\n// Returns an object consisting of `set` and `remove` functions, which\n// can be used in the context of DOM Node to set or reset `textContent`.\n// @see module:ui/view~View#_bindToObservable\n//\n// @param {Node} node DOM Node to be modified.\n// @returns {Object}\nfunction getTextUpdater( node ) {\n\treturn {\n\t\tset( value ) {\n\t\t\tnode.textContent = value;\n\t\t},\n\n\t\tremove() {\n\t\t\tnode.textContent = '';\n\t\t}\n\t};\n}\n\n// Returns an object consisting of `set` and `remove` functions, which\n// can be used in the context of DOM Node to set or reset an attribute.\n// @see module:ui/view~View#_bindToObservable\n//\n// @param {Node} node DOM Node to be modified.\n// @param {String} attrName Name of the attribute to be modified.\n// @param {String} [ns=null] Namespace to use.\n// @returns {Object}\nfunction getAttributeUpdater( el, attrName, ns ) {\n\treturn {\n\t\tset( value ) {\n\t\t\tel.setAttributeNS( ns, attrName, value );\n\t\t},\n\n\t\tremove() {\n\t\t\tel.removeAttributeNS( ns, attrName );\n\t\t}\n\t};\n}\n\n// Returns an object consisting of `set` and `remove` functions, which\n// can be used in the context of CSSStyleDeclaration to set or remove a style.\n// @see module:ui/view~View#_bindToObservable\n//\n// @param {Node} node DOM Node to be modified.\n// @param {String} styleName Name of the style to be modified.\n// @returns {Object}\nfunction getStyleUpdater( el, styleName ) {\n\treturn {\n\t\tset( value ) {\n\t\t\tel.style[ styleName ] = value;\n\t\t},\n\n\t\tremove() {\n\t\t\tel.style[ styleName ] = null;\n\t\t}\n\t};\n}\n\n// Clones definition of the template.\n//\n// @param {module:ui/template~TemplateDefinition} def\n// @returns {module:ui/template~TemplateDefinition}\nfunction clone( def ) {\n\tconst clone = cloneDeepWith( def, value => {\n\t\t// Don't clone the `Template.bind`* bindings because of the references to Observable\n\t\t// and DomEmitterMixin instances inside, which would also be traversed and cloned by greedy\n\t\t// cloneDeepWith algorithm. There's no point in cloning Observable/DomEmitterMixins\n\t\t// along with the definition.\n\t\t//\n\t\t// Don't clone Template instances if provided as a child. They're simply #render()ed\n\t\t// and nothing should interfere.\n\t\t//\n\t\t// Also don't clone View instances if provided as a child of the Template. The template\n\t\t// instance will be extracted from the View during the normalization and there's no need\n\t\t// to clone it.\n\t\tif ( value && ( value instanceof TemplateBinding || isTemplate( value ) || isView( value ) || isViewCollection( value ) ) ) {\n\t\t\treturn value;\n\t\t}\n\t} );\n\n\treturn clone;\n}\n\n// Normalizes given {@link module:ui/template~TemplateDefinition}.\n//\n// See:\n// * {@link normalizeAttributes}\n// * {@link normalizeListeners}\n// * {@link normalizePlainTextDefinition}\n// * {@link normalizeTextDefinition}\n//\n// @param {module:ui/template~TemplateDefinition} def\n// @returns {module:ui/template~TemplateDefinition} Normalized definition.\nfunction normalize( def ) {\n\tif ( typeof def == 'string' ) {\n\t\tdef = normalizePlainTextDefinition( def );\n\t} else if ( def.text ) {\n\t\tnormalizeTextDefinition( def );\n\t}\n\n\tif ( def.on ) {\n\t\tdef.eventListeners = normalizeListeners( def.on );\n\n\t\t// Template mixes EmitterMixin, so delete #on to avoid collision.\n\t\tdelete def.on;\n\t}\n\n\tif ( !def.text ) {\n\t\tif ( def.attributes ) {\n\t\t\tnormalizeAttributes( def.attributes );\n\t\t}\n\n\t\tconst children = new ViewCollection();\n\n\t\tif ( def.children ) {\n\t\t\tif ( isViewCollection( def.children ) ) {\n\t\t\t\tchildren.add( def.children );\n\t\t\t} else {\n\t\t\t\tfor ( const child of def.children ) {\n\t\t\t\t\tif ( isTemplate( child ) || isView( child ) ) {\n\t\t\t\t\t\tchildren.add( child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchildren.add( new Template( child ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdef.children = children;\n\t}\n\n\treturn def;\n}\n\n// Normalizes \"attributes\" section of {@link module:ui/template~TemplateDefinition}.\n//\n//\t\tattributes: {\n//\t\t\ta: 'bar',\n//\t\t\tb: {@link module:ui/template~TemplateBinding},\n//\t\t\tc: {\n//\t\t\t\tvalue: 'bar'\n//\t\t\t}\n//\t\t}\n//\n// becomes\n//\n//\t\tattributes: {\n//\t\t\ta: [ 'bar' ],\n//\t\t\tb: [ {@link module:ui/template~TemplateBinding} ],\n//\t\t\tc: {\n//\t\t\t\tvalue: [ 'bar' ]\n//\t\t\t}\n//\t\t}\n//\n// @param {Object} attrs\nfunction normalizeAttributes( attrs ) {\n\tfor ( const a in attrs ) {\n\t\tif ( attrs[ a ].value ) {\n\t\t\tattrs[ a ].value = [].concat( attrs[ a ].value );\n\t\t}\n\n\t\tarrayify( attrs, a );\n\t}\n}\n\n// Normalizes \"on\" section of {@link module:ui/template~TemplateDefinition}.\n//\n//\t\ton: {\n//\t\t\ta: 'bar',\n//\t\t\tb: {@link module:ui/template~TemplateBinding},\n//\t\t\tc: [ {@link module:ui/template~TemplateBinding}, () => { ... } ]\n//\t\t}\n//\n// becomes\n//\n//\t\ton: {\n//\t\t\ta: [ 'bar' ],\n//\t\t\tb: [ {@link module:ui/template~TemplateBinding} ],\n//\t\t\tc: [ {@link module:ui/template~TemplateBinding}, () => { ... } ]\n//\t\t}\n//\n// @param {Object} listeners\n// @returns {Object} Object containing normalized listeners.\nfunction normalizeListeners( listeners ) {\n\tfor ( const l in listeners ) {\n\t\tarrayify( listeners, l );\n\t}\n\n\treturn listeners;\n}\n\n// Normalizes \"string\" {@link module:ui/template~TemplateDefinition}.\n//\n//\t\t\"foo\"\n//\n// becomes\n//\n//\t\t{ text: [ 'foo' ] },\n//\n// @param {String} def\n// @returns {module:ui/template~TemplateDefinition} Normalized template definition.\nfunction normalizePlainTextDefinition( def ) {\n\treturn {\n\t\ttext: [ def ]\n\t};\n}\n\n// Normalizes text {@link module:ui/template~TemplateDefinition}.\n//\n//\t\tchildren: [\n//\t\t\t{ text: 'def' },\n//\t\t\t{ text: {@link module:ui/template~TemplateBinding} }\n//\t\t]\n//\n// becomes\n//\n//\t\tchildren: [\n//\t\t\t{ text: [ 'def' ] },\n//\t\t\t{ text: [ {@link module:ui/template~TemplateBinding} ] }\n//\t\t]\n//\n// @param {module:ui/template~TemplateDefinition} def\nfunction normalizeTextDefinition( def ) {\n\tif ( !Array.isArray( def.text ) ) {\n\t\tdef.text = [ def.text ];\n\t}\n}\n\n// Wraps an entry in Object in an Array, if not already one.\n//\n//\t\t{\n//\t\t\tx: 'y',\n//\t\t\ta: [ 'b' ]\n//\t\t}\n//\n// becomes\n//\n//\t\t{\n//\t\t\tx: [ 'y' ],\n//\t\t\ta: [ 'b' ]\n//\t\t}\n//\n// @param {Object} obj\n// @param {String} key\nfunction arrayify( obj, key ) {\n\tif ( !Array.isArray( obj[ key ] ) ) {\n\t\tobj[ key ] = [ obj[ key ] ];\n\t}\n}\n\n// A helper which concatenates the value avoiding unwanted\n// leading white spaces.\n//\n// @param {String} prev\n// @param {String} cur\n// @returns {String}\nfunction arrayValueReducer( prev, cur ) {\n\tif ( isFalsy( cur ) ) {\n\t\treturn prev;\n\t} else if ( isFalsy( prev ) ) {\n\t\treturn cur;\n\t} else {\n\t\treturn `${ prev } ${ cur }`;\n\t}\n}\n\n// Extends one object defined in the following format:\n//\n//\t\t{\n//\t\t\tkey1: [Array1],\n//\t\t\tkey2: [Array2],\n//\t\t\t...\n//\t\t\tkeyN: [ArrayN]\n//\t\t}\n//\n// with another object of the same data format.\n//\n// @param {Object} obj Base object.\n// @param {Object} ext Object extending base.\n// @returns {String}\nfunction extendObjectValueArray( obj, ext ) {\n\tfor ( const a in ext ) {\n\t\tif ( obj[ a ] ) {\n\t\t\tobj[ a ].push( ...ext[ a ] );\n\t\t} else {\n\t\t\tobj[ a ] = ext[ a ];\n\t\t}\n\t}\n}\n\n// A helper for {@link module:ui/template~Template#extend}. Recursively extends {@link module:ui/template~Template} instance\n// with content from {module:ui/template~TemplateDefinition}. See {@link module:ui/template~Template#extend} to learn more.\n//\n// @param {module:ui/template~Template} def A template instance to be extended.\n// @param {module:ui/template~TemplateDefinition} def A definition which is to extend the template instance.\nfunction extendTemplate( template, def ) {\n\tif ( def.attributes ) {\n\t\tif ( !template.attributes ) {\n\t\t\ttemplate.attributes = {};\n\t\t}\n\n\t\textendObjectValueArray( template.attributes, def.attributes );\n\t}\n\n\tif ( def.eventListeners ) {\n\t\tif ( !template.eventListeners ) {\n\t\t\ttemplate.eventListeners = {};\n\t\t}\n\n\t\textendObjectValueArray( template.eventListeners, def.eventListeners );\n\t}\n\n\tif ( def.text ) {\n\t\ttemplate.text.push( ...def.text );\n\t}\n\n\tif ( def.children && def.children.length ) {\n\t\tif ( template.children.length != def.children.length ) {\n\t\t\t/**\n\t\t\t * The number of children in extended definition does not match.\n\t\t\t *\n\t\t\t * @error ui-template-extend-children-mismatch\n\t\t\t */\n\t\t\tthrow new CKEditorError(\n\t\t\t\t'ui-template-extend-children-mismatch: The number of children in extended definition does not match.'\n\t\t\t);\n\t\t}\n\n\t\tlet childIndex = 0;\n\n\t\tfor ( const childDef of def.children ) {\n\t\t\textendTemplate( template.children.get( childIndex++ ), childDef );\n\t\t}\n\t}\n}\n\n// Checks if value is \"falsy\".\n// Note: 0 (Number) is not \"falsy\" in this context.\n//\n// @private\n// @param {*} value Value to be checked.\nfunction isFalsy( value ) {\n\treturn !value && value !== 0;\n}\n\n// Checks if the item is an instance of {@link module:ui/view~View}\n//\n// @private\n// @param {*} value Value to be checked.\nfunction isView( item ) {\n\treturn item instanceof View;\n}\n\n// Checks if the item is an instance of {@link module:ui/template~Template}\n//\n// @private\n// @param {*} value Value to be checked.\nfunction isTemplate( item ) {\n\treturn item instanceof Template;\n}\n\n// Checks if the item is an instance of {@link module:ui/viewcollection~ViewCollection}\n//\n// @private\n// @param {*} value Value to be checked.\nfunction isViewCollection( item ) {\n\treturn item instanceof ViewCollection;\n}\n\n// Creates an empty skeleton for {@link module:ui/template~Template#revert}\n// data.\n//\n// @private\nfunction getEmptyRevertData() {\n\treturn {\n\t\tchildren: [],\n\t\tbindings: [],\n\t\tattributes: {}\n\t};\n}\n\n// Checks whether an attribute should be extended when\n// {@link module:ui/template~Template#apply} is called.\n//\n// @private\n// @param {String} attrName Attribute name to check.\nfunction shouldExtend( attrName ) {\n\treturn attrName == 'class' || attrName == 'style';\n}\n\n/**\n * A definition of the {@link module:ui/template~Template}. It describes what kind of\n * node a template will render (HTML element or text), attributes of an element, DOM event\n * listeners and children.\n *\n * Also see:\n * * {@link module:ui/template~TemplateValueSchema} to learn about HTML element attributes,\n * * {@link module:ui/template~TemplateListenerSchema} to learn about DOM event listeners.\n *\n * A sample definition on an HTML element can look like this:\n *\n *\t\tnew Template( {\n *\t\t\ttag: 'p',\n *\t\t\tchildren: [\n *\t\t\t\t{\n *\t\t\t\t\ttag: 'span',\n *\t\t\t\t\tattributes: { ... },\n *\t\t\t\t\tchildren: [ ... ],\n *\t\t\t\t},\n *\t\t\t\t{\n *\t\t\t\t\ttext: 'static–text'\n *\t\t\t\t},\n *\t\t\t\t'also-static–text',\n *\t\t\t],\n *\t\t\tattributes: {\n *\t\t\t\tclass: {@link module:ui/template~TemplateValueSchema},\n *\t\t\t\tid: {@link module:ui/template~TemplateValueSchema},\n *\t\t\t\tstyle: {@link module:ui/template~TemplateValueSchema}\n *\n *\t\t\t\t// ...\n *\t\t\t},\n *\t\t\ton: {\n *\t\t\t\t'click': {@link module:ui/template~TemplateListenerSchema}\n *\n *\t\t\t\t// Document.querySelector format is also accepted.\n *\t\t\t\t'keyup@a.some-class': {@link module:ui/template~TemplateListenerSchema}\n *\n *\t\t\t\t// ...\n *\t\t\t}\n *\t\t} );\n *\n * A {@link module:ui/view~View} or another {@link module:ui/template~Template} can also become a child\n * of a template. In case of a view {@link module:ui/view~View#element} is used:\n *\n *\t\tconst view = new SomeView();\n *\t\tconst childTemplate = new Template( { ... } );\n *\n *\t\tnew Template( {\n *\t\t\ttag: 'p',\n *\n *\t\t\tchildren: [\n *\t\t\t\t// view#element will be added as a child of this

.\n *\t\t\t\tview,\n *\n * \t\t\t\t// The output of childTemplate.render() will be added here.\n *\t\t\t\tchildTemplate\n *\t\t\t]\n *\t\t} );\n *\n * An entire {@link module:ui/viewcollection~ViewCollection} can be used as a child in the definition:\n *\n *\t\tconst collection = new ViewCollection();\n *\t\tcollection.add( someView );\n *\n *\t\tnew Template( {\n *\t\t\ttag: 'p',\n *\n *\t\t\tchildren: collection\n *\t\t} );\n *\n * @typedef module:ui/template~TemplateDefinition\n * @type Object\n *\n * @property {String} tag See template {@link module:ui/template~Template#tag} property.\n *\n * @property {Array.} [children]\n * See template {@link module:ui/template~Template#children} property.\n *\n * @property {Object.} [attributes]\n * See template {@link module:ui/template~Template#attributes} property.\n *\n * @property {String|module:ui/template~TemplateValueSchema|Array.} [text]\n * See template {@link module:ui/template~Template#text} property.\n *\n * @property {Object.} [on]\n * See template {@link module:ui/template~Template#eventListeners} property.\n */\n\n/**\n * Describes a value of an HTML element attribute or `textContent`. It allows combining multiple\n * data sources like static values and {@link module:utils/observablemixin~Observable} attributes.\n *\n * Also see:\n * * {@link module:ui/template~TemplateDefinition} to learn where to use it,\n * * {@link module:ui/template~Template.bind} to learn how to configure\n * {@link module:utils/observablemixin~Observable} attribute bindings,\n * * {@link module:ui/template~Template#render} to learn how to render a template,\n * * {@link module:ui/template~BindChain#to `to()`} and {@link module:ui/template~BindChain#if `if()`}\n * methods to learn more about bindings.\n *\n * Attribute values can be described in many different ways:\n *\n *\t\t// Bind helper will create bindings to attributes of the observable.\n *\t\tconst bind = Template.bind( observable, emitter );\n *\n *\t\tnew Template( {\n *\t\t\ttag: 'p',\n *\t\t\tattributes: {\n *\t\t\t\t// A plain string schema.\n *\t\t\t\t'class': 'static-text',\n *\n *\t\t\t\t// An object schema, binds to the \"foo\" attribute of the\n *\t\t\t\t// observable and follows its value.\n *\t\t\t\t'class': bind.to( 'foo' ),\n *\n *\t\t\t\t// An array schema, combines the above.\n *\t\t\t\t'class': [\n *\t\t\t\t\t'static-text',\n *\t\t\t\t\tbind.to( 'bar', () => { ... } ),\n *\n * \t\t\t\t\t// Bindings can also be conditional.\n *\t\t\t\t\tbind.if( 'baz', 'class-when-baz-is-true' )\n *\t\t\t\t],\n *\n *\t\t\t\t// An array schema, with a custom namespace, e.g. useful for creating SVGs.\n *\t\t\t\t'class': {\n *\t\t\t\t\tns: 'http://ns.url',\n *\t\t\t\t\tvalue: [\n *\t\t\t\t\t\tbind.if( 'baz', 'value-when-true' ),\n *\t\t\t\t\t\t'static-text'\n *\t\t\t\t\t]\n *\t\t\t\t},\n *\n *\t\t\t\t// An object schema, specific for styles.\n *\t\t\t\tstyle: {\n *\t\t\t\t\tcolor: 'red',\n *\t\t\t\t\tbackgroundColor: bind.to( 'qux', () => { ... } )\n *\t\t\t\t}\n *\t\t\t}\n *\t\t} );\n *\n * Text nodes can also be have complex values:\n *\n *\t\tconst bind = Template.bind( observable, emitter );\n *\n *\t\t// Will render a \"foo\" text node.\n *\t\tnew Template( {\n *\t\t\ttext: 'foo'\n *\t\t} );\n *\n *\t\t// Will render a \"static text: {observable.foo}\" text node.\n *\t\t// The text of the node will be updated as the \"foo\" attribute changes.\n *\t\tnew Template( {\n *\t\t\ttext: [\n *\t\t\t\t'static text: ',\n *\t\t\t\tbind.to( 'foo', () => { ... } )\n *\t\t\t]\n *\t\t} );\n *\n * @typedef module:ui/template~TemplateValueSchema\n * @type {Object|String|Array}\n */\n\n/**\n * Describes an event listener attached to an HTML element. Such listener can propagate DOM events\n * through an {@link module:utils/observablemixin~Observable} instance, execute custom callbacks\n * or both, if necessary.\n *\n * Also see:\n * * {@link module:ui/template~TemplateDefinition} to learn more about template definitions,\n * * {@link module:ui/template~BindChain#to `to()`} method, to learn more about bindings.\n *\n * Check out different ways of attaching event listeners below:\n *\n *\t\t// Bind helper will propagate events through the observable.\n *\t\tconst bind = Template.bind( observable, emitter );\n *\n *\t\tnew Template( {\n *\t\t\ttag: 'p',\n *\t\t\ton: {\n *\t\t\t\t// An object schema. The observable will fire 'clicked' event upon DOM 'click'.\n *\t\t\t\tclick: bind.to( 'clicked' )\n *\n *\t\t\t\t// An object schema. It will work for \"click\" event on \"a.foo\" children only.\n *\t\t\t\t'click@a.foo': bind.to( 'clicked' )\n *\n *\t\t\t\t// An array schema, makes the observable propagate multiple events.\n *\t\t\t\tclick: [\n *\t\t\t\t\tbind.to( 'clicked' ),\n *\t\t\t\t\tbind.to( 'executed' )\n *\t\t\t\t],\n *\n *\t\t\t\t// An array schema with a custom callback.\n *\t\t\t\t'click@a.foo': {\n *\t\t\t\t\tbind.to( 'clicked' ),\n *\t\t\t\t\tbind.to( evt => {\n *\t\t\t\t\t\tconsole.log( `${ evt.target } has been clicked!` );\n *\t\t\t\t\t} }\n *\t\t\t\t}\n *\t\t\t}\n *\t\t} );\n *\n * @typedef module:ui/template~TemplateListenerSchema\n * @type {Object|String|Array}\n */\n\n/**\n * The return value of {@link ~Template.bind `Template.bind()`}. It provides `to()` and `if()`\n * methods to create {@link module:utils/observablemixin~Observable observable} attribute and event bindings.\n *\n * @interface module:ui/template~BindChain\n */\n\n/**\n * Binds an {@link module:utils/observablemixin~Observable observable} to either:\n *\n * * an HTML element attribute or a text node `textContent` so remains in sync with the observable\n * attribute as it changes,\n * * or an HTML element DOM event, so the DOM events are propagated through an observable.\n *\n * Some common use–cases of `to()` bindings are presented below:\n *\n *\t\tconst bind = Template.bind( observable, emitter );\n *\n *\t\tnew Template( {\n *\t\t\ttag: 'p',\n *\t\t\tattributes: {\n *\t\t\t\t// class=\"...\" attribute gets bound to `observable#a`\n *\t\t\t\tclass: bind.to( 'a' )\n *\t\t\t},\n *\t\t\tchildren: [\n *\t\t\t\t//

...

gets bound to observable#b; always `toUpperCase()`.\n *\t\t\t\t{\n *\t\t\t\t\ttext: bind.to( 'b', ( value, node ) => value.toUpperCase() )\n *\t\t\t\t}\n *\t\t\t],\n *\t\t\ton: {\n *\t\t\t\tclick: [\n *\t\t\t\t\t// an observable will fire \"clicked\" upon \"click\" in DOM.\n *\t\t\t\t\tbind.to( 'clicked' ),\n *\n *\t\t\t\t\t// A custom callback will be executed upon \"click\" in DOM.\n *\t\t\t\t\tbind.to( () => {\n *\t\t\t\t\t\t...\n *\t\t\t\t\t} )\n *\t\t\t\t]\n *\t\t\t}\n *\t\t} ).render();\n *\n * Learn more about using `to()` in the {@link module:ui/template~TemplateValueSchema} and\n * {@link module:ui/template~TemplateListenerSchema}.\n *\n * @method #to\n * @param {String|Function} eventNameOrFunctionOrAttribute An attribute name of\n * {@link module:utils/observablemixin~Observable} or a DOM event name or an event callback.\n * @param {Function} [callback] Allows processing of the value. Accepts `Node` and `value` as arguments.\n * @return {module:ui/template~TemplateBinding}\n */\n\n/**\n * Binds an {@link module:utils/observablemixin~Observable observable} to an HTML element attribute or a text\n * node `textContent` so remains in sync with the observable attribute as it changes.\n *\n * Unlike {@link module:ui/template~BindChain#to}, it controls the presence of the attribute/`textContent`\n * depending on the \"falseness\" of an {@link module:utils/observablemixin~Observable} attribute.\n *\n *\t\tconst bind = Template.bind( observable, emitter );\n *\n *\t\tnew Template( {\n *\t\t\ttag: 'input',\n *\t\t\tattributes: {\n *\t\t\t\t// when `observable#a` is not undefined/null/false/''\n *\t\t\t\t// when `observable#a` is undefined/null/false\n *\t\t\t\tchecked: bind.if( 'a' )\n *\t\t\t},\n *\t\t\tchildren: [\n *\t\t\t\t{\n *\t\t\t\t\t// \"b-is-not-set\" when `observable#b` is undefined/null/false/''\n *\t\t\t\t\t// when `observable#b` is not \"falsy\"\n *\t\t\t\t\ttext: bind.if( 'b', 'b-is-not-set', ( value, node ) => !value )\n *\t\t\t\t}\n *\t\t\t]\n *\t\t} ).render();\n *\n * Learn more about using `if()` in the {@link module:ui/template~TemplateValueSchema}.\n *\n * @method #if\n * @param {String} attribute An attribute name of {@link module:utils/observablemixin~Observable} used in the binding.\n * @param {String} [valueIfTrue] Value set when {@link module:utils/observablemixin~Observable} attribute is not\n * undefined/null/false/'' (empty string).\n * @param {Function} [callback] Allows processing of the value. Accepts `Node` and `value` as arguments.\n * @return {module:ui/template~TemplateBinding}\n */\n\n/**\n * The {@link module:ui/template~Template#_renderNode} configuration.\n *\n * @private\n * @interface module:ui/template~RenderData\n */\n\n/**\n * Tells {@link module:ui/template~Template#_renderNode} to render\n * children into `DocumentFragment` first and then append the fragment\n * to the parent element. It's a speed optimization.\n *\n * @member {Boolean} #intoFragment\n */\n\n/**\n * A node which is being rendered.\n *\n * @member {HTMLElement|Text} #node\n */\n\n/**\n * Indicates whether the {@module:ui/template~RenderNodeOptions#node} has\n * been provided by {@module:ui/template~Template#apply}.\n *\n * @member {Boolean} #isApplying\n */\n\n/**\n * An object storing the data that helps {@module:ui/template~Template#revert}\n * bringing back an element to its initial state, i.e. before\n * {@module:ui/template~Template#apply} was called.\n *\n * @member {Object} #revertData\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-ui/src/template.js\n// module id = 6\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module ui/view\n */\n\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport ViewCollection from './viewcollection';\nimport Template from './template';\nimport DomEmitterMixin from '@ckeditor/ckeditor5-utils/src/dom/emittermixin';\nimport ObservableMixin from '@ckeditor/ckeditor5-utils/src/observablemixin';\nimport Collection from '@ckeditor/ckeditor5-utils/src/collection';\nimport mix from '@ckeditor/ckeditor5-utils/src/mix';\nimport isIterable from '@ckeditor/ckeditor5-utils/src/isiterable';\n\n/**\n * The basic view class, which represents an HTML element created out of a\n * {@link module:ui/view~View#template}. Views are building blocks of the user interface and handle\n * interaction\n *\n * Views {@link module:ui/view~View#addChildren aggregate} children in\n * {@link module:ui/view~View#createCollection collections} and manage the life cycle of DOM\n * listeners e.g. by handling initialization and destruction.\n *\n * See the {@link module:ui/template~TemplateDefinition} syntax to learn more about shaping view\n * elements, attributes and listeners.\n *\n *\t\tclass SampleView extends View {\n *\t\t\tconstructor( locale ) {\n *\t\t\t\tsuper( locale );\n *\n *\t\t\t\tconst bind = this.bindTemplate;\n *\n *\t\t\t\t// Views define their interface (state) using observable attributes.\n *\t\t\t\tthis.set( 'elementClass', 'bar' );\n *\n *\t\t\t\tthis.template = new Template( {\n *\t\t\t\t\ttag: 'p',\n *\n *\t\t\t\t\t// The element of the view can be defined with its children.\n *\t\t\t\t\tchildren: [\n *\t\t\t\t\t\t'Hello',\n *\t\t\t\t\t\t{\n *\t\t\t\t\t\t\ttag: 'b',\n *\t\t\t\t\t\t\tchildren: [ 'world!' ]\n *\t\t\t\t\t\t}\n *\t\t\t\t\t],\n *\t\t\t\t\tattributes: {\n *\t\t\t\t\t\tclass: [\n *\t\t\t\t\t\t\t'foo',\n *\n *\t\t\t\t\t\t\t// Observable attributes control the state of the view in DOM.\n *\t\t\t\t\t\t\tbind.to( 'elementClass' )\n *\t\t\t\t\t\t]\n *\t\t\t\t\t},\n *\t\t\t\t\ton: {\n *\t\t\t\t\t\t// Views listen to DOM events and propagate them.\n *\t\t\t\t\t\tclick: bind.to( 'clicked' )\n *\t\t\t\t\t}\n *\t\t\t\t} );\n *\t\t\t}\n *\t\t}\n *\n *\t\tconst view = new SampleView( locale );\n *\n *\t\t// Each view must be first initialized.\n *\t\tview.init();\n *\n *\t\t// Append

Helloworld

to the \n *\t\tdocument.body.appendChild( view.element );\n *\n *\t\t// Change the class attribute to

Helloworld

\n *\t\tview.elementClass = 'baz';\n *\n *\t\t// Respond to the \"click\" event in DOM by executing a custom action.\n *\t\tview.on( 'clicked', () => {\n *\t\t\tconsole.log( 'The view has been clicked!' );\n *\t\t} );\n *\n * @mixes module:utils/observablemixin~ObservableMixin\n */\nexport default class View {\n\t/**\n\t * Creates an instance of the {@link module:ui/view~View} class.\n\t *\n\t * Also see {@link #init}.\n\t *\n\t * @param {module:utils/locale~Locale} [locale] The localization services instance.\n\t */\n\tconstructor( locale ) {\n\t\t/**\n\t\t * A set of tools to localize the user interface.\n\t\t *\n\t\t * Also see {@link module:core/editor/editor~Editor#locale}.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:utils/locale~Locale}\n\t\t */\n\t\tthis.locale = locale;\n\n\t\t/**\n\t\t * Shorthand for {@link module:utils/locale~Locale#t}.\n\t\t *\n\t\t * Note: If {@link #locale} instance hasn't been passed to the view this method may not\n\t\t * be available.\n\t\t *\n\t\t * @see module:utils/locale~Locale#t\n\t\t * @method\n\t\t */\n\t\tthis.t = locale && locale.t;\n\n\t\t/**\n\t\t * A flag set `true` after {@link #init initialization}. Because the process can be\n\t\t * asynchronous, this {@link module:utils/observablemixin~Observable observable} flag allows\n\t\t * deferring certain actions until it is finished.\n\t\t *\n\t\t * @readonly\n\t\t * @observable\n\t\t * @member {Boolean} #ready\n\t\t */\n\t\tthis.set( 'ready', false );\n\n\t\t/**\n\t\t * Collections registered with {@link #createCollection}.\n\t\t *\n\t\t * @protected\n\t\t * @member {Set.}\n\t\t */\n\t\tthis._viewCollections = new Collection();\n\n\t\t/**\n\t\t * A collection of view instances, which have been added directly\n\t\t * into the {@link module:ui/template~Template#children}.\n\t\t *\n\t\t * @protected\n\t\t * @member {module:ui/viewcollection~ViewCollection}\n\t\t */\n\t\tthis._unboundChildren = this.createCollection();\n\n\t\t// Pass parent locale to its children.\n\t\tthis._viewCollections.on( 'add', ( evt, collection ) => {\n\t\t\tcollection.locale = locale;\n\t\t} );\n\n\t\t/**\n\t\t * Template of this view. It provides the {@link #element} representing\n\t\t * the view in DOM.\n\t\t *\n\t\t * @member {module:ui/template~Template} #template\n\t\t */\n\n\t\t/**\n\t\t * An internal, cached element of this view. See {@link #element}.\n\t\t *\n\t\t * @private\n\t\t * @member {HTMLElement} #_element\n\t\t */\n\n\t\t/**\n\t\t * Cached {@link @link module:ui/template~BindChain bind chain} object created by the\n\t\t * {@link #template}. See {@link #bindTemplate}.\n\t\t *\n\t\t * @private\n\t\t * @member {Object} #_bindTemplate\n\t\t */\n\t}\n\n\t/**\n\t * An HTML element of this view. The element is rendered on first reference\n\t * by the {@link #template}:\n\t *\n\t *\t\tclass SampleView extends View {\n\t *\t\t\tconstructor() {\n\t *\t\t\t\tsuper();\n\t *\n\t *\t\t\t\t// A template instance the #element will be created from.\n\t *\t\t\t\tthis.template = new Template( {\n\t *\t\t\t\t\ttag: 'p'\n\t *\n\t *\t\t\t\t\t// ...\n\t *\t\t\t\t} );\n\t *\t\t\t}\n\t *\t\t}\n\t *\n\t *\t\tconst view = new SampleView();\n\t *\t\tview.init();\n\t *\n\t *\t\t// Renders the #template and appends the output to .\n\t *\t\tdocument.body.appendChild( view.element );\n\t *\n\t * The element of the view can also be assigned directly:\n\t *\n\t *\t\tview.element = document.querySelector( '#my-container' );\n\t *\n\t * @type {HTMLElement}\n\t */\n\tget element() {\n\t\tif ( this._element ) {\n\t\t\treturn this._element;\n\t\t}\n\n\t\t// No template means no element (a virtual view).\n\t\tif ( !this.template ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tthis._addTemplateChildren();\n\n\t\treturn ( this._element = this.template.render() );\n\t}\n\n\tset element( el ) {\n\t\tthis._element = el;\n\t}\n\n\t/**\n\t * Shorthand for {@link module:ui/template~Template.bind}, a binding\n\t * {@link module:ui/template~BindChain interface} pre–configured for the view instance.\n\t *\n\t * It provides {@link module:ui/template~BindChain#to `to()`} and\n\t * {@link module:ui/template~BindChain#if `if()`} methods that initialize bindings with\n\t * observable attributes and attach DOM listeners.\n\t *\n\t *\t\tclass SampleView extends View {\n\t *\t\t\tconstructor( locale ) {\n\t *\t\t\t\tsuper( locale );\n\t *\n\t *\t\t\t\tconst bind = this.bindTemplate;\n\t *\n\t *\t\t\t\t// These {@link module:utils/observablemixin~Observable observable} attributes will control\n\t *\t\t\t\t// the state of the view in DOM.\n\t *\t\t\t\tthis.set( {\n\t *\t\t\t\t\telementClass: 'foo',\n\t *\t\t\t\t \tisEnabled: true\n\t *\t\t\t\t } );\n\t *\n\t *\t\t\t\tthis.template = new Template( {\n\t *\t\t\t\t\ttag: 'p',\n\t *\n\t *\t\t\t\t\tattributes: {\n\t *\t\t\t\t\t\t// The class HTML attribute will follow elementClass\n\t *\t\t\t\t\t\t// and isEnabled view attributes.\n\t *\t\t\t\t\t\tclass: [\n\t *\t\t\t\t\t\t\tbind.to( 'elementClass' )\n\t *\t\t\t\t\t\t\tbind.if( 'isEnabled', 'present-when-enabled' )\n\t *\t\t\t\t\t\t]\n\t *\t\t\t\t\t},\n\t *\n\t *\t\t\t\t\ton: {\n\t *\t\t\t\t\t\t// The view will fire the \"clicked\" event upon clicking

in DOM.\n\t *\t\t\t\t\t\tclick: bind.to( 'clicked' )\n\t *\t\t\t\t\t}\n\t *\t\t\t\t} );\n\t *\t\t\t}\n\t *\t\t}\n\t *\n\t * @method #bindTemplate\n\t */\n\tget bindTemplate() {\n\t\tif ( this._bindTemplate ) {\n\t\t\treturn this._bindTemplate;\n\t\t}\n\n\t\treturn ( this._bindTemplate = Template.bind( this, this ) );\n\t}\n\n\t/**\n\t * Creates a new collection of views, which can be used as\n\t * {@link module:ui/template~Template#children} of this view.\n\t *\n\t *\t\tclass SampleView extends View {\n\t *\t\t\tconstructor( locale ) {\n\t *\t\t\t\tsuper( locale );\n\t *\n\t *\t\t\t\tthis.items = this.createCollection();\n \t *\n\t *\t\t\t\tthis.template = new Template( {\n\t *\t\t\t\t\ttag: 'p',\n\t *\n\t *\t\t\t\t\t// `items` collection will render here.\n\t *\t\t\t\t\tchildren: this.items\n\t *\t\t\t\t} );\n\t *\t\t\t}\n\t *\t\t}\n\t *\n\t *\t\tconst view = new SampleView( locale );\n\t *\t\tconst child = new ChildView( locale );\n\t *\n\t *\t\tview.init();\n\t *\n\t *\t\t// It will append

to the .\n\t *\t\tdocument.body.appendChild( view.element );\n\t *\n\t *\t\t// From now on the child is nested under its parent, which is also reflected in DOM.\n\t *\t\t//

\n\t *\t\tview.items.add( child );\n\t *\n\t * @returns {module:ui/viewcollection~ViewCollection} A new collection of view instances.\n\t */\n\tcreateCollection() {\n\t\tconst collection = new ViewCollection();\n\n\t\tthis._viewCollections.add( collection );\n\n\t\treturn collection;\n\t}\n\n\t/**\n\t * Registers a new child view under the view instance. Once registered, a child\n\t * view is managed by its parent, including {@link #init initization}\n\t * and {@link #destroy destruction}.\n\t *\n\t * To revert this, use {@link #removeChildren}.\n\t *\n\t *\t\tclass SampleView extends View {\n\t *\t\t\tconstructor( locale ) {\n\t *\t\t\t\tsuper( locale );\n\t *\n\t *\t\t\t\tthis.childA = new SomeChildView( locale );\n\t *\t\t\t\tthis.childB = new SomeChildView( locale );\n\t *\n\t *\t\t\t\tthis.template = new Template( { tag: 'p' } );\n\t *\n\t *\t\t\t\t// Register the children.\n\t *\t\t\t\tthis.addChildren( [ this.childA, this.childB ] );\n\t *\t\t\t}\n\t *\n\t *\t\t\tinit() {\n\t *\t\t\t\tthis.element.appendChild( this.childA.element );\n\t *\t\t\t\tthis.element.appendChild( this.childB.element );\n\t *\n\t *\t\t\t\treturn super.init();\n\t *\t\t\t}\n\t *\t\t}\n\t *\n\t *\t\tconst view = new SampleView( locale );\n\t *\n\t *\t\tview.init();\n\t *\n\t *\t\t// Will append

.\n\t *\t\tdocument.body.appendChild( view.element );\n\t *\n\t * **Note**: There's no need to add child views if they're already referenced in the\n\t * {@link #template}:\n\t *\n\t *\t\tclass SampleView extends View {\n\t *\t\t\tconstructor( locale ) {\n\t *\t\t\t\tsuper( locale );\n\t *\n\t *\t\t\t\tthis.childA = new SomeChildView( locale );\n\t *\t\t\t\tthis.childB = new SomeChildView( locale );\n\t *\n\t *\t\t\t\tthis.template = new Template( {\n\t *\t\t\t\t\ttag: 'p',\n\t *\n \t *\t\t\t\t\t// These children will be added automatically. There's no\n \t *\t\t\t\t\t// need to call {@link #addChildren} for any of them.\n\t *\t\t\t\t\tchildren: [ this.childA, this.childB ]\n\t *\t\t\t\t} );\n\t *\t\t\t}\n\t *\n\t *\t\t\t// ...\n\t *\t\t}\n\t *\n\t * @param {module:ui/view~View|Iterable.} children Children views to be registered.\n\t */\n\taddChildren( children ) {\n\t\tif ( !isIterable( children ) ) {\n\t\t\tchildren = [ children ];\n\t\t}\n\n\t\tchildren.map( c => this._unboundChildren.add( c ) );\n\t}\n\n\t/**\n\t * The opposite of {@link #addChildren}. Removes a child view from this view instance.\n\t * Once removed, the child is no longer managed by its parent, e.g. it can safely\n\t * become a child of another parent view.\n\t *\n\t * @see #addChildren\n\t * @param {module:ui/view~View|Iterable.} children Child views to be removed.\n\t */\n\tremoveChildren( children ) {\n\t\tif ( !isIterable( children ) ) {\n\t\t\tchildren = [ children ];\n\t\t}\n\n\t\tchildren.map( c => this._unboundChildren.remove( c ) );\n\t}\n\n\t/**\n\t * Initializes the view and its children added by {@link #addChildren} and residing in collections\n\t * created by the {@link #createCollection} method.\n\t *\n\t * In general, `init()` is the right place to keep the code which refers to the {@link #element}\n\t * and should be executed at the very beginning of the view's life cycle. It is possible to\n\t * {@link module:ui/template~Template.extend} the {@link #template} before the first reference of\n\t * the {@link #element}. To allow an early customization of the view (e.g. by its parent),\n\t * such references should be done in `init()`.\n\t *\n\t *\t\tclass SampleView extends View {\n\t *\t\t\tconstructor() {\n\t *\t\t\t\tthis.template = new Template( {\n\t *\t\t\t\t\t// ...\n\t *\t\t\t\t} );\n\t *\t\t\t},\n\t *\n\t *\t\t\tinit() {\n\t *\t\t\t\tsuper.init();\n\t *\n\t *\t\t\t\tfunction scroll() {\n\t *\t\t\t\t\t// A reference to #element would render the #template and make it non-extendable.\n\t *\t\t\t\t\tif ( window.scrollY > 0 ) {\n\t *\t\t\t\t\t\tthis.element.scrollLeft = 100;\n\t *\t\t\t\t\t} else {\n\t *\t\t\t\t\t\tthis.element.scrollLeft = 0;\n\t *\t\t\t\t\t}\n\t *\t\t\t\t}\n\t *\n\t *\t\t\t\tthis.listenTo( window, 'scroll', () => {\n\t *\t\t\t\t\tscroll();\n\t *\t\t\t\t} );\n\t *\t\t\t}\n\t *\t\t}\n\t *\n\t *\t\tconst view = new SampleView();\n\t *\n\t *\t\tTemplate.extend( view.template, {\n\t *\t\t\tattributes: {\n\t *\t\t\t\tclass: [\n\t *\t\t\t\t\t'additional-class'\n\t *\t\t\t\t]\n\t *\t\t\t}\n\t *\t\t} );\n\t *\n\t *\t\t// Late initialization allows customization of the view.\n\t *\t\tview.init();\n\t *\n\t * Once initialized, the view becomes {@link #ready}.\n\t */\n\tinit() {\n\t\tif ( this.ready ) {\n\t\t\t/**\n\t\t\t * This View has already been initialized.\n\t\t\t *\n\t\t\t * @error ui-view-init-reinit\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'ui-view-init-reinit: This View has already been initialized.' );\n\t\t}\n\n\t\t// Initialize collections in #_viewCollections.\n\t\tthis._viewCollections.map( c => c.init() );\n\n\t\t// Spread the word that this view is ready!\n\t\tthis.ready = true;\n\t}\n\n\t/**\n\t * Recursively destroys the view instance and child views added by {@link #addChildren} and\n\t * residing in collections created by the {@link #createCollection}.\n\t *\n\t * Destruction disables all event listeners:\n\t * * created on the view, e.g. `view.on( 'event', () => {} )`,\n\t * * defined in the {@link #template} for DOM events.\n\t */\n\tdestroy() {\n\t\tthis.stopListening();\n\n\t\tthis._viewCollections.map( c => c.destroy() );\n\t}\n\n\t/**\n\t * Recursively traverses {@link #template} in search of {@link module:ui/view~View}\n\t * instances and automatically registers them using {@link #addChildren} method.\n\t *\n\t * @protected\n\t */\n\t_addTemplateChildren() {\n\t\tconst search = def => {\n\t\t\tif ( def.children ) {\n\t\t\t\tfor ( const defOrView of def.children ) {\n\t\t\t\t\tif ( defOrView instanceof View ) {\n\t\t\t\t\t\tthis.addChildren( defOrView );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsearch( defOrView );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tsearch( this.template );\n\t}\n}\n\nmix( View, DomEmitterMixin );\nmix( View, ObservableMixin );\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-ui/src/view.js\n// module id = 7\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module utils/emittermixin\n */\n\nimport EventInfo from './eventinfo';\nimport uid from './uid';\nimport priorities from './priorities';\n\nconst _listeningTo = Symbol( 'listeningTo' );\nconst _emitterId = Symbol( 'emitterId' );\n\n/**\n * Mixin that injects the events API into its host.\n *\n * @mixin EmitterMixin\n * @implements module:utils/emittermixin~Emitter\n */\nconst EmitterMixin = {\n\t/**\n\t * Registers a callback function to be executed when an event is fired.\n\t *\n\t * Events can be grouped in namespaces using `:`.\n\t * When namespaced event is fired, it additionaly fires all callbacks for that namespace.\n\t *\n\t *\t\tmyEmitter.on( 'myGroup', genericCallback );\n\t *\t\tmyEmitter.on( 'myGroup:myEvent', specificCallback );\n\t *\n\t *\t\t// genericCallback is fired.\n\t *\t\tmyEmitter.fire( 'myGroup' );\n\t *\t\t// both genericCallback and specificCallback are fired.\n\t *\t\tmyEmitter.fire( 'myGroup:myEvent' );\n\t *\t\t// genericCallback is fired even though there are no callbacks for \"foo\".\n\t *\t\tmyEmitter.fire( 'myGroup:foo' );\n\t *\n\t * An event callback can {@link module:utils/eventinfo~EventInfo#stop stop the event} and\n\t * set the {@link module:utils/eventinfo~EventInfo#return return value} of the {@link #fire} method.\n\t *\n\t * @method #on\n\t * @param {String} event The name of the event.\n\t * @param {Function} callback The function to be called on event.\n\t * @param {Object} [options={}] Additional options.\n\t * @param {module:utils/priorities~PriorityString|Number} [options.priority='normal'] The priority of this event callback. The higher\n\t * the priority value the sooner the callback will be fired. Events having the same priority are called in the\n\t * order they were added.\n\t * @param {Object} [options.context] The object that represents `this` in the callback. Defaults to the object firing the event.\n\t */\n\ton( event, callback, options = {} ) {\n\t\tcreateEventNamespace( this, event );\n\t\tconst lists = getCallbacksListsForNamespace( this, event );\n\t\tconst priority = priorities.get( options.priority );\n\n\t\tcallback = {\n\t\t\tcallback,\n\t\t\tcontext: options.context || this,\n\t\t\tpriority\n\t\t};\n\n\t\t// Add the callback to all callbacks list.\n\t\tfor ( const callbacks of lists ) {\n\t\t\t// Add the callback to the list in the right priority position.\n\t\t\tlet added = false;\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i++ ) {\n\t\t\t\tif ( callbacks[ i ].priority < priority ) {\n\t\t\t\t\tcallbacks.splice( i, 0, callback );\n\t\t\t\t\tadded = true;\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add at the end, if right place was not found.\n\t\t\tif ( !added ) {\n\t\t\t\tcallbacks.push( callback );\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Registers a callback function to be executed on the next time the event is fired only. This is similar to\n\t * calling {@link #on} followed by {@link #off} in the callback.\n\t *\n\t * @method #once\n\t * @param {String} event The name of the event.\n\t * @param {Function} callback The function to be called on event.\n\t * @param {Object} [options={}] Additional options.\n\t * @param {module:utils/priorities~PriorityString|Number} [options.priority='normal'] The priority of this event callback. The higher\n\t * the priority value the sooner the callback will be fired. Events having the same priority are called in the\n\t * order they were added.\n\t * @param {Object} [options.context] The object that represents `this` in the callback. Defaults to the object firing the event.\n\t */\n\tonce( event, callback, options ) {\n\t\tconst onceCallback = function( event, ...args ) {\n\t\t\t// Go off() at the first call.\n\t\t\tevent.off();\n\n\t\t\t// Go with the original callback.\n\t\t\tcallback.call( this, event, ...args );\n\t\t};\n\n\t\t// Make a similar on() call, simply replacing the callback.\n\t\tthis.on( event, onceCallback, options );\n\t},\n\n\t/**\n\t * Stops executing the callback on the given event.\n\t *\n\t * @method #off\n\t * @param {String} event The name of the event.\n\t * @param {Function} callback The function to stop being called.\n\t * @param {Object} [context] The context object to be removed, pared with the given callback. To handle cases where\n\t * the same callback is used several times with different contexts.\n\t */\n\toff( event, callback, context ) {\n\t\tconst lists = getCallbacksListsForNamespace( this, event );\n\n\t\tfor ( const callbacks of lists ) {\n\t\t\tfor ( let i = 0; i < callbacks.length; i++ ) {\n\t\t\t\tif ( callbacks[ i ].callback == callback ) {\n\t\t\t\t\tif ( !context || context == callbacks[ i ].context ) {\n\t\t\t\t\t\t// Remove the callback from the list (fixing the next index).\n\t\t\t\t\t\tcallbacks.splice( i, 1 );\n\t\t\t\t\t\ti--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Registers a callback function to be executed when an event is fired in a specific (emitter) object.\n\t *\n\t * @method #listenTo\n\t * @param {module:utils/emittermixin~Emitter} emitter The object that fires the event.\n\t * @param {String} event The name of the event.\n\t * @param {Function} callback The function to be called on event.\n\t * @param {Object} [options={}] Additional options.\n\t * @param {module:utils/priorities~PriorityString|Number} [options.priority='normal'] The priority of this event callback. The higher\n\t * the priority value the sooner the callback will be fired. Events having the same priority are called in the\n\t * order they were added.\n\t * @param {Object} [options.context] The object that represents `this` in the callback. Defaults to the object firing the event.\n\t */\n\tlistenTo( emitter, event, callback, options ) {\n\t\tlet emitterInfo, eventCallbacks;\n\n\t\t// _listeningTo contains a list of emitters that this object is listening to.\n\t\t// This list has the following format:\n\t\t//\n\t\t// _listeningTo: {\n\t\t// emitterId: {\n\t\t// emitter: emitter,\n\t\t// callbacks: {\n\t\t// event1: [ callback1, callback2, ... ]\n\t\t// ....\n\t\t// }\n\t\t// },\n\t\t// ...\n\t\t// }\n\n\t\tif ( !this[ _listeningTo ] ) {\n\t\t\tthis[ _listeningTo ] = {};\n\t\t}\n\n\t\tconst emitters = this[ _listeningTo ];\n\n\t\tif ( !_getEmitterId( emitter ) ) {\n\t\t\t_setEmitterId( emitter );\n\t\t}\n\n\t\tconst emitterId = _getEmitterId( emitter );\n\n\t\tif ( !( emitterInfo = emitters[ emitterId ] ) ) {\n\t\t\temitterInfo = emitters[ emitterId ] = {\n\t\t\t\temitter,\n\t\t\t\tcallbacks: {}\n\t\t\t};\n\t\t}\n\n\t\tif ( !( eventCallbacks = emitterInfo.callbacks[ event ] ) ) {\n\t\t\teventCallbacks = emitterInfo.callbacks[ event ] = [];\n\t\t}\n\n\t\teventCallbacks.push( callback );\n\n\t\t// Finally register the callback to the event.\n\t\temitter.on( event, callback, options );\n\t},\n\n\t/**\n\t * Stops listening for events. It can be used at different levels:\n\t *\n\t * * To stop listening to a specific callback.\n\t * * To stop listening to a specific event.\n\t * * To stop listening to all events fired by a specific object.\n\t * * To stop listening to all events fired by all object.\n\t *\n\t * @method #stopListening\n\t * @param {module:utils/emittermixin~Emitter} [emitter] The object to stop listening to. If omitted, stops it for all objects.\n\t * @param {String} [event] (Requires the `emitter`) The name of the event to stop listening to. If omitted, stops it\n\t * for all events from `emitter`.\n\t * @param {Function} [callback] (Requires the `event`) The function to be removed from the call list for the given\n\t * `event`.\n\t */\n\tstopListening( emitter, event, callback ) {\n\t\tconst emitters = this[ _listeningTo ];\n\t\tlet emitterId = emitter && _getEmitterId( emitter );\n\t\tconst emitterInfo = emitters && emitterId && emitters[ emitterId ];\n\t\tconst eventCallbacks = emitterInfo && event && emitterInfo.callbacks[ event ];\n\n\t\t// Stop if nothing has been listened.\n\t\tif ( !emitters || ( emitter && !emitterInfo ) || ( event && !eventCallbacks ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// All params provided. off() that single callback.\n\t\tif ( callback ) {\n\t\t\temitter.off( event, callback );\n\t\t}\n\t\t// Only `emitter` and `event` provided. off() all callbacks for that event.\n\t\telse if ( eventCallbacks ) {\n\t\t\twhile ( ( callback = eventCallbacks.pop() ) ) {\n\t\t\t\temitter.off( event, callback );\n\t\t\t}\n\t\t\tdelete emitterInfo.callbacks[ event ];\n\t\t}\n\t\t// Only `emitter` provided. off() all events for that emitter.\n\t\telse if ( emitterInfo ) {\n\t\t\tfor ( event in emitterInfo.callbacks ) {\n\t\t\t\tthis.stopListening( emitter, event );\n\t\t\t}\n\t\t\tdelete emitters[ emitterId ];\n\t\t}\n\t\t// No params provided. off() all emitters.\n\t\telse {\n\t\t\tfor ( emitterId in emitters ) {\n\t\t\t\tthis.stopListening( emitters[ emitterId ].emitter );\n\t\t\t}\n\t\t\tdelete this[ _listeningTo ];\n\t\t}\n\t},\n\n\t/**\n\t * Fires an event, executing all callbacks registered for it.\n\t *\n\t * The first parameter passed to callbacks is an {@link module:utils/eventinfo~EventInfo} object,\n\t * followed by the optional `args` provided in the `fire()` method call.\n\t *\n\t * @method #fire\n\t * @param {String|module:utils/eventinfo~EventInfo} eventOrInfo The name of the event or `EventInfo` object if event is delegated.\n\t * @param {...*} [args] Additional arguments to be passed to the callbacks.\n\t * @returns {*} By default the method returns `undefined`. However, the return value can be changed by listeners\n\t * through modification of the {@link module:utils/eventinfo~EventInfo#return}'s value (the event info\n\t * is the first param of every callback).\n\t */\n\tfire( eventOrInfo, ...args ) {\n\t\tconst eventInfo = eventOrInfo instanceof EventInfo ? eventOrInfo : new EventInfo( this, eventOrInfo );\n\t\tconst event = eventInfo.name;\n\t\tlet callbacks = getCallbacksForEvent( this, event );\n\n\t\t// Record that the event passed this emitter on its path.\n\t\teventInfo.path.push( this );\n\n\t\t// Handle event listener callbacks first.\n\t\tif ( callbacks ) {\n\t\t\t// Arguments passed to each callback.\n\t\t\tconst callbackArgs = [ eventInfo, ...args ];\n\n\t\t\t// Copying callbacks array is the easiest and most secure way of preventing infinite loops, when event callbacks\n\t\t\t// are added while processing other callbacks. Previous solution involved adding counters (unique ids) but\n\t\t\t// failed if callbacks were added to the queue before currently processed callback.\n\t\t\t// If this proves to be too inefficient, another method is to change `.on()` so callbacks are stored if same\n\t\t\t// event is currently processed. Then, `.fire()` at the end, would have to add all stored events.\n\t\t\tcallbacks = Array.from( callbacks );\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i++ ) {\n\t\t\t\tcallbacks[ i ].callback.apply( callbacks[ i ].context, callbackArgs );\n\n\t\t\t\t// Remove the callback from future requests if off() has been called.\n\t\t\t\tif ( eventInfo.off.called ) {\n\t\t\t\t\t// Remove the called mark for the next calls.\n\t\t\t\t\tdelete eventInfo.off.called;\n\n\t\t\t\t\tthis.off( event, callbacks[ i ].callback, callbacks[ i ].context );\n\t\t\t\t}\n\n\t\t\t\t// Do not execute next callbacks if stop() was called.\n\t\t\t\tif ( eventInfo.stop.called ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Delegate event to other emitters if needed.\n\t\tif ( this._delegations ) {\n\t\t\tconst destinations = this._delegations.get( event );\n\t\t\tconst passAllDestinations = this._delegations.get( '*' );\n\n\t\t\tif ( destinations ) {\n\t\t\t\tfireDelegatedEvents( destinations, eventInfo, args );\n\t\t\t}\n\n\t\t\tif ( passAllDestinations ) {\n\t\t\t\tfireDelegatedEvents( passAllDestinations, eventInfo, args );\n\t\t\t}\n\t\t}\n\n\t\treturn eventInfo.return;\n\t},\n\n\t/**\n\t * Delegates selected events to another {@link module:utils/emittermixin~Emitter}. For instance:\n\t *\n\t *\t\temitterA.delegate( 'eventX' ).to( emitterB );\n\t *\t\temitterA.delegate( 'eventX', 'eventY' ).to( emitterC );\n\t *\n\t * then `eventX` is delegated (fired by) `emitterB` and `emitterC` along with `data`:\n\t *\n\t *\t\temitterA.fire( 'eventX', data );\n\t *\n\t * and `eventY` is delegated (fired by) `emitterC` along with `data`:\n\t *\n\t *\t\temitterA.fire( 'eventY', data );\n\t *\n\t * @method #delegate\n\t * @param {...String} events Event names that will be delegated to another emitter.\n\t * @returns {module:utils/emittermixin~EmitterMixinDelegateChain}\n\t */\n\tdelegate( ...events ) {\n\t\treturn {\n\t\t\tto: ( emitter, nameOrFunction ) => {\n\t\t\t\tif ( !this._delegations ) {\n\t\t\t\t\tthis._delegations = new Map();\n\t\t\t\t}\n\n\t\t\t\tfor ( const eventName of events ) {\n\t\t\t\t\tconst destinations = this._delegations.get( eventName );\n\n\t\t\t\t\tif ( !destinations ) {\n\t\t\t\t\t\tthis._delegations.set( eventName, new Map( [ [ emitter, nameOrFunction ] ] ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdestinations.set( emitter, nameOrFunction );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t},\n\n\t/**\n\t * Stops delegating events. It can be used at different levels:\n\t *\n\t * * To stop delegating all events.\n\t * * To stop delegating a specific event to all emitters.\n\t * * To stop delegating a specific event to a specific emitter.\n\t *\n\t * @method #stopDelegating\n\t * @param {String} [event] The name of the event to stop delegating. If omitted, stops it all delegations.\n\t * @param {module:utils/emittermixin~Emitter} [emitter] (requires `event`) The object to stop delegating a particular event to.\n\t * If omitted, stops delegation of `event` to all emitters.\n\t */\n\tstopDelegating( event, emitter ) {\n\t\tif ( !this._delegations ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !event ) {\n\t\t\tthis._delegations.clear();\n\t\t} else if ( !emitter ) {\n\t\t\tthis._delegations.delete( event );\n\t\t} else {\n\t\t\tconst destinations = this._delegations.get( event );\n\n\t\t\tif ( destinations ) {\n\t\t\t\tdestinations.delete( emitter );\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport default EmitterMixin;\n\n/**\n * Checks if `listeningEmitter` listens to an emitter with given `listenedToEmitterId` and if so, returns that emitter.\n * If not, returns `null`.\n *\n * @protected\n * @param {module:utils/emittermixin~EmitterMixin} listeningEmitter Emitter that listens.\n * @param {String} listenedToEmitterId Unique emitter id of emitter listened to.\n * @returns {module:utils/emittermixin~EmitterMixin|null}\n */\nexport function _getEmitterListenedTo( listeningEmitter, listenedToEmitterId ) {\n\tif ( listeningEmitter[ _listeningTo ] && listeningEmitter[ _listeningTo ][ listenedToEmitterId ] ) {\n\t\treturn listeningEmitter[ _listeningTo ][ listenedToEmitterId ].emitter;\n\t}\n\n\treturn null;\n}\n\n/**\n * Sets emitter's unique id.\n *\n * **Note:** `_emitterId` can be set only once.\n *\n * @protected\n * @param {module:utils/emittermixin~EmitterMixin} emitter Emitter for which id will be set.\n * @param {String} [id] Unique id to set. If not passed, random unique id will be set.\n */\nexport function _setEmitterId( emitter, id ) {\n\tif ( !emitter[ _emitterId ] ) {\n\t\temitter[ _emitterId ] = id || uid();\n\t}\n}\n\n/**\n * Returns emitter's unique id.\n *\n * @protected\n * @param {module:utils/emittermixin~EmitterMixin} emitter Emitter which id will be returned.\n */\nexport function _getEmitterId( emitter ) {\n\treturn emitter[ _emitterId ];\n}\n\n// Gets the internal `_events` property of the given object.\n// `_events` property store all lists with callbacks for registered event names.\n// If there were no events registered on the object, empty `_events` object is created.\nfunction getEvents( source ) {\n\tif ( !source._events ) {\n\t\tObject.defineProperty( source, '_events', {\n\t\t\tvalue: {}\n\t\t} );\n\t}\n\n\treturn source._events;\n}\n\n// Creates event node for generic-specific events relation architecture.\nfunction makeEventNode() {\n\treturn {\n\t\tcallbacks: [],\n\t\tchildEvents: []\n\t};\n}\n\n// Creates an architecture for generic-specific events relation.\n// If needed, creates all events for given eventName, i.e. if the first registered event\n// is foo:bar:abc, it will create foo:bar:abc, foo:bar and foo event and tie them together.\n// It also copies callbacks from more generic events to more specific events when\n// specific events are created.\nfunction createEventNamespace( source, eventName ) {\n\tconst events = getEvents( source );\n\n\t// First, check if the event we want to add to the structure already exists.\n\tif ( events[ eventName ] ) {\n\t\t// If it exists, we don't have to do anything.\n\t\treturn;\n\t}\n\n\t// In other case, we have to create the structure for the event.\n\t// Note, that we might need to create intermediate events too.\n\t// I.e. if foo:bar:abc is being registered and we only have foo in the structure,\n\t// we need to also register foo:bar.\n\n\t// Currently processed event name.\n\tlet name = eventName;\n\t// Name of the event that is a child event for currently processed event.\n\tlet childEventName = null;\n\n\t// Array containing all newly created specific events.\n\tconst newEventNodes = [];\n\n\t// While loop can't check for ':' index because we have to handle generic events too.\n\t// In each loop, we truncate event name, going from the most specific name to the generic one.\n\t// I.e. foo:bar:abc -> foo:bar -> foo.\n\twhile ( name !== '' ) {\n\t\tif ( events[ name ] ) {\n\t\t\t// If the currently processed event name is already registered, we can be sure\n\t\t\t// that it already has all the structure created, so we can break the loop here\n\t\t\t// as no more events need to be registered.\n\t\t\tbreak;\n\t\t}\n\n\t\t// If this event is not yet registered, create a new object for it.\n\t\tevents[ name ] = makeEventNode();\n\t\t// Add it to the array with newly created events.\n\t\tnewEventNodes.push( events[ name ] );\n\n\t\t// Add previously processed event name as a child of this event.\n\t\tif ( childEventName ) {\n\t\t\tevents[ name ].childEvents.push( childEventName );\n\t\t}\n\n\t\tchildEventName = name;\n\t\t// If `.lastIndexOf()` returns -1, `.substr()` will return '' which will break the loop.\n\t\tname = name.substr( 0, name.lastIndexOf( ':' ) );\n\t}\n\n\tif ( name !== '' ) {\n\t\t// If name is not empty, we found an already registered event that was a parent of the\n\t\t// event we wanted to register.\n\n\t\t// Copy that event's callbacks to newly registered events.\n\t\tfor ( const node of newEventNodes ) {\n\t\t\tnode.callbacks = events[ name ].callbacks.slice();\n\t\t}\n\n\t\t// Add last newly created event to the already registered event.\n\t\tevents[ name ].childEvents.push( childEventName );\n\t}\n}\n\n// Gets an array containing callbacks list for a given event and it's more specific events.\n// I.e. if given event is foo:bar and there is also foo:bar:abc event registered, this will\n// return callback list of foo:bar and foo:bar:abc (but not foo).\n// Returns empty array if given event has not been yet registered.\nfunction getCallbacksListsForNamespace( source, eventName ) {\n\tconst eventNode = getEvents( source )[ eventName ];\n\n\tif ( !eventNode ) {\n\t\treturn [];\n\t}\n\n\tlet callbacksLists = [ eventNode.callbacks ];\n\n\tfor ( let i = 0; i < eventNode.childEvents.length; i++ ) {\n\t\tconst childCallbacksLists = getCallbacksListsForNamespace( source, eventNode.childEvents[ i ] );\n\n\t\tcallbacksLists = callbacksLists.concat( childCallbacksLists );\n\t}\n\n\treturn callbacksLists;\n}\n\n// Get the list of callbacks for a given event, but only if there any callbacks have been registered.\n// If there are no callbacks registered for given event, it checks if this is a specific event and looks\n// for callbacks for it's more generic version.\nfunction getCallbacksForEvent( source, eventName ) {\n\tlet event;\n\n\tif ( !source._events || !( event = source._events[ eventName ] ) || !event.callbacks.length ) {\n\t\t// There are no callbacks registered for specified eventName.\n\t\t// But this could be a specific-type event that is in a namespace.\n\t\tif ( eventName.indexOf( ':' ) > -1 ) {\n\t\t\t// If the eventName is specific, try to find callback lists for more generic event.\n\t\t\treturn getCallbacksForEvent( source, eventName.substr( 0, eventName.lastIndexOf( ':' ) ) );\n\t\t} else {\n\t\t\t// If this is a top-level generic event, return null;\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn event.callbacks;\n}\n\n// Fires delegated events for given map of destinations.\n//\n// @private\n// * @param {Map.} destinations A map containing `[ {@link utils.Emitter}, \"event name\" ]` pair destinations.\n// * @param {utils.EventInfo} eventInfo The original event info object.\n// * @param {Array.<*>} fireArgs Arguments the original event was fired with.\nfunction fireDelegatedEvents( destinations, eventInfo, fireArgs ) {\n\tfor ( let [ emitter, name ] of destinations ) {\n\t\tif ( !name ) {\n\t\t\tname = eventInfo.name;\n\t\t} else if ( typeof name == 'function' ) {\n\t\t\tname = name( eventInfo.name );\n\t\t}\n\n\t\tconst delegatedInfo = new EventInfo( eventInfo.source, name );\n\n\t\tdelegatedInfo.path = [ ...eventInfo.path ];\n\n\t\temitter.fire( delegatedInfo, ...fireArgs );\n\t}\n}\n\n/**\n * Interface representing classes which mix in {@link module:utils/emittermixin~EmitterMixin}.\n *\n * @interface Emitter\n */\n\n/**\n * The return value of {@link ~EmitterMixin#delegate}.\n *\n * @interface module:utils/emittermixin~EmitterMixinDelegateChain\n */\n\n/**\n * Selects destination for {@link module:utils/emittermixin~EmitterMixin#delegate} events.\n *\n * @method #to\n * @param {module:utils/emittermixin~Emitter} emitter An `EmitterMixin` instance which is the destination for delegated events.\n * @param {String|Function} nameOrFunction A custom event name or function which converts the original name string.\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/emittermixin.js\n// module id = 8\n// module chunks = 0","import baseMatches from './_baseMatches';\nimport baseMatchesProperty from './_baseMatchesProperty';\nimport identity from './identity';\nimport isArray from './isArray';\nimport property from './property';\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nexport default baseIteratee;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/_baseIteratee.js\n// module id = 10\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module core/command\n */\n\nimport ObservableMixin from '@ckeditor/ckeditor5-utils/src/observablemixin';\nimport mix from '@ckeditor/ckeditor5-utils/src/mix';\n\n/**\n * The base class for CKEditor commands.\n *\n * Commands are the main way to manipulate editor contents and state. They are mostly used by UI elements (or by other\n * commands) to make changes in the model. Commands are available in every part of code that has access to\n * the {@link module:core/editor/editor~Editor editor} instance.\n *\n * Instances of registered commands can be retrieved from {@link module:core/editor/editor~Editor#commands}.\n * The easiest way to execute a command is through {@link module:core/editor/editor~Editor#execute}.\n *\n * By default commands are disabled when the editor is in {@link module:core/editor/editor~Editor#isReadOnly read-only} mode.\n *\n * @mixes module:utils/observablemixin~ObservableMixin\n */\nexport default class Command {\n\t/**\n\t * Creates a new `Command` instance.\n\t *\n\t * @param {module:core/editor/editor~Editor} editor Editor on which this command will be used.\n\t */\n\tconstructor( editor ) {\n\t\t/**\n\t\t * The editor on which this command will be used.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:core/editor/editor~Editor}\n\t\t */\n\t\tthis.editor = editor;\n\n\t\t/**\n\t\t * The value of a command. Concrete command class should define what it represents.\n\t\t *\n\t\t * For example, the `bold` command's value is whether the selection starts in a bolded text.\n\t\t * And the value of the `link` command may be an object with links details.\n\t\t *\n\t\t * It's possible for a command to have no value (e.g. for stateless actions such as `uploadImage`).\n\t\t *\n\t\t * @observable\n\t\t * @readonly\n\t\t * @member #value\n\t\t */\n\t\tthis.set( 'value', undefined );\n\n\t\t/**\n\t\t * Flag indicating whether a command is enabled or disabled.\n\t\t * A disabled command should do nothing when executed.\n\t\t *\n\t\t * @observable\n\t\t * @readonly\n\t\t * @member {Boolean} #isEnabled\n\t\t */\n\t\tthis.set( 'isEnabled', false );\n\n\t\tthis.decorate( 'execute' );\n\n\t\t// By default every command is refreshed when changes are applied to the model.\n\t\tthis.listenTo( this.editor.document, 'changesDone', () => {\n\t\t\tthis.refresh();\n\t\t} );\n\n\t\tthis.on( 'execute', evt => {\n\t\t\tif ( !this.isEnabled ) {\n\t\t\t\tevt.stop();\n\t\t\t}\n\t\t}, { priority: 'high' } );\n\n\t\t// By default commands are disabled when the editor is in read-only mode.\n\t\tthis.listenTo( editor, 'change:isReadOnly', ( evt, name, value ) => {\n\t\t\tif ( value ) {\n\t\t\t\t// See a ticket about overriding observable properties\n\t\t\t\t// https://github.com/ckeditor/ckeditor5-utils/issues/171.\n\t\t\t\tthis.on( 'change:isEnabled', forceDisable, { priority: 'lowest' } );\n\t\t\t\tthis.isEnabled = false;\n\t\t\t} else {\n\t\t\t\tthis.off( 'change:isEnabled', forceDisable );\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t} );\n\n\t\tfunction forceDisable() {\n\t\t\tthis.isEnabled = false;\n\t\t}\n\t}\n\n\t/**\n\t * Refreshes the command. The command should update its {@link #isEnabled} and {@link #value} property\n\t * in this method.\n\t *\n\t * This method is automatically called when\n\t * {@link module:engine/model/document~Document#event:changesDone any changes are applied to the model}.\n\t */\n\trefresh() {\n\t\tthis.isEnabled = true;\n\t}\n\n\t/**\n\t * Executes the command.\n\t *\n\t * A command may accept parameters. They will be passed from {@link module:core/editor/editor~Editor#execute}\n\t * to the command.\n\t *\n\t * The `execute()` method will automatically abort when the command is disabled ({@link #isEnabled} is `false`).\n\t * This behavior is implemented by a high priority listener to the {@link #event:execute} event.\n\t *\n\t * @fires execute\n\t */\n\texecute() {}\n\n\t/**\n\t * Destroys the command.\n\t */\n\tdestroy() {\n\t\tthis.stopListening();\n\t}\n\n\t/**\n\t * Event fired by the {@link #execute} method. The command action is a listener to this event so it's\n\t * possible to change/cancel the behavior of the command by listening to this event.\n\t *\n\t * See {@link module:utils/observablemixin~ObservableMixin.decorate} for more information and samples.\n\t *\n\t * **Note:** This event is fired even if command is disabled. However, it is automatically blocked\n\t * by a high priority listener in order to prevent command execution.\n\t *\n\t * @event execute\n\t */\n}\n\nmix( Command, ObservableMixin );\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-core/src/command.js\n// module id = 11\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module utils/observablemixin\n */\n\nimport EmitterMixin from './emittermixin';\nimport CKEditorError from './ckeditorerror';\nimport extend from './lib/lodash/extend';\nimport isObject from './lib/lodash/isObject';\n\nconst attributesSymbol = Symbol( 'attributes' );\nconst boundObservablesSymbol = Symbol( 'boundObservables' );\nconst boundAttributesSymbol = Symbol( 'boundAttributes' );\n\n/**\n * Mixin that injects the \"observable attributes\" and data binding functionality.\n * Used mainly in the {@link module:ui/model~Model} class.\n *\n * @mixin ObservableMixin\n * @mixes module:utils/emittermixin~EmitterMixin\n * @implements module:utils/observablemixin~Observable\n */\nconst ObservableMixin = {\n\t/**\n\t * Creates and sets the value of an observable attribute of this object. Such an attribute becomes a part\n\t * of the state and is be observable.\n\t *\n\t * It accepts also a single object literal containing key/value pairs with attributes to be set.\n\t *\n\t * This method throws the observable-set-cannot-override error if the observable instance already\n\t * have a property with a given attribute name. This prevents from mistakenly overriding existing\n\t * properties and methods, but means that `foo.set( 'bar', 1 )` may be slightly slower than `foo.bar = 1`.\n\t *\n\t * @method #set\n\t * @param {String} name The attributes name.\n\t * @param {*} value The attributes value.\n\t */\n\tset( name, value ) {\n\t\t// If the first parameter is an Object, iterate over its properties.\n\t\tif ( isObject( name ) ) {\n\t\t\tObject.keys( name ).forEach( attr => {\n\t\t\t\tthis.set( attr, name[ attr ] );\n\t\t\t}, this );\n\n\t\t\treturn;\n\t\t}\n\n\t\tinitObservable( this );\n\n\t\tconst attributes = this[ attributesSymbol ];\n\n\t\tif ( ( name in this ) && !attributes.has( name ) ) {\n\t\t\t/**\n\t\t\t * Cannot override an existing property.\n\t\t\t *\n\t\t\t * This error is thrown when trying to {@link ~Observable#set set} an attribute with\n\t\t\t * a name of an already existing property. For example:\n\t\t\t *\n\t\t\t *\t\tlet observable = new Model();\n\t\t\t *\t\tobservable.property = 1;\n\t\t\t *\t\tobservable.set( 'property', 2 );\t\t// throws\n\t\t\t *\n\t\t\t *\t\tobservable.set( 'attr', 1 );\n\t\t\t *\t\tobservable.set( 'attr', 2 );\t\t\t// ok, because this is an existing attribute.\n\t\t\t *\n\t\t\t * @error observable-set-cannot-override\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'observable-set-cannot-override: Cannot override an existing property.' );\n\t\t}\n\n\t\tObject.defineProperty( this, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget() {\n\t\t\t\treturn attributes.get( name );\n\t\t\t},\n\n\t\t\tset( value ) {\n\t\t\t\tconst oldValue = attributes.get( name );\n\n\t\t\t\t// Allow undefined as an initial value like A.define( 'x', undefined ) (#132).\n\t\t\t\t// Note: When attributes map has no such own property, then its value is undefined.\n\t\t\t\tif ( oldValue !== value || !attributes.has( name ) ) {\n\t\t\t\t\tattributes.set( name, value );\n\t\t\t\t\tthis.fire( 'change:' + name, name, value, oldValue );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tthis[ name ] = value;\n\t},\n\n\t/**\n\t * Binds observable attributes to another objects implementing {@link ~ObservableMixin}\n\t * interface (like {@link module:ui/model~Model}).\n\t *\n\t * Once bound, the observable will immediately share the current state of attributes\n\t * of the observable it is bound to and react to the changes to these attributes\n\t * in the future.\n\t *\n\t * **Note**: To release the binding use {@link module:utils/observablemixin~ObservableMixin#unbind}.\n\t *\n\t *\t\tA.bind( 'a' ).to( B );\n\t *\t\tA.bind( 'a' ).to( B, 'b' );\n\t *\t\tA.bind( 'a', 'b' ).to( B, 'c', 'd' );\n\t *\t\tA.bind( 'a' ).to( B, 'b', C, 'd', ( b, d ) => b + d );\n\t *\n\t * @method #bind\n\t * @param {...String} bindAttrs Observable attributes that will be bound to another observable(s).\n\t * @returns {module:utils/observablemixin~BindChain}\n\t */\n\tbind( ...bindAttrs ) {\n\t\tif ( !bindAttrs.length || !isStringArray( bindAttrs ) ) {\n\t\t\t/**\n\t\t\t * All attributes must be strings.\n\t\t\t *\n\t\t\t * @error observable-bind-wrong-attrs\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'observable-bind-wrong-attrs: All attributes must be strings.' );\n\t\t}\n\n\t\tif ( ( new Set( bindAttrs ) ).size !== bindAttrs.length ) {\n\t\t\t/**\n\t\t\t * Attributes must be unique.\n\t\t\t *\n\t\t\t * @error observable-bind-duplicate-attrs\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'observable-bind-duplicate-attrs: Attributes must be unique.' );\n\t\t}\n\n\t\tinitObservable( this );\n\n\t\tconst boundAttributes = this[ boundAttributesSymbol ];\n\n\t\tbindAttrs.forEach( attrName => {\n\t\t\tif ( boundAttributes.has( attrName ) ) {\n\t\t\t\t/**\n\t\t\t\t * Cannot bind the same attribute more that once.\n\t\t\t\t *\n\t\t\t\t * @error observable-bind-rebind\n\t\t\t\t */\n\t\t\t\tthrow new CKEditorError( 'observable-bind-rebind: Cannot bind the same attribute more that once.' );\n\t\t\t}\n\t\t} );\n\n\t\tconst bindings = new Map();\n\n\t\t/**\n\t\t * @typedef Binding\n\t\t * @type Object\n\t\t * @property {Array} attr Attribute which is bound.\n\t\t * @property {Array} to Array of observable–attribute components of the binding (`{ observable: ..., attr: .. }`).\n\t\t * @property {Array} callback A function which processes `to` components.\n\t\t */\n\t\tbindAttrs.forEach( a => {\n\t\t\tconst binding = { attr: a, to: [] };\n\n\t\t\tboundAttributes.set( a, binding );\n\t\t\tbindings.set( a, binding );\n\t\t} );\n\n\t\t/**\n\t\t * @typedef BindChain\n\t\t * @type Object\n\t\t * @property {Function} to See {@link ~ObservableMixin#_bindTo}.\n\t\t * @property {module:utils/observablemixin~Observable} _observable The observable which initializes the binding.\n\t\t * @property {Array} _bindAttrs Array of `_observable` attributes to be bound.\n\t\t * @property {Array} _to Array of `to()` observable–attributes (`{ observable: toObservable, attrs: ...toAttrs }`).\n\t\t * @property {Map} _bindings Stores bindings to be kept in\n\t\t * {@link ~ObservableMixin#_boundAttributes}/{@link ~ObservableMixin#_boundObservables}\n\t\t * initiated in this binding chain.\n\t\t */\n\t\treturn {\n\t\t\tto: bindTo,\n\n\t\t\t_observable: this,\n\t\t\t_bindAttrs: bindAttrs,\n\t\t\t_to: [],\n\t\t\t_bindings: bindings\n\t\t};\n\t},\n\n\t/**\n\t * Removes the binding created with {@link ~ObservableMixin#bind}.\n\t *\n\t *\t\tA.unbind( 'a' );\n\t *\t\tA.unbind();\n\t *\n\t * @method #unbind\n\t * @param {...String} [unbindAttrs] Observable attributes to be unbound. All the bindings will\n\t * be released if no attributes provided.\n\t */\n\tunbind( ...unbindAttrs ) {\n\t\t// Nothing to do here if not inited yet.\n\t\tif ( !( attributesSymbol in this ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst boundAttributes = this[ boundAttributesSymbol ];\n\t\tconst boundObservables = this[ boundObservablesSymbol ];\n\n\t\tif ( unbindAttrs.length ) {\n\t\t\tif ( !isStringArray( unbindAttrs ) ) {\n\t\t\t\t/**\n\t\t\t\t * Attributes must be strings.\n\t\t\t\t *\n\t\t\t\t * @error observable-unbind-wrong-attrs\n\t\t\t\t */\n\t\t\t\tthrow new CKEditorError( 'observable-unbind-wrong-attrs: Attributes must be strings.' );\n\t\t\t}\n\n\t\t\tunbindAttrs.forEach( attrName => {\n\t\t\t\tconst binding = boundAttributes.get( attrName );\n\t\t\t\tlet toObservable, toAttr, toAttrs, toAttrBindings;\n\n\t\t\t\tbinding.to.forEach( to => {\n\t\t\t\t\t// TODO: ES6 destructuring.\n\t\t\t\t\ttoObservable = to[ 0 ];\n\t\t\t\t\ttoAttr = to[ 1 ];\n\t\t\t\t\ttoAttrs = boundObservables.get( toObservable );\n\t\t\t\t\ttoAttrBindings = toAttrs[ toAttr ];\n\n\t\t\t\t\ttoAttrBindings.delete( binding );\n\n\t\t\t\t\tif ( !toAttrBindings.size ) {\n\t\t\t\t\t\tdelete toAttrs[ toAttr ];\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !Object.keys( toAttrs ).length ) {\n\t\t\t\t\t\tboundObservables.delete( toObservable );\n\t\t\t\t\t\tthis.stopListening( toObservable, 'change' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tboundAttributes.delete( attrName );\n\t\t\t} );\n\t\t} else {\n\t\t\tboundObservables.forEach( ( bindings, boundObservable ) => {\n\t\t\t\tthis.stopListening( boundObservable, 'change' );\n\t\t\t} );\n\n\t\t\tboundObservables.clear();\n\t\t\tboundAttributes.clear();\n\t\t}\n\t},\n\n\t/**\n\t * Turns the given methods of this object into event-based ones. This means that the new method will fire an event\n\t * (named after the method) and the original action will be plugged as a listener to that event.\n\t *\n\t * This is a very simplified method decoration. Itself it doesn't change the behavior of a method (expect adding the event),\n\t * but it allows to modify it later on by listening to the method's event.\n\t *\n\t * For example, in order to cancel the method execution one can stop the event:\n\t *\n\t *\t\tclass Foo {\n\t *\t\t\tconstructor() {\n\t *\t\t\t\tthis.decorate( 'method' );\n\t *\t\t\t}\n\t *\n\t *\t\t\tmethod() {\n\t *\t\t\t\tconsole.log( 'called!' );\n\t *\t\t\t}\n\t *\t\t}\n\t *\n\t *\t\tconst foo = new Foo();\n\t *\t\tfoo.on( 'method', ( evt ) => {\n\t *\t\t\tevt.stop();\n\t *\t\t}, { priority: 'high' } );\n\t *\n\t *\t\tfoo.method(); // Nothing is logged.\n\t *\n\t *\n\t * Note: we used a high priority listener here to execute this callback before the one which\n\t * calls the orignal method (which used the default priority).\n\t *\n\t * It's also possible to change the return value:\n\t *\n\t *\t\tfoo.on( 'method', ( evt ) => {\n\t *\t\t\tevt.return = 'Foo!';\n\t *\t\t} );\n\t *\n\t *\t\tfoo.method(); // -> 'Foo'\n\t *\n\t * Finally, it's possible to access and modify the parameters:\n\t *\n\t *\t\tmethod( a, b ) {\n\t *\t\t\tconsole.log( `${ a }, ${ b }` );\n\t *\t\t}\n\t *\n\t *\t\t// ...\n\t *\n\t *\t\tfoo.on( 'method', ( evt, args ) => {\n\t *\t\t\targs[ 0 ] = 3;\n\t *\n\t *\t\t\tconsole.log( args[ 1 ] ); // -> 2\n\t *\t\t}, { priority: 'high' } );\n\t *\n\t *\t\tfoo.method( 1, 2 ); // -> '3, 2'\n\t *\n\t * @method #decorate\n\t * @param {String} methodName Name of the method to decorate.\n\t */\n\tdecorate( methodName ) {\n\t\tconst originalMethod = this[ methodName ];\n\n\t\tif ( !originalMethod ) {\n\t\t\t/**\n\t\t\t * Cannot decorate an undefined method.\n\t\t\t *\n\t\t\t * @error observablemixin-cannot-decorate-undefined\n\t\t\t * @param {Object} object The object which method should be decorated.\n\t\t\t * @param {String} methodName Name of the method which does not exist.\n\t\t\t */\n\t\t\tthrow new CKEditorError(\n\t\t\t\t'observablemixin-cannot-decorate-undefined: Cannot decorate an undefined method.',\n\t\t\t\t{ object: this, methodName }\n\t\t\t);\n\t\t}\n\n\t\tthis.on( methodName, ( evt, args ) => {\n\t\t\tevt.return = originalMethod.apply( this, args );\n\t\t} );\n\n\t\tthis[ methodName ] = function( ...args ) {\n\t\t\treturn this.fire( methodName, args );\n\t\t};\n\t}\n\n\t/**\n\t * @private\n\t * @member ~ObservableMixin#_boundAttributes\n\t */\n\n\t/**\n\t * @private\n\t * @member ~ObservableMixin#_boundObservables\n\t */\n\n\t/**\n\t * @private\n\t * @member ~ObservableMixin#_bindTo\n\t */\n};\n\nexport default ObservableMixin;\n\n// Init symbol properties needed to for the observable mechanism to work.\n//\n// @private\n// @param {module:utils/observablemixin~ObservableMixin} observable\nfunction initObservable( observable ) {\n\t// Do nothing if already inited.\n\tif ( attributesSymbol in observable ) {\n\t\treturn;\n\t}\n\n\t// The internal hash containing the observable's state.\n\t//\n\t// @private\n\t// @type {Map}\n\tObject.defineProperty( observable, attributesSymbol, {\n\t\tvalue: new Map()\n\t} );\n\n\t// Map containing bindings to external observables. It shares the binding objects\n\t// (`{ observable: A, attr: 'a', to: ... }`) with {@link module:utils/observablemixin~ObservableMixin#_boundAttributes} and\n\t// it is used to observe external observables to update own attributes accordingly.\n\t// See {@link module:utils/observablemixin~ObservableMixin#bind}.\n\t//\n\t//\t\tA.bind( 'a', 'b', 'c' ).to( B, 'x', 'y', 'x' );\n\t//\t\tconsole.log( A._boundObservables );\n\t//\n\t//\t\t\tMap( {\n\t//\t\t\t\tB: {\n\t//\t\t\t\t\tx: Set( [\n\t//\t\t\t\t\t\t{ observable: A, attr: 'a', to: [ [ B, 'x' ] ] },\n\t//\t\t\t\t\t\t{ observable: A, attr: 'c', to: [ [ B, 'x' ] ] }\n\t//\t\t\t\t\t] ),\n\t//\t\t\t\t\ty: Set( [\n\t//\t\t\t\t\t\t{ observable: A, attr: 'b', to: [ [ B, 'y' ] ] },\n\t//\t\t\t\t\t] )\n\t//\t\t\t\t}\n\t//\t\t\t} )\n\t//\n\t//\t\tA.bind( 'd' ).to( B, 'z' ).to( C, 'w' ).as( callback );\n\t//\t\tconsole.log( A._boundObservables );\n\t//\n\t//\t\t\tMap( {\n\t//\t\t\t\tB: {\n\t//\t\t\t\t\tx: Set( [\n\t//\t\t\t\t\t\t{ observable: A, attr: 'a', to: [ [ B, 'x' ] ] },\n\t//\t\t\t\t\t\t{ observable: A, attr: 'c', to: [ [ B, 'x' ] ] }\n\t//\t\t\t\t\t] ),\n\t//\t\t\t\t\ty: Set( [\n\t//\t\t\t\t\t\t{ observable: A, attr: 'b', to: [ [ B, 'y' ] ] },\n\t//\t\t\t\t\t] ),\n\t//\t\t\t\t\tz: Set( [\n\t//\t\t\t\t\t\t{ observable: A, attr: 'd', to: [ [ B, 'z' ], [ C, 'w' ] ], callback: callback }\n\t//\t\t\t\t\t] )\n\t//\t\t\t\t},\n\t//\t\t\t\tC: {\n\t//\t\t\t\t\tw: Set( [\n\t//\t\t\t\t\t\t{ observable: A, attr: 'd', to: [ [ B, 'z' ], [ C, 'w' ] ], callback: callback }\n\t//\t\t\t\t\t] )\n\t//\t\t\t\t}\n\t//\t\t\t} )\n\t//\n\t// @private\n\t// @type {Map}\n\tObject.defineProperty( observable, boundObservablesSymbol, {\n\t\tvalue: new Map()\n\t} );\n\n\t// Object that stores which attributes of this observable are bound and how. It shares\n\t// the binding objects (`{ observable: A, attr: 'a', to: ... }`) with {@link utils.ObservableMixin#_boundObservables}.\n\t// This data structure is a reverse of {@link utils.ObservableMixin#_boundObservables} and it is helpful for\n\t// {@link utils.ObservableMixin#unbind}.\n\t//\n\t// See {@link utils.ObservableMixin#bind}.\n\t//\n\t//\t\tA.bind( 'a', 'b', 'c' ).to( B, 'x', 'y', 'x' );\n\t//\t\tconsole.log( A._boundAttributes );\n\t//\n\t//\t\t\tMap( {\n\t//\t\t\t\ta: { observable: A, attr: 'a', to: [ [ B, 'x' ] ] },\n\t//\t\t\t\tb: { observable: A, attr: 'b', to: [ [ B, 'y' ] ] },\n\t//\t\t\t\tc: { observable: A, attr: 'c', to: [ [ B, 'x' ] ] }\n\t//\t\t\t} )\n\t//\n\t//\t\tA.bind( 'd' ).to( B, 'z' ).to( C, 'w' ).as( callback );\n\t//\t\tconsole.log( A._boundAttributes );\n\t//\n\t//\t\t\tMap( {\n\t//\t\t\t\ta: { observable: A, attr: 'a', to: [ [ B, 'x' ] ] },\n\t//\t\t\t\tb: { observable: A, attr: 'b', to: [ [ B, 'y' ] ] },\n\t//\t\t\t\tc: { observable: A, attr: 'c', to: [ [ B, 'x' ] ] },\n\t//\t\t\t\td: { observable: A, attr: 'd', to: [ [ B, 'z' ], [ C, 'w' ] ], callback: callback }\n\t//\t\t\t} )\n\t//\n\t// @private\n\t// @type {Map}\n\tObject.defineProperty( observable, boundAttributesSymbol, {\n\t\tvalue: new Map()\n\t} );\n}\n\n// A chaining for {@link module:utils/observablemixin~ObservableMixin#bind} providing `.to()` interface.\n//\n// @private\n// @param {...[Observable|String|Function]} args Arguments of the `.to( args )` binding.\nfunction bindTo( ...args ) {\n\tconst parsedArgs = parseBindToArgs( ...args );\n\tconst bindingsKeys = Array.from( this._bindings.keys() );\n\tconst numberOfBindings = bindingsKeys.length;\n\n\t// Eliminate A.bind( 'x' ).to( B, C )\n\tif ( !parsedArgs.callback && parsedArgs.to.length > 1 ) {\n\t\t/**\n\t\t * Binding multiple observables only possible with callback.\n\t\t *\n\t\t * @error observable-bind-no-callback\n\t\t */\n\t\tthrow new CKEditorError( 'observable-bind-to-no-callback: Binding multiple observables only possible with callback.' );\n\t}\n\n\t// Eliminate A.bind( 'x', 'y' ).to( B, callback )\n\tif ( numberOfBindings > 1 && parsedArgs.callback ) {\n\t\t/**\n\t\t * Cannot bind multiple attributes and use a callback in one binding.\n\t\t *\n\t\t * @error observable-bind-to-extra-callback\n\t\t */\n\t\tthrow new CKEditorError( 'observable-bind-to-extra-callback: Cannot bind multiple attributes and use a callback in one binding.' );\n\t}\n\n\tparsedArgs.to.forEach( to => {\n\t\t// Eliminate A.bind( 'x', 'y' ).to( B, 'a' )\n\t\tif ( to.attrs.length && to.attrs.length !== numberOfBindings ) {\n\t\t\t/**\n\t\t\t * The number of attributes must match.\n\t\t\t *\n\t\t\t * @error observable-bind-to-attrs-length\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'observable-bind-to-attrs-length: The number of attributes must match.' );\n\t\t}\n\n\t\t// When no to.attrs specified, observing source attributes instead i.e.\n\t\t// A.bind( 'x', 'y' ).to( B ) -> Observe B.x and B.y\n\t\tif ( !to.attrs.length ) {\n\t\t\tto.attrs = this._bindAttrs;\n\t\t}\n\t} );\n\n\tthis._to = parsedArgs.to;\n\n\t// Fill {@link BindChain#_bindings} with callback. When the callback is set there's only one binding.\n\tif ( parsedArgs.callback ) {\n\t\tthis._bindings.get( bindingsKeys[ 0 ] ).callback = parsedArgs.callback;\n\t}\n\n\tattachBindToListeners( this._observable, this._to );\n\n\t// Update observable._boundAttributes and observable._boundObservables.\n\tupdateBindToBound( this );\n\n\t// Set initial values of bound attributes.\n\tthis._bindAttrs.forEach( attrName => {\n\t\tupdateBoundObservableAttr( this._observable, attrName );\n\t} );\n}\n\n// Check if all entries of the array are of `String` type.\n//\n// @private\n// @param {Array} arr An array to be checked.\n// @returns {Boolean}\nfunction isStringArray( arr ) {\n\treturn arr.every( a => typeof a == 'string' );\n}\n\n// Parses and validates {@link Observable#bind}`.to( args )` arguments and returns\n// an object with a parsed structure. For example\n//\n//\t\tA.bind( 'x' ).to( B, 'a', C, 'b', call );\n//\n// becomes\n//\n//\t\t{\n//\t\t\tto: [\n//\t\t\t\t{ observable: B, attrs: [ 'a' ] },\n//\t\t\t\t{ observable: C, attrs: [ 'b' ] },\n//\t\t\t],\n//\t\t\tcallback: call\n// \t\t}\n//\n// @private\n// @param {...*} args Arguments of {@link Observable#bind}`.to( args )`.\n// @returns {Object}\nfunction parseBindToArgs( ...args ) {\n\t// Eliminate A.bind( 'x' ).to()\n\tif ( !args.length ) {\n\t\t/**\n\t\t * Invalid argument syntax in `to()`.\n\t\t *\n\t\t * @error observable-bind-to-parse-error\n\t\t */\n\t\tthrow new CKEditorError( 'observable-bind-to-parse-error: Invalid argument syntax in `to()`.' );\n\t}\n\n\tconst parsed = { to: [] };\n\tlet lastObservable;\n\n\tif ( typeof args[ args.length - 1 ] == 'function' ) {\n\t\tparsed.callback = args.pop();\n\t}\n\n\targs.forEach( a => {\n\t\tif ( typeof a == 'string' ) {\n\t\t\tlastObservable.attrs.push( a );\n\t\t} else if ( typeof a == 'object' ) {\n\t\t\tlastObservable = { observable: a, attrs: [] };\n\t\t\tparsed.to.push( lastObservable );\n\t\t} else {\n\t\t\tthrow new CKEditorError( 'observable-bind-to-parse-error: Invalid argument syntax in `to()`.' );\n\t\t}\n\t} );\n\n\treturn parsed;\n}\n\n// Synchronizes {@link module:utils/observablemixin#_boundObservables} with {@link Binding}.\n//\n// @private\n// @param {Binding} binding A binding to store in {@link Observable#_boundObservables}.\n// @param {Observable} toObservable A observable, which is a new component of `binding`.\n// @param {String} toAttrName A name of `toObservable`'s attribute, a new component of the `binding`.\nfunction updateBoundObservables( observable, binding, toObservable, toAttrName ) {\n\tconst boundObservables = observable[ boundObservablesSymbol ];\n\tconst bindingsToObservable = boundObservables.get( toObservable );\n\tconst bindings = bindingsToObservable || {};\n\n\tif ( !bindings[ toAttrName ] ) {\n\t\tbindings[ toAttrName ] = new Set();\n\t}\n\n\t// Pass the binding to a corresponding Set in `observable._boundObservables`.\n\tbindings[ toAttrName ].add( binding );\n\n\tif ( !bindingsToObservable ) {\n\t\tboundObservables.set( toObservable, bindings );\n\t}\n}\n\n// Synchronizes {@link Observable#_boundAttributes} and {@link Observable#_boundObservables}\n// with {@link BindChain}.\n//\n// Assuming the following binding being created\n//\n// \t\tA.bind( 'a', 'b' ).to( B, 'x', 'y' );\n//\n// the following bindings were initialized by {@link Observable#bind} in {@link BindChain#_bindings}:\n//\n// \t\t{\n// \t\t\ta: { observable: A, attr: 'a', to: [] },\n// \t\t\tb: { observable: A, attr: 'b', to: [] },\n// \t\t}\n//\n// Iterate over all bindings in this chain and fill their `to` properties with\n// corresponding to( ... ) arguments (components of the binding), so\n//\n// \t\t{\n// \t\t\ta: { observable: A, attr: 'a', to: [ B, 'x' ] },\n// \t\t\tb: { observable: A, attr: 'b', to: [ B, 'y' ] },\n// \t\t}\n//\n// Then update the structure of {@link Observable#_boundObservables} with updated\n// binding, so it becomes:\n//\n// \t\tMap( {\n// \t\t\tB: {\n// \t\t\t\tx: Set( [\n// \t\t\t\t\t{ observable: A, attr: 'a', to: [ [ B, 'x' ] ] }\n// \t\t\t\t] ),\n// \t\t\t\ty: Set( [\n// \t\t\t\t\t{ observable: A, attr: 'b', to: [ [ B, 'y' ] ] },\n// \t\t\t\t] )\n//\t\t\t}\n// \t\t} )\n//\n// @private\n// @param {BindChain} chain The binding initialized by {@link Observable#bind}.\nfunction updateBindToBound( chain ) {\n\tlet toAttr;\n\n\tchain._bindings.forEach( ( binding, attrName ) => {\n\t\t// Note: For a binding without a callback, this will run only once\n\t\t// like in A.bind( 'x', 'y' ).to( B, 'a', 'b' )\n\t\t// TODO: ES6 destructuring.\n\t\tchain._to.forEach( to => {\n\t\t\ttoAttr = to.attrs[ binding.callback ? 0 : chain._bindAttrs.indexOf( attrName ) ];\n\n\t\t\tbinding.to.push( [ to.observable, toAttr ] );\n\t\t\tupdateBoundObservables( chain._observable, binding, to.observable, toAttr );\n\t\t} );\n\t} );\n}\n\n// Updates an attribute of a {@link Observable} with a value\n// determined by an entry in {@link Observable#_boundAttributes}.\n//\n// @private\n// @param {Observable} observable A observable which attribute is to be updated.\n// @param {String} attrName An attribute to be updated.\nfunction updateBoundObservableAttr( observable, attrName ) {\n\tconst boundAttributes = observable[ boundAttributesSymbol ];\n\tconst binding = boundAttributes.get( attrName );\n\tlet attrValue;\n\n\t// When a binding with callback is created like\n\t//\n\t// \t\tA.bind( 'a' ).to( B, 'b', C, 'c', callback );\n\t//\n\t// collect B.b and C.c, then pass them to callback to set A.a.\n\tif ( binding.callback ) {\n\t\tattrValue = binding.callback.apply( observable, binding.to.map( to => to[ 0 ][ to[ 1 ] ] ) );\n\t} else {\n\t\tattrValue = binding.to[ 0 ];\n\t\tattrValue = attrValue[ 0 ][ attrValue[ 1 ] ];\n\t}\n\n\tif ( observable.hasOwnProperty( attrName ) ) {\n\t\tobservable[ attrName ] = attrValue;\n\t} else {\n\t\tobservable.set( attrName, attrValue );\n\t}\n}\n\n// Starts listening to changes in {@link BindChain._to} observables to update\n// {@link BindChain._observable} {@link BindChain._bindAttrs}. Also sets the\n// initial state of {@link BindChain._observable}.\n//\n// @private\n// @param {BindChain} chain The chain initialized by {@link Observable#bind}.\nfunction attachBindToListeners( observable, toBindings ) {\n\ttoBindings.forEach( to => {\n\t\tconst boundObservables = observable[ boundObservablesSymbol ];\n\t\tlet bindings;\n\n\t\t// If there's already a chain between the observables (`observable` listens to\n\t\t// `to.observable`), there's no need to create another `change` event listener.\n\t\tif ( !boundObservables.get( to.observable ) ) {\n\t\t\tobservable.listenTo( to.observable, 'change', ( evt, attrName ) => {\n\t\t\t\tbindings = boundObservables.get( to.observable )[ attrName ];\n\n\t\t\t\t// Note: to.observable will fire for any attribute change, react\n\t\t\t\t// to changes of attributes which are bound only.\n\t\t\t\tif ( bindings ) {\n\t\t\t\t\tbindings.forEach( binding => {\n\t\t\t\t\t\tupdateBoundObservableAttr( observable, binding.attr );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t} );\n}\n\nextend( ObservableMixin, EmitterMixin );\n\n/**\n * Fired when an attribute changed value.\n *\n *\t\tobservable.set( 'prop', 1 );\n *\n *\t\tobservable.on( 'change:prop', ( evt, propertyName, newValue, oldValue ) => {\n *\t\t\tconsole.log( `${ propertyName } has changed from ${ oldValue } to ${ newValue }` );\n *\t\t} )\n *\n *\t\tobservable.prop = 2; // -> 'prop has changed from 1 to 2'\n *\n * @event module:utils/observablemixin~ObservableMixin#change:{attribute}\n * @param {String} name The attribute name.\n * @param {*} value The new attribute value.\n * @param {*} oldValue The previous attribute value.\n */\n\n/**\n * Interface representing classes which mix in {@link module:utils/observablemixin~ObservableMixin}.\n *\n * @interface Observable\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/observablemixin.js\n// module id = 12\n// module chunks = 0","import toFinite from './toFinite';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This function is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/toInteger.js\n// module id = 13\n// module chunks = 0","import isArrayLike from './isArrayLike';\nimport isObjectLike from './isObjectLike';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/isArrayLikeObject.js\n// module id = 14\n// module chunks = 0","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @type {Function}\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n * else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/isArray.js\n// module id = 15\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/* global console */\n\n/**\n * @module utils/log\n */\n\nimport { attachLinkToDocumentation } from './ckeditorerror';\n\n/**\n * The logging module.\n *\n * This object features two functions that should be used across CKEditor code base to log errors and warnings.\n * Despite being an overridable interface for native `console.*` this module serves also the goal to limit the\n * code size of a minified CKEditor package. During minification process the messages will be shortened and\n * links to their documentation will be logged to the console.\n *\n * All errors and warning should be documented in the following way:\n *\n *\t\t/**\n *\t\t * Error thrown when a plugin cannot be loaded due to JavaScript errors, lack of plugins with a given name, etc.\n *\t\t *\n *\t\t * @error plugin-load\n *\t\t * @param pluginName The name of the plugin that could not be loaded.\n *\t\t * @param moduleName The name of the module which tried to load this plugin.\n *\t\t * /\n *\t\tlog.error( 'plugin-load: It was not possible to load the \"{$pluginName}\" plugin in module \"{$moduleName}', {\n *\t\t\tpluginName: 'foo',\n *\t\t\tmoduleName: 'bar'\n *\t\t} );\n *\n * ### Warning vs Error vs Throw\n *\n * * Whenever a potentially incorrect situation occurs, which does not directly lead to an incorrect behavior,\n * log a warning.\n * * Whenever an incorrect situation occurs, but the app may continue working (although perhaps incorrectly),\n * log an error.\n * * Whenever it's really bad and it does not make sense to continue working, throw a {@link module:utils/ckeditorerror~CKEditorError}.\n *\n * @namespace\n */\nconst log = {\n\t/**\n\t * Logs an error to the console.\n\t *\n\t * Read more about error logging in the {@link module:utils/log} module.\n\t *\n\t * @param {String} message The error message in an `error-name: Error message.` format.\n\t * During the minification process the \"Error message\" part will be removed to limit the code size\n\t * and a link to this error documentation will be logged to the console.\n\t * @param {Object} [data] Additional data describing the error.\n\t */\n\terror( message, data ) {\n\t\tconsole.error( attachLinkToDocumentation( message ), data );\n\t},\n\n\t/**\n\t * Logs a warning to the console.\n\t *\n\t * Read more about error logging in the {@link module:utils/log} module.\n\t *\n\t * @param {String} message The warning message in a `warning-name: Warning message.` format.\n\t * During the minification process the \"Warning message\" part will be removed to limit the code size\n\t * and a link to this error documentation will be logged to the console.\n\t * @param {Object} [data] Additional data describing the warning.\n\t */\n\twarn( message, data ) {\n\t\tconsole.warn( attachLinkToDocumentation( message ), data );\n\t}\n};\n\nexport default log;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/log.js\n// module id = 16\n// module chunks = 0","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/isObject.js\n// module id = 17\n// module chunks = 0","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array ? array.length : 0;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/last.js\n// module id = 18\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/delta/deltafactory\n */\n\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\n\nimport OperationFactory from '../operation/operationfactory';\n\nconst deserializers = new Map();\n\n/**\n * A factory class for creating operations.\n *\n * Delta is a single, from the user action point of view, change in the editable document, like insert, split or\n * rename element. Delta is composed of operations, which are unit changes needed to be done to execute user action.\n *\n * Multiple deltas are grouped into a single {@link module:engine/model/batch~Batch}.\n */\nexport default class DeltaFactory {\n\t/**\n\t * Creates InsertDelta from deserialized object, i.e. from parsed JSON string.\n\t *\n\t * @param {Object} json\n\t * @param {module:engine/model/document~Document} doc Document on which this delta will be applied.\n\t * @returns {module:engine/model/delta/insertdelta~InsertDelta}\n\t */\n\tstatic fromJSON( json, doc ) {\n\t\tif ( !deserializers.has( json.__className ) ) {\n\t\t\t/**\n\t\t\t * This delta has no defined deserializer.\n\t\t\t *\n\t\t\t * @error delta-fromjson-no-deserializer\n\t\t\t * @param {String} name\n\t\t\t */\n\t\t\tthrow new CKEditorError(\n\t\t\t\t'delta-fromjson-no-deserializer: This delta has no defined deserializer',\n\t\t\t\t{ name: json.__className }\n\t\t\t);\n\t\t}\n\n\t\tconst Delta = deserializers.get( json.__className );\n\n\t\tconst delta = new Delta();\n\n\t\tfor ( const operation of json.operations ) {\n\t\t\tdelta.addOperation( OperationFactory.fromJSON( operation, doc ) );\n\t\t}\n\n\t\t// Rewrite all other properties.\n\t\tfor ( const prop in json ) {\n\t\t\tif ( prop != '__className' && delta[ prop ] === undefined ) {\n\t\t\t\tdelta[ prop ] = json[ prop ];\n\t\t\t}\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Registers a class for delta factory.\n\t *\n\t * @param {Function} Delta A delta class to register.\n\t */\n\tstatic register( Delta ) {\n\t\tdeserializers.set( Delta.className, Delta );\n\t}\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/delta/deltafactory.js\n// module id = 19\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/batch\n */\n\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\n\n/**\n * `Batch` instance groups document changes ({@link module:engine/model/delta/delta~Delta deltas}). All deltas grouped in a single `Batch`\n * can be reverted together, so you can think about `Batch` as of a single undo step. If you want to extend given undo step you\n * can call another method on the same `Batch` object. If you want to create a separate undo step you can create a new `Batch`.\n *\n * For example to create two separate undo steps you can call:\n *\n *\t\tdoc.batch().insert( firstPosition, 'foo' );\n *\t\tdoc.batch().insert( secondPosition, 'bar' );\n *\n * To create a single undo step:\n *\n *\t\tconst batch = doc.batch();\n *\t\tbatch.insert( firstPosition, 'foo' );\n *\t\tbatch.insert( secondPosition, 'bar' );\n *\n * Note that all document modification methods (insert, remove, split, etc.) are chainable so you can shorten code to:\n *\n *\t\tdoc.batch().insert( firstPosition, 'foo' ).insert( secondPosition, 'bar' );\n */\nexport default class Batch {\n\t/**\n\t * Creates `Batch` instance. Not recommended to use directly, use {@link module:engine/model/document~Document#batch} instead.\n\t *\n\t * @param {module:engine/model/document~Document} document Document which this Batch changes.\n\t * @param {'transparent'|'default'} [type='default'] Type of the batch.\n\t */\n\tconstructor( document, type = 'default' ) {\n\t\t/**\n\t\t * Document which this batch changes.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/model/document~Document} module:engine/model/batch~Batch#document\n\t\t */\n\t\tthis.document = document;\n\n\t\t/**\n\t\t * Array of deltas which compose this batch.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Array.} module:engine/model/batch~Batch#deltas\n\t\t */\n\t\tthis.deltas = [];\n\n\t\t/**\n\t\t * Type of the batch.\n\t\t *\n\t\t * Can be one of the following values:\n\t\t * * `'default'` - all \"normal\" batches, most commonly used type.\n\t\t * * `'transparent'` - batch that should be ignored by other features, i.e. initial batch or collaborative editing changes.\n\t\t *\n\t\t * @readonly\n\t\t * @member {'transparent'|'default'} module:engine/model/batch~Batch#type\n\t\t */\n\t\tthis.type = type;\n\t}\n\n\t/**\n\t * Returns this batch base version, which is equal to the base version of first delta in the batch.\n\t * If there are no deltas in the batch, it returns `null`.\n\t *\n\t * @readonly\n\t * @type {Number|null}\n\t */\n\tget baseVersion() {\n\t\treturn this.deltas.length > 0 ? this.deltas[ 0 ].baseVersion : null;\n\t}\n\n\t/**\n\t * Adds delta to the batch instance. All modification methods (insert, remove, split, etc.) use this method\n\t * to add created deltas.\n\t *\n\t * @param {module:engine/model/delta/delta~Delta} delta Delta to add.\n\t * @return {module:engine/model/delta/delta~Delta} Added delta.\n\t */\n\taddDelta( delta ) {\n\t\tdelta.batch = this;\n\t\tthis.deltas.push( delta );\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Gets an iterable collection of operations.\n\t *\n\t * @returns {Iterable.}\n\t */\n\t* getOperations() {\n\t\tfor ( const delta of this.deltas ) {\n\t\t\tyield* delta.operations;\n\t\t}\n\t}\n}\n\n/**\n * Function to register batch methods. To make code scalable `Batch` do not have modification\n * methods built in. They can be registered using this method.\n *\n * This method checks if there is no naming collision and throws `batch-register-taken` if the method name\n * is already taken.\n *\n * Besides that no magic happens here, the method is added to the `Batch` class prototype.\n *\n * For example:\n *\n *\t\tBatch.register( 'insert', function( position, nodes ) {\n *\t\t\t// You can use a class inheriting from `Delta` if that class should handle OT in a special way.\n *\t\t\tconst delta = new Delta();\n *\n *\t\t\t// Add delta to the Batch instance. It is important to add a delta to the batch before applying any operation.\n *\t\t\tthis.addDelta( delta );\n *\n *\t\t\t// Create operations which should be components of this delta.\n *\t\t\tconst operation = new InsertOperation( position, nodes, this.document.version );\n *\n *\t\t\t// Add operation to the delta. It is important to add operation before applying it.\n *\t\t\tdelta.addOperation( operation );\n *\n *\t\t\t// Remember to apply every operation, no magic, you need to do it manually.\n *\t\t\tthis.document.applyOperation( operation );\n *\n *\t\t\t// Make this method chainable.\n *\t\t\treturn this;\n *\t\t} );\n *\n * @method module:engine/model/batch~Batch.register\n * @param {String} name Method name.\n * @param {Function} creator Method body.\n */\nexport function register( name, creator ) {\n\tif ( Batch.prototype[ name ] ) {\n\t\t/**\n\t\t * This batch method name is already taken.\n\t\t *\n\t\t * @error batch-register-taken\n\t\t * @param {String} name\n\t\t */\n\t\tthrow new CKEditorError(\n\t\t\t'model-batch-register-taken: This batch method name is already taken.',\n\t\t\t{ name } );\n\t}\n\n\tBatch.prototype[ name ] = creator;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/batch.js\n// module id = 20\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module ui/button/buttonview\n */\n\nimport View from '../view';\nimport Template from '../template';\nimport IconView from '../icon/iconview';\nimport TooltipView from '../tooltip/tooltipview';\n\nimport { getEnvKeystrokeText } from '@ckeditor/ckeditor5-utils/src/keyboard';\n\n/**\n * The button view class.\n *\n *\t\tconst view = new ButtonView();\n *\n *\t\tview.set( {\n *\t\t\tlabel: 'A button',\n *\t\t\tkeystroke: 'Ctrl+B',\n *\t\t\ttooltip: true,\n *\t\t\twithText: true\n *\t\t} );\n *\n *\t\tview.init();\n *\n *\t\tdocument.body.append( view.element );\n *\n * @extends module:ui/view~View\n */\nexport default class ButtonView extends View {\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( locale ) {\n\t\tsuper( locale );\n\n\t\t/**\n\t\t * The label of the button view visible to the user when {@link #withText} is `true`.\n\t\t * It can also be used to create a {@link #tooltip}.\n\t\t *\n\t\t * @observable\n\t\t * @member {String} #label\n\t\t */\n\t\tthis.set( 'label' );\n\n\t\t/**\n\t\t * (Optional) The keystroke associated with the button, i.e. CTRL+B,\n\t\t * in the string format compatible with {@link module:utils/keyboard}.\n\t\t *\n\t\t * @observable\n\t\t * @member {Boolean} #keystroke\n\t\t */\n\t\tthis.set( 'keystroke' );\n\n\t\t/**\n\t\t * (Optional) Tooltip of the button, i.e. displayed when hovering the button with the mouse cursor.\n\t\t *\n\t\t * * If defined as a `Boolean` (e.g. `true`), then combination of `label` and `keystroke` will be set as a tooltip.\n\t\t * * If defined as a `String`, tooltip will equal the exact text of that `String`.\n\t\t * * If defined as a `Function`, `label` and `keystroke` will be passed to that function, which is to return\n\t\t * a string with the tooltip text.\n\t\t *\n\t\t *\t\tconst view = new ButtonView( locale );\n\t\t *\t\tview.tooltip = ( label, keystroke ) => `A tooltip for ${ label } and ${ keystroke }.`\n\t\t *\n\t\t * @observable\n\t\t * @default false\n\t\t * @member {Boolean|String|Function} #tooltip\n\t\t */\n\t\tthis.set( 'tooltip' );\n\n\t\t/**\n\t\t * (Optional) The position of the tooltip. See {@link module:ui/tooltip/tooltipview~TooltipView#position}\n\t\t * to learn more about the available position values.\n\t\t *\n\t\t * **Note:** It makes sense only when the {@link #tooltip `tooltip` attribute} is defined.\n\t\t *\n\t\t * @observable\n\t\t * @default 's'\n\t\t * @member {'s'|'n'} #position\n\t\t */\n\t\tthis.set( 'tooltipPosition', 's' );\n\n\t\t/**\n\t\t * The HTML type of the button. Default `button`.\n\t\t *\n\t\t * @observable\n\t\t * @member {'button'|'submit'|'reset'|'menu'} #type\n\t\t */\n\t\tthis.set( 'type', 'button' );\n\n\t\t/**\n\t\t * Controls whether the button view is \"on\". It makes sense when a feature it represents\n\t\t * is currently active, e.g. a bold button is \"on\" when the selection is in the bold text.\n\t\t *\n\t\t * To disable the button, use {@link #isEnabled} instead.\n\t\t *\n\t\t * @observable\n\t\t * @member {Boolean} #isOn\n\t\t */\n\t\tthis.set( 'isOn', false );\n\n\t\t/**\n\t\t * Controls whether the button view is enabled, i.e. it can be clicked and execute an action.\n\t\t *\n\t\t * To change the \"on\" state of the button, use {@link #isOn} instead.\n\t\t *\n\t\t * @observable\n\t\t * @member {Boolean} #isEnabled\n\t\t */\n\t\tthis.set( 'isEnabled', true );\n\n\t\t/**\n\t\t * Controls whether the button view is visible. Visible by default, buttons are hidden\n\t\t * using a CSS class.\n\t\t *\n\t\t * @observable\n\t\t * @member {Boolean} #isVisible\n\t\t */\n\t\tthis.set( 'isVisible', true );\n\n\t\t/**\n\t\t * (Optional) Controls whether the label of the button is hidden (e.g. an icon–only button).\n\t\t *\n\t\t * @observable\n\t\t * @member {Boolean} #withText\n\t\t */\n\t\tthis.set( 'withText', false );\n\n\t\t/**\n\t\t * (Optional) An XML {@link module:ui/icon/iconview~IconView#content content} of the icon.\n\t\t * When defined, an {@link #iconView} will be added to the button.\n\t\t *\n\t\t * @observable\n\t\t * @member {String} #icon\n\t\t */\n\t\tthis.set( 'icon' );\n\n\t\t/**\n\t\t * (Optional) Controls the `tabindex` HTML attribute of the button. By default, the button is focusable\n\t\t * but does not included in the Tab order.\n\t\t *\n\t\t * @observable\n\t\t * @default -1\n\t\t * @member {String} #tabindex\n\t\t */\n\t\tthis.set( 'tabindex', -1 );\n\n\t\t/**\n\t\t * Tooltip of the button bound to the template.\n\t\t *\n\t\t * @see #tooltip\n\t\t * @see #_getTooltipString\n\t\t * @private\n\t\t * @observable\n\t\t * @member {Boolean} #_tooltipString\n\t\t */\n\t\tthis.bind( '_tooltipString' ).to(\n\t\t\tthis, 'tooltip',\n\t\t\tthis, 'label',\n\t\t\tthis, 'keystroke',\n\t\t\tthis._getTooltipString.bind( this )\n\t\t);\n\n\t\t/**\n\t\t * Tooltip of the button view. It is configurable using the {@link #tooltip tooltip attribute}.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:ui/tooltip/tooltipview~TooltipView} #tooltipView\n\t\t */\n\t\tthis.tooltipView = this._createTooltipView();\n\n\t\t/**\n\t\t * (Optional) The icon view of the button. Only present when the {@link #icon icon attribute} is defined.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:ui/icon/iconview~IconView} #iconView\n\t\t */\n\n\t\tconst bind = this.bindTemplate;\n\n\t\tthis.template = new Template( {\n\t\t\ttag: 'button',\n\n\t\t\tattributes: {\n\t\t\t\tclass: [\n\t\t\t\t\t'ck-button',\n\t\t\t\t\tbind.to( 'isEnabled', value => value ? 'ck-enabled' : 'ck-disabled' ),\n\t\t\t\t\tbind.if( 'isVisible', 'ck-hidden', value => !value ),\n\t\t\t\t\tbind.to( 'isOn', value => value ? 'ck-on' : 'ck-off' ),\n\t\t\t\t\tbind.if( 'withText', 'ck-button_with-text' )\n\t\t\t\t],\n\t\t\t\ttype: bind.to( 'type', value => value ? value : 'button' ),\n\t\t\t\ttabindex: bind.to( 'tabindex' )\n\t\t\t},\n\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tclass: [ 'ck-button__label' ]\n\t\t\t\t\t},\n\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttext: bind.to( 'label' )\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\tthis.tooltipView\n\t\t\t],\n\n\t\t\ton: {\n\t\t\t\tmousedown: bind.to( evt => {\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t} ),\n\n\t\t\t\tclick: bind.to( evt => {\n\t\t\t\t\t// We can't make the button disabled using the disabled attribute, because it won't be focusable.\n\t\t\t\t\t// Though, shouldn't this condition be moved to the button controller?\n\t\t\t\t\tif ( this.isEnabled ) {\n\t\t\t\t\t\tthis.fire( 'execute' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Prevent the default when button is disabled, to block e.g.\n\t\t\t\t\t\t// automatic form submitting. See ckeditor/ckeditor5-link#74.\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Fired when the button view is clicked. It won't be fired when the button {@link #isEnabled}\n\t\t * is `false`.\n\t\t *\n\t\t * @event execute\n\t\t */\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tinit() {\n\t\tif ( this.icon ) {\n\t\t\tconst iconView = this.iconView = new IconView();\n\n\t\t\ticonView.bind( 'content' ).to( this, 'icon' );\n\t\t\tthis.element.insertBefore( iconView.element, this.element.firstChild );\n\n\t\t\t// Make sure the icon will be destroyed along with the button.\n\t\t\tthis.addChildren( iconView );\n\t\t}\n\n\t\tsuper.init();\n\t}\n\n\t/**\n\t * Focuses the {@link #element} of the button.\n\t */\n\tfocus() {\n\t\tthis.element.focus();\n\t}\n\n\t/**\n\t * Creates a {@link module:ui/tooltip/tooltipview~TooltipView} instance and binds it with button\n\t * attributes.\n\t *\n\t * @private\n\t * @returns {module:ui/tooltip/tooltipview~TooltipView}\n\t */\n\t_createTooltipView() {\n\t\tconst tooltipView = new TooltipView();\n\n\t\ttooltipView.bind( 'text' ).to( this, '_tooltipString' );\n\t\ttooltipView.bind( 'position' ).to( this, 'tooltipPosition' );\n\n\t\treturn tooltipView;\n\t}\n\n\t/**\n\t * Gets the text for the {@link #tooltipView} from the combination of\n\t * {@link #tooltip}, {@link #label} and {@link #keystroke} attributes.\n\t *\n\t * @private\n\t * @see #tooltip\n\t * @see #_tooltipString\n\t * @param {Boolean|String|Function} tooltip Button tooltip.\n\t * @param {String} label Button label.\n\t * @param {String} keystroke Button keystroke.\n\t * @returns {String}\n\t */\n\t_getTooltipString( tooltip, label, keystroke ) {\n\t\tif ( tooltip ) {\n\t\t\tif ( typeof tooltip == 'string' ) {\n\t\t\t\treturn tooltip;\n\t\t\t} else {\n\t\t\t\tif ( keystroke ) {\n\t\t\t\t\tkeystroke = getEnvKeystrokeText( keystroke );\n\t\t\t\t}\n\n\t\t\t\tif ( tooltip instanceof Function ) {\n\t\t\t\t\treturn tooltip( label, keystroke );\n\t\t\t\t} else {\n\t\t\t\t\treturn `${ label }${ keystroke ? ` (${ keystroke })` : '' }`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn '';\n\t}\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-ui/src/button/buttonview.js\n// module id = 21\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/view/position\n */\n\nimport TreeWalker from './treewalker';\n\nimport compareArrays from '@ckeditor/ckeditor5-utils/src/comparearrays';\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport EditableElement from './editableelement';\n\n/**\n * Position in the tree. Position is always located before or after a node.\n */\nexport default class Position {\n\t/**\n\t * Creates a position.\n\t *\n\t * @param {module:engine/view/node~Node|module:engine/view/documentfragment~DocumentFragment} parent Position parent.\n\t * @param {Number} offset Position offset.\n\t */\n\tconstructor( parent, offset ) {\n\t\t/**\n\t\t * Position parent.\n\t\t *\n\t\t * @member {module:engine/view/node~Node|module:engine/view/documentfragment~DocumentFragment}\n\t\t * module:engine/view/position~Position#parent\n\t\t */\n\t\tthis.parent = parent;\n\n\t\t/**\n\t\t * Position offset.\n\t\t *\n\t\t * @member {Number} module:engine/view/position~Position#offset\n\t\t */\n\t\tthis.offset = offset;\n\t}\n\n\t/**\n\t * Node directly after the position. Equals `null` when there is no node after position or position is located\n\t * inside text node.\n\t *\n\t * @readonly\n\t * @type {module:engine/view/node~Node|null}\n\t */\n\tget nodeAfter() {\n\t\tif ( this.parent.is( 'text' ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.parent.getChild( this.offset ) || null;\n\t}\n\n\t/**\n\t * Node directly before the position. Equals `null` when there is no node before position or position is located\n\t * inside text node.\n\t *\n\t * @readonly\n\t * @type {module:engine/view/node~Node|null}\n\t */\n\tget nodeBefore() {\n\t\tif ( this.parent.is( 'text' ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.parent.getChild( this.offset - 1 ) || null;\n\t}\n\n\t/**\n\t * Is `true` if position is at the beginning of its {@link module:engine/view/position~Position#parent parent}, `false` otherwise.\n\t *\n\t * @readonly\n\t * @type {Boolean}\n\t */\n\tget isAtStart() {\n\t\treturn this.offset === 0;\n\t}\n\n\t/**\n\t * Is `true` if position is at the end of its {@link module:engine/view/position~Position#parent parent}, `false` otherwise.\n\t *\n\t * @readonly\n\t * @type {Boolean}\n\t */\n\tget isAtEnd() {\n\t\tconst endOffset = this.parent.is( 'text' ) ? this.parent.data.length : this.parent.childCount;\n\n\t\treturn this.offset === endOffset;\n\t}\n\n\t/**\n\t * Position's root, that is the root of the position's parent element.\n\t *\n\t * @readonly\n\t * @type {module:engine/view/node~Node|module:engine/view/documentfragment~DocumentFragment}\n\t */\n\tget root() {\n\t\treturn this.parent.root;\n\t}\n\n\t/**\n\t * {@link module:engine/view/editableelement~EditableElement EditableElement} instance that contains this position, or `null` if\n\t * position is not inside an editable element.\n\t *\n\t * @type {module:engine/view/editableelement~EditableElement|null}\n\t */\n\tget editableElement() {\n\t\tlet editable = this.parent;\n\n\t\twhile ( !( editable instanceof EditableElement ) ) {\n\t\t\tif ( editable.parent ) {\n\t\t\t\teditable = editable.parent;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn editable;\n\t}\n\n\t/**\n\t * Returns a new instance of Position with offset incremented by `shift` value.\n\t *\n\t * @param {Number} shift How position offset should get changed. Accepts negative values.\n\t * @returns {module:engine/view/position~Position} Shifted position.\n\t */\n\tgetShiftedBy( shift ) {\n\t\tconst shifted = Position.createFromPosition( this );\n\n\t\tconst offset = shifted.offset + shift;\n\t\tshifted.offset = offset < 0 ? 0 : offset;\n\n\t\treturn shifted;\n\t}\n\n\t/**\n\t * Gets the farthest position which matches the callback using\n\t * {@link module:engine/view/treewalker~TreeWalker TreeWalker}.\n\t *\n\t * For example:\n\t *\n\t * \t\tgetLastMatchingPosition( value => value.type == 'text' ); //

{}foo

->

foo[]

\n\t * \t\tgetLastMatchingPosition( value => value.type == 'text', { direction: 'backward' } ); //

foo[]

->

{}foo

\n\t * \t\tgetLastMatchingPosition( value => false ); // Do not move the position.\n\t *\n\t * @param {Function} skip Callback function. Gets {@link module:engine/view/treewalker~TreeWalkerValue} and should\n\t * return `true` if the value should be skipped or `false` if not.\n\t * @param {Object} options Object with configuration options. See {@link module:engine/view/treewalker~TreeWalker}.\n\t *\n\t * @returns {module:engine/view/position~Position} The position after the last item which matches the `skip` callback test.\n\t */\n\tgetLastMatchingPosition( skip, options = {} ) {\n\t\toptions.startPosition = this;\n\n\t\tconst treeWalker = new TreeWalker( options );\n\t\ttreeWalker.skip( skip );\n\n\t\treturn treeWalker.position;\n\t}\n\n\t/**\n\t * Returns ancestors array of this position, that is this position's parent and it's ancestors.\n\t *\n\t * @returns {Array} Array with ancestors.\n\t */\n\tgetAncestors() {\n\t\tif ( this.parent.is( 'documentFragment' ) ) {\n\t\t\treturn [ this.parent ];\n\t\t} else {\n\t\t\treturn this.parent.getAncestors( { includeSelf: true } );\n\t\t}\n\t}\n\n\t/**\n\t * Returns a {@link module:engine/view/node~Node} or {@link module:engine/view/documentfragment~DocumentFragment}\n\t * which is a common ancestor of both positions.\n\t *\n\t * @param {module:engine/view/position~Position} position\n\t * @returns {module:engine/view/node~Node|module:engine/view/documentfragment~DocumentFragment|null}\n\t */\n\tgetCommonAncestor( position ) {\n\t\tconst ancestorsA = this.getAncestors();\n\t\tconst ancestorsB = position.getAncestors();\n\n\t\tlet i = 0;\n\n\t\twhile ( ancestorsA[ i ] == ancestorsB[ i ] && ancestorsA[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i === 0 ? null : ancestorsA[ i - 1 ];\n\t}\n\n\t/**\n\t * Checks whether this position equals given position.\n\t *\n\t * @param {module:engine/view/position~Position} otherPosition Position to compare with.\n\t * @returns {Boolean} True if positions are same.\n\t */\n\tisEqual( otherPosition ) {\n\t\treturn ( this.parent == otherPosition.parent && this.offset == otherPosition.offset );\n\t}\n\n\t/**\n\t * Checks whether this position is located before given position. When method returns `false` it does not mean that\n\t * this position is after give one. Two positions may be located inside separate roots and in that situation this\n\t * method will still return `false`.\n\t *\n\t * @see module:engine/view/position~Position#isAfter\n\t * @see module:engine/view/position~Position#compareWith\n\t * @param {module:engine/view/position~Position} otherPosition Position to compare with.\n\t * @returns {Boolean} Returns `true` if this position is before given position.\n\t */\n\tisBefore( otherPosition ) {\n\t\treturn this.compareWith( otherPosition ) == 'before';\n\t}\n\n\t/**\n\t * Checks whether this position is located after given position. When method returns `false` it does not mean that\n\t * this position is before give one. Two positions may be located inside separate roots and in that situation this\n\t * method will still return `false`.\n\t *\n\t * @see module:engine/view/position~Position#isBefore\n\t * @see module:engine/view/position~Position#compareWith\n\t * @param {module:engine/view/position~Position} otherPosition Position to compare with.\n\t * @returns {Boolean} Returns `true` if this position is after given position.\n\t */\n\tisAfter( otherPosition ) {\n\t\treturn this.compareWith( otherPosition ) == 'after';\n\t}\n\n\t/**\n\t * Checks whether this position is before, after or in same position that other position. Two positions may be also\n\t * different when they are located in separate roots.\n\t *\n\t * @param {module:engine/view/position~Position} otherPosition Position to compare with.\n\t * @returns {module:engine/view/position~PositionRelation}\n\t */\n\tcompareWith( otherPosition ) {\n\t\tif ( this.isEqual( otherPosition ) ) {\n\t\t\treturn 'same';\n\t\t}\n\n\t\t// If positions have same parent.\n\t\tif ( this.parent === otherPosition.parent ) {\n\t\t\treturn this.offset - otherPosition.offset < 0 ? 'before' : 'after';\n\t\t}\n\n\t\t// Get path from root to position's parent element.\n\t\tconst path = this.getAncestors();\n\t\tconst otherPath = otherPosition.getAncestors();\n\n\t\t// Compare both path arrays to find common ancestor.\n\t\tconst result = compareArrays( path, otherPath );\n\n\t\tlet commonAncestorIndex;\n\n\t\tswitch ( result ) {\n\t\t\tcase 0:\n\t\t\t\t// No common ancestors found.\n\t\t\t\treturn 'different';\n\n\t\t\tcase 'prefix':\n\t\t\t\tcommonAncestorIndex = path.length - 1;\n\t\t\t\tbreak;\n\n\t\t\tcase 'extension':\n\t\t\t\tcommonAncestorIndex = otherPath.length - 1;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tcommonAncestorIndex = result - 1;\n\t\t}\n\n\t\t// Common ancestor of two positions.\n\t\tconst commonAncestor = path[ commonAncestorIndex ];\n\t\tconst nextAncestor1 = path[ commonAncestorIndex + 1 ];\n\t\tconst nextAncestor2 = otherPath[ commonAncestorIndex + 1 ];\n\n\t\t// Check if common ancestor is not one of the parents.\n\t\tif ( commonAncestor === this.parent ) {\n\t\t\tconst index = this.offset - nextAncestor2.index;\n\n\t\t\treturn index <= 0 ? 'before' : 'after';\n\t\t} else if ( commonAncestor === otherPosition.parent ) {\n\t\t\tconst index = nextAncestor1.index - otherPosition.offset;\n\n\t\t\treturn index < 0 ? 'before' : 'after';\n\t\t}\n\n\t\tconst index = nextAncestor1.index - nextAncestor2.index;\n\n\t\t// Compare indexes of next ancestors inside common one.\n\t\treturn index < 0 ? 'before' : 'after';\n\t}\n\n\t/**\n\t * Creates position at the given location. The location can be specified as:\n\t *\n\t * * a {@link module:engine/view/position~Position position},\n\t * * parent element and offset (offset defaults to `0`),\n\t * * parent element and `'end'` (sets position at the end of that element),\n\t * * {@link module:engine/view/item~Item view item} and `'before'` or `'after'` (sets position before or after given view item).\n\t *\n\t * This method is a shortcut to other constructors such as:\n\t *\n\t * * {@link module:engine/view/position~Position.createBefore},\n\t * * {@link module:engine/view/position~Position.createAfter},\n\t * * {@link module:engine/view/position~Position.createFromPosition}.\n\t *\n\t * @param {module:engine/view/item~Item|module:engine/model/position~Position} itemOrPosition\n\t * @param {Number|'end'|'before'|'after'} [offset=0] Offset or one of the flags. Used only when\n\t * first parameter is a {@link module:engine/view/item~Item view item}.\n\t */\n\tstatic createAt( itemOrPosition, offset ) {\n\t\tif ( itemOrPosition instanceof Position ) {\n\t\t\treturn this.createFromPosition( itemOrPosition );\n\t\t} else {\n\t\t\tconst node = itemOrPosition;\n\n\t\t\tif ( offset == 'end' ) {\n\t\t\t\toffset = node.is( 'text' ) ? node.data.length : node.childCount;\n\t\t\t} else if ( offset == 'before' ) {\n\t\t\t\treturn this.createBefore( node );\n\t\t\t} else if ( offset == 'after' ) {\n\t\t\t\treturn this.createAfter( node );\n\t\t\t} else if ( !offset ) {\n\t\t\t\toffset = 0;\n\t\t\t}\n\n\t\t\treturn new Position( node, offset );\n\t\t}\n\t}\n\n\t/**\n\t * Creates a new position after given view item.\n\t *\n\t * @param {module:engine/view/item~Item} item View item after which the position should be located.\n\t * @returns {module:engine/view/position~Position}\n\t */\n\tstatic createAfter( item ) {\n\t\t// TextProxy is not a instance of Node so we need do handle it in specific way.\n\t\tif ( item.is( 'textProxy' ) ) {\n\t\t\treturn new Position( item.textNode, item.offsetInText + item.data.length );\n\t\t}\n\n\t\tif ( !item.parent ) {\n\t\t\t/**\n\t\t\t * You can not make a position after a root.\n\t\t\t *\n\t\t\t * @error view-position-after-root\n\t\t\t * @param {module:engine/view/node~Node} root\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-position-after-root: You can not make position after root.', { root: item } );\n\t\t}\n\n\t\treturn new Position( item.parent, item.index + 1 );\n\t}\n\n\t/**\n\t * Creates a new position before given view item.\n\t *\n\t * @param {module:engine/view/item~Item} item View item before which the position should be located.\n\t * @returns {module:engine/view/position~Position}\n\t */\n\tstatic createBefore( item ) {\n\t\t// TextProxy is not a instance of Node so we need do handle it in specific way.\n\t\tif ( item.is( 'textProxy' ) ) {\n\t\t\treturn new Position( item.textNode, item.offsetInText );\n\t\t}\n\n\t\tif ( !item.parent ) {\n\t\t\t/**\n\t\t\t * You cannot make a position before a root.\n\t\t\t *\n\t\t\t * @error view-position-before-root\n\t\t\t * @param {module:engine/view/node~Node} root\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-position-before-root: You can not make position before root.', { root: item } );\n\t\t}\n\n\t\treturn new Position( item.parent, item.index );\n\t}\n\n\t/**\n\t * Creates and returns a new instance of `Position`, which is equal to the passed position.\n\t *\n\t * @param {module:engine/view/position~Position} position Position to be cloned.\n\t * @returns {module:engine/view/position~Position}\n\t */\n\tstatic createFromPosition( position ) {\n\t\treturn new this( position.parent, position.offset );\n\t}\n}\n\n/**\n * A flag indicating whether this position is `'before'` or `'after'` or `'same'` as given position.\n * If positions are in different roots `'different'` flag is returned.\n *\n * @typedef {String} module:engine/view/position~PositionRelation\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/view/position.js\n// module id = 22\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/writer\n */\n\nimport Node from './node';\nimport Text from './text';\nimport TextProxy from './textproxy';\nimport Range from './range';\nimport DocumentFragment from './documentfragment';\nimport NodeList from './nodelist';\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\n\n/**\n * Contains functions used for composing model tree, grouped together under \"model writer\" name. Those functions\n * are built on top of {@link module:engine/model/node~Node node}, and it's child classes', APIs.\n *\n * Model writer API has multiple advantages and it is highly recommended to use it when changing model tree and nodes:\n * * model writer API {@link module:engine/model/writer~writer.normalizeNodes normalizes inserted nodes}, which means that you can insert\n * not only {@link module:engine/model/node~Node nodes}, but also `String`s, {@link module:engine/model/textproxy~TextProxy text proxies}\n * and\n * {@link module:engine/model/documentfragment~DocumentFragment document fragments},\n * * model writer API operates on {@link module:engine/model/position~Position positions}, which means that you have\n * better control over manipulating model tree as positions operate on offsets rather than indexes,\n * * model writer API automatically merges {@link module:engine/model/text~Text text nodes} with same attributes, which means\n * lower memory usage and better efficiency.\n *\n * @namespace writer\n */\nconst writer = {\n\tinsert,\n\tremove,\n\tmove,\n\tsetAttribute,\n\tremoveAttribute,\n\tnormalizeNodes\n};\n\nexport default writer;\n\n/**\n * Inserts given nodes at given position.\n *\n * @function module:engine/model/writer~writer.insert\n * @param {module:engine/model/position~Position} position Position at which nodes should be inserted.\n * @param {module:engine/model/node~NodeSet} nodes Nodes to insert.\n * @returns {module:engine/model/range~Range} Range spanning over inserted elements.\n */\nexport function insert( position, nodes ) {\n\tnodes = normalizeNodes( nodes );\n\n\t// We have to count offset before inserting nodes because they can get merged and we would get wrong offsets.\n\tconst offset = nodes.reduce( ( sum, node ) => sum + node.offsetSize, 0 );\n\tconst parent = position.parent;\n\n\t// Insertion might be in a text node, we should split it if that's the case.\n\t_splitNodeAtPosition( position );\n\tconst index = position.index;\n\n\t// Insert nodes at given index. After splitting we have a proper index and insertion is between nodes,\n\t// using basic `Element` API.\n\tparent.insertChildren( index, nodes );\n\n\t// Merge text nodes, if possible. Merging is needed only at points where inserted nodes \"touch\" \"old\" nodes.\n\t_mergeNodesAtIndex( parent, index + nodes.length );\n\t_mergeNodesAtIndex( parent, index );\n\n\treturn new Range( position, position.getShiftedBy( offset ) );\n}\n\n/**\n * Removed nodes in given range. Only {@link module:engine/model/range~Range#isFlat flat} ranges are accepted.\n *\n * @function module:engine/model/writer~writer.remove\n * @param {module:engine/model/range~Range} range Range containing nodes to remove.\n * @returns {Array.}\n */\nexport function remove( range ) {\n\tif ( !range.isFlat ) {\n\t\t/**\n\t\t * Trying to remove a range which starts and ends in different element.\n\t\t *\n\t\t * @error model-writer-remove-range-not-flat\n\t\t */\n\t\tthrow new CKEditorError( 'model-writer-remove-range-not-flat: ' +\n\t\t\t'Trying to remove a range which starts and ends in different element.' );\n\t}\n\n\tconst parent = range.start.parent;\n\n\t// Range may be inside text nodes, we have to split them if that's the case.\n\t_splitNodeAtPosition( range.start );\n\t_splitNodeAtPosition( range.end );\n\n\t// Remove the text nodes using basic `Element` API.\n\tconst removed = parent.removeChildren( range.start.index, range.end.index - range.start.index );\n\n\t// Merge text nodes, if possible. After some nodes were removed, node before and after removed range will be\n\t// touching at the position equal to the removed range beginning. We check merging possibility there.\n\t_mergeNodesAtIndex( parent, range.start.index );\n\n\treturn removed;\n}\n\n/**\n * Moves nodes in given range to given target position. Only {@link module:engine/model/range~Range#isFlat flat} ranges are accepted.\n *\n * @param {module:engine/model/range~Range} sourceRange Range containing nodes to move.\n * @param {module:engine/model/position~Position} targetPosition Position to which nodes should be moved.\n * @returns {module:engine/model/range~Range} Range containing moved nodes.\n */\nexport function move( sourceRange, targetPosition ) {\n\tif ( !sourceRange.isFlat ) {\n\t\t/**\n\t\t * Trying to move a range which starts and ends in different element.\n\t\t *\n\t\t * @error model-writer-move-range-not-flat\n\t\t */\n\t\tthrow new CKEditorError( 'model-writer-move-range-not-flat: ' +\n\t\t\t'Trying to move a range which starts and ends in different element.' );\n\t}\n\n\tconst nodes = this.remove( sourceRange );\n\n\t// We have to fix `targetPosition` because model changed after nodes from `sourceRange` got removed and\n\t// that change might have an impact on `targetPosition`.\n\ttargetPosition = targetPosition._getTransformedByDeletion( sourceRange.start, sourceRange.end.offset - sourceRange.start.offset );\n\n\treturn this.insert( targetPosition, nodes );\n}\n\n/**\n * Sets given attribute on nodes in given range.\n *\n * @param {module:engine/model/range~Range} range Range containing nodes that should have the attribute set.\n * @param {String} key Key of attribute to set.\n * @param {*} value Attribute value.\n */\nexport function setAttribute( range, key, value ) {\n\t// Range might start or end in text nodes, so we have to split them.\n\t_splitNodeAtPosition( range.start );\n\t_splitNodeAtPosition( range.end );\n\n\t// Iterate over all items in the range.\n\tfor ( const item of range.getItems() ) {\n\t\t// Iterator will return `TextProxy` instances but we know that those text proxies will\n\t\t// always represent full text nodes (this is guaranteed thanks to splitting we did before).\n\t\t// So, we can operate on those text proxies' text nodes.\n\t\tconst node = item.is( 'textProxy' ) ? item.textNode : item;\n\n\t\tif ( value !== null ) {\n\t\t\tnode.setAttribute( key, value );\n\t\t} else {\n\t\t\tnode.removeAttribute( key );\n\t\t}\n\n\t\t// After attributes changing it may happen that some text nodes can be merged. Try to merge with previous node.\n\t\t_mergeNodesAtIndex( node.parent, node.index );\n\t}\n\n\t// Try to merge last changed node with it's previous sibling (not covered by the loop above).\n\t_mergeNodesAtIndex( range.end.parent, range.end.index );\n}\n\n/**\n * Removes given attribute from nodes in given range.\n *\n * @param {module:engine/model/range~Range} range Range containing nodes that should have the attribute removed.\n * @param {String} key Key of attribute to remove.\n */\nexport function removeAttribute( range, key ) {\n\tthis.setAttribute( range, key, null );\n}\n\n/**\n * Normalizes given object or an array of objects to an array of {@link module:engine/model/node~Node nodes}. See\n * {@link module:engine/model/node~NodeSet NodeSet} for details on how normalization is performed.\n *\n * @param {module:engine/model/node~NodeSet} nodes Objects to normalize.\n * @returns {Array.} Normalized nodes.\n */\nexport function normalizeNodes( nodes ) {\n\tconst normalized = [];\n\n\tif ( !( nodes instanceof Array ) ) {\n\t\tnodes = [ nodes ];\n\t}\n\n\t// Convert instances of classes other than Node.\n\tfor ( let i = 0; i < nodes.length; i++ ) {\n\t\tif ( typeof nodes[ i ] == 'string' ) {\n\t\t\tnormalized.push( new Text( nodes[ i ] ) );\n\t\t} else if ( nodes[ i ] instanceof TextProxy ) {\n\t\t\tnormalized.push( new Text( nodes[ i ].data, nodes[ i ].getAttributes() ) );\n\t\t} else if ( nodes[ i ] instanceof DocumentFragment || nodes[ i ] instanceof NodeList ) {\n\t\t\tfor ( const child of nodes[ i ] ) {\n\t\t\t\tnormalized.push( child );\n\t\t\t}\n\t\t} else if ( nodes[ i ] instanceof Node ) {\n\t\t\tnormalized.push( nodes[ i ] );\n\t\t}\n\t\t// Skip unrecognized type.\n\t}\n\n\t// Merge text nodes.\n\tfor ( let i = 1; i < normalized.length; i++ ) {\n\t\tconst node = normalized[ i ];\n\t\tconst prev = normalized[ i - 1 ];\n\n\t\tif ( node instanceof Text && prev instanceof Text && _haveSameAttributes( node, prev ) ) {\n\t\t\t// Doing this instead changing prev.data because .data is readonly.\n\t\t\tnormalized.splice( i - 1, 2, new Text( prev.data + node.data, prev.getAttributes() ) );\n\t\t\ti--;\n\t\t}\n\t}\n\n\treturn normalized;\n}\n\n/**\n * Checks if nodes before and after given index in given element are {@link module:engine/model/text~Text text nodes} and\n * merges them into one node if they have same attributes.\n *\n * Merging is done by removing two text nodes and inserting a new text node containing data from both merged text nodes.\n *\n * @ignore\n * @private\n * @param {module:engine/model/element~Element} element Parent element of nodes to merge.\n * @param {Number} index Index between nodes to merge.\n */\nfunction _mergeNodesAtIndex( element, index ) {\n\tconst nodeBefore = element.getChild( index - 1 );\n\tconst nodeAfter = element.getChild( index );\n\n\t// Check if both of those nodes are text objects with same attributes.\n\tif ( nodeBefore && nodeAfter && nodeBefore.is( 'text' ) && nodeAfter.is( 'text' ) && _haveSameAttributes( nodeBefore, nodeAfter ) ) {\n\t\t// Append text of text node after index to the before one.\n\t\tconst mergedNode = new Text( nodeBefore.data + nodeAfter.data, nodeBefore.getAttributes() );\n\n\t\t// Remove separate text nodes.\n\t\telement.removeChildren( index - 1, 2 );\n\n\t\t// Insert merged text node.\n\t\telement.insertChildren( index - 1, mergedNode );\n\t}\n}\n\n/**\n * Checks if given position is in a text node, and if so, splits the text node in two text nodes, each of them\n * containing a part of original text node.\n *\n * @ignore\n * @private\n * @param {module:engine/model/position~Position} position Position at which node should be split.\n */\nfunction _splitNodeAtPosition( position ) {\n\tconst textNode = position.textNode;\n\tconst element = position.parent;\n\n\tif ( textNode ) {\n\t\tconst offsetDiff = position.offset - textNode.startOffset;\n\t\tconst index = textNode.index;\n\n\t\telement.removeChildren( index, 1 );\n\n\t\tconst firstPart = new Text( textNode.data.substr( 0, offsetDiff ), textNode.getAttributes() );\n\t\tconst secondPart = new Text( textNode.data.substr( offsetDiff ), textNode.getAttributes() );\n\n\t\telement.insertChildren( index, [ firstPart, secondPart ] );\n\t}\n}\n\n/**\n * Checks whether two given nodes have same attributes.\n *\n * @ignore\n * @private\n * @param {module:engine/model/node~Node} nodeA Node to check.\n * @param {module:engine/model/node~Node} nodeB Node to check.\n * @returns {Boolean} `true` if nodes have same attributes, `false` otherwise.\n */\nfunction _haveSameAttributes( nodeA, nodeB ) {\n\tconst iteratorA = nodeA.getAttributes();\n\tconst iteratorB = nodeB.getAttributes();\n\n\tfor ( const attr of iteratorA ) {\n\t\tif ( attr[ 1 ] !== nodeB.getAttribute( attr[ 0 ] ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\titeratorB.next();\n\t}\n\n\treturn iteratorB.next().done;\n}\n\n/**\n * Value that can be normalized to an array of {@link module:engine/model/node~Node nodes}.\n *\n * Non-arrays are normalized as follows:\n * * {@link module:engine/model/node~Node Node} is left as is,\n * * {@link module:engine/model/textproxy~TextProxy TextProxy} and `String` are normalized to {@link module:engine/model/text~Text Text},\n * * {@link module:engine/model/nodelist~NodeList NodeList} is normalized to an array containing all nodes that are in that node list,\n * * {@link module:engine/model/documentfragment~DocumentFragment DocumentFragment} is normalized to an array containing all of it's\n * * children.\n *\n * Arrays are processed item by item like non-array values and flattened to one array. Normalization always results in\n * a flat array of {@link module:engine/model/node~Node nodes}. Consecutive text nodes (or items normalized to text nodes) will be\n * merged if they have same attributes.\n *\n * @typedef {module:engine/model/node~Node|module:engine/model/textproxy~TextProxy|String|\n * module:engine/model/nodelist~NodeList|module:engine/model/documentfragment~DocumentFragment|Iterable}\n * module:engine/model/node~NodeSet\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/writer.js\n// module id = 23\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/delta/delta\n */\n\nimport clone from '@ckeditor/ckeditor5-utils/src/lib/lodash/clone';\nimport DeltaFactory from './deltafactory';\n\n/**\n * Base class for all deltas.\n *\n * Delta is a single, from the user action point of view, change in the editable document, like insert, split or\n * rename element. Delta is composed of operations, which are unit changes needed to be done to execute user action.\n *\n * Multiple deltas are grouped into a single {@link module:engine/model/batch~Batch}.\n */\nexport default class Delta {\n\t/**\n\t * Creates a delta instance.\n\t */\n\tconstructor() {\n\t\t/**\n\t\t * {@link module:engine/model/batch~Batch} which delta is a part of. This property is null by default and set by the\n\t\t * {@link module:engine/model/batch~Batch#addDelta} method.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/model/batch~Batch} module:engine/model/delta/delta~Delta#batch\n\t\t */\n\t\tthis.batch = null;\n\n\t\t/**\n\t\t * Array of operations which compose delta.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/model/operation/operation~Operation[]} module:engine/model/delta/delta~Delta#operations\n\t\t */\n\t\tthis.operations = [];\n\t}\n\n\t/**\n\t * Returns delta base version which is equal to the base version of the first operation in delta. If there\n\t * are no operations in delta, returns `null`.\n\t *\n\t * @see module:engine/model/document~Document\n\t * @type {Number|null}\n\t */\n\tget baseVersion() {\n\t\tif ( this.operations.length > 0 ) {\n\t\t\treturn this.operations[ 0 ].baseVersion;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * @param {Number} baseVersion\n\t */\n\tset baseVersion( baseVersion ) {\n\t\tfor ( const operation of this.operations ) {\n\t\t\toperation.baseVersion = baseVersion++;\n\t\t}\n\t}\n\n\t/**\n\t * A class that will be used when creating reversed delta.\n\t *\n\t * @private\n\t * @type {Function}\n\t */\n\tget _reverseDeltaClass() {\n\t\treturn Delta;\n\t}\n\n\t/**\n\t * Delta type.\n\t *\n\t * @readonly\n\t * @member {String} #type\n\t */\n\n\t/**\n\t * Add operation to the delta.\n\t *\n\t * @param {module:engine/model/operation/operation~Operation} operation Operation instance.\n\t */\n\taddOperation( operation ) {\n\t\toperation.delta = this;\n\t\tthis.operations.push( operation );\n\n\t\treturn operation;\n\t}\n\n\t/**\n\t * Creates and returns a delta that has the same parameters as this delta.\n\t *\n\t * @returns {module:engine/model/delta/delta~Delta} Clone of this delta.\n\t */\n\tclone() {\n\t\tconst delta = new this.constructor();\n\n\t\tfor ( const op of this.operations ) {\n\t\t\tdelta.addOperation( op.clone() );\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Creates and returns a reverse delta. Reverse delta when executed right after the original delta will bring back\n\t * tree model state to the point before the original delta execution. In other words, it reverses changes done\n\t * by the original delta.\n\t *\n\t * Keep in mind that tree model state may change since executing the original delta, so reverse delta may be \"outdated\".\n\t * In that case you will need to {@link module:engine/model/delta/transform~transform} it by all deltas that were executed after\n\t * the original delta.\n\t *\n\t * @returns {module:engine/model/delta/delta~Delta} Reversed delta.\n\t */\n\tgetReversed() {\n\t\tconst delta = new this._reverseDeltaClass();\n\n\t\tfor ( const op of this.operations ) {\n\t\t\tdelta.addOperation( op.getReversed() );\n\t\t}\n\n\t\tdelta.operations.reverse();\n\n\t\tfor ( let i = 0; i < delta.operations.length; i++ ) {\n\t\t\tdelta.operations[ i ].baseVersion = this.operations[ this.operations.length - 1 ].baseVersion + i + 1;\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Custom toJSON method to make deltas serializable.\n\t *\n\t * @returns {Object} Clone of this delta with added class name.\n\t */\n\ttoJSON() {\n\t\tconst json = clone( this );\n\n\t\tjson.__className = this.constructor.className;\n\n\t\t// Remove parent batch to avoid circular dependencies.\n\t\tdelete json.batch;\n\n\t\treturn json;\n\t}\n\n\t/**\n\t * Delta class name. Used by {@link #toJSON} method for serialization and\n\t * {@link module:engine/model/delta/deltafactory~DeltaFactory.fromJSON} during deserialization.\n\t *\n\t * @type {String}\n\t * @readonly\n\t */\n\tstatic get className() {\n\t\treturn 'engine.model.delta.Delta';\n\t}\n}\n\nDeltaFactory.register( Delta );\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/delta/delta.js\n// module id = 24\n// module chunks = 0","import arrayPush from './_arrayPush';\nimport isFlattenable from './_isFlattenable';\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nexport default baseFlatten;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/_baseFlatten.js\n// module id = 25\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/text\n */\n\nimport Node from './node';\n\n/**\n * Model text node. Type of {@link module:engine/model/node~Node node} that contains {@link module:engine/model/text~Text#data text data}.\n *\n * **Important:** see {@link module:engine/model/node~Node} to read about restrictions using `Text` and `Node` API.\n *\n * **Note:** keep in mind that `Text` instances might indirectly got removed from model tree when model is changed.\n * This happens when {@link module:engine/model/writer~writer model writer} is used to change model and the text node is merged with\n * another text node. Then, both text nodes are removed and a new text node is inserted into the model. Because of\n * this behavior, keeping references to `Text` is not recommended. Instead, consider creating\n * {@link module:engine/model/liveposition~LivePosition live position} placed before the text node.\n */\nexport default class Text extends Node {\n\t/**\n\t * Creates a text node.\n\t *\n\t * @param {String} data Node's text.\n\t * @param {Object} [attrs] Node's attributes. See {@link module:utils/tomap~toMap} for a list of accepted values.\n\t */\n\tconstructor( data, attrs ) {\n\t\tsuper( attrs );\n\n\t\t/**\n\t\t * Text data contained in this text node.\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tthis.data = data || '';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tget offsetSize() {\n\t\treturn this.data.length;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tis( type ) {\n\t\treturn type == 'text';\n\t}\n\n\t/**\n\t * Creates a copy of this text node and returns it. Created text node has same text data and attributes as original text node.\n\t */\n\tclone() {\n\t\treturn new Text( this.data, this.getAttributes() );\n\t}\n\n\t/**\n\t * Converts `Text` instance to plain object and returns it.\n\t *\n\t * @returns {Object} `Text` instance converted to plain object.\n\t */\n\ttoJSON() {\n\t\tconst json = super.toJSON();\n\n\t\tjson.data = this.data;\n\n\t\treturn json;\n\t}\n\n\t/**\n\t * Creates a `Text` instance from given plain object (i.e. parsed JSON string).\n\t *\n\t * @param {Object} json Plain object to be converted to `Text`.\n\t * @returns {module:engine/model/text~Text} `Text` instance created using given plain object.\n\t */\n\tstatic fromJSON( json ) {\n\t\treturn new Text( json.data, json.attributes );\n\t}\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/text.js\n// module id = 26\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/view/element\n */\n\nimport Node from './node';\nimport Text from './text';\nimport objectToMap from '@ckeditor/ckeditor5-utils/src/objecttomap';\nimport isIterable from '@ckeditor/ckeditor5-utils/src/isiterable';\nimport isPlainObject from '@ckeditor/ckeditor5-utils/src/lib/lodash/isPlainObject';\nimport Matcher from './matcher';\n\n/**\n * View element.\n *\n * Editing engine does not define fixed HTML DTD. This is why the type of the {@link module:engine/view/element~Element} need to\n * be defined by the feature developer. Creating an element you should use {@link module:engine/view/containerelement~ContainerElement}\n * class, {@link module:engine/view/attributeelement~AttributeElement} class or {@link module:engine/view/emptyelement~EmptyElement} class.\n *\n * Note that for view elements which are not created from model, like elements from mutations, paste or\n * {@link module:engine/controller/datacontroller~DataController#set data.set} it is not possible to define the type of the element, so\n * these will be instances of the {@link module:engine/view/element~Element}.\n *\n * @extends module:engine/view/node~Node\n */\nexport default class Element extends Node {\n\t/**\n\t * Creates a view element.\n\t *\n\t * Attributes can be passed in various formats:\n\t *\n\t *\t\tnew Element( 'div', { 'class': 'editor', 'contentEditable': 'true' } ); // object\n\t *\t\tnew Element( 'div', [ [ 'class', 'editor' ], [ 'contentEditable', 'true' ] ] ); // map-like iterator\n\t *\t\tnew Element( 'div', mapOfAttributes ); // map\n\t *\n\t * @param {String} name Node name.\n\t * @param {Object|Iterable} [attrs] Collection of attributes.\n\t * @param {module:engine/view/node~Node|Iterable.} [children]\n\t * List of nodes to be inserted into created element.\n\t */\n\tconstructor( name, attrs, children ) {\n\t\tsuper();\n\n\t\t/**\n\t\t * Name of the element.\n\t\t *\n\t\t * @readonly\n\t\t * @member {String}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * Map of attributes, where attributes names are keys and attributes values are values.\n\t\t *\n\t\t * @protected\n\t\t * @member {Map} #_attrs\n\t\t */\n\t\tif ( isPlainObject( attrs ) ) {\n\t\t\tthis._attrs = objectToMap( attrs );\n\t\t} else {\n\t\t\tthis._attrs = new Map( attrs );\n\t\t}\n\n\t\t/**\n\t\t * Array of child nodes.\n\t\t *\n\t\t * @protected\n\t\t * @member {Array.}\n\t\t */\n\t\tthis._children = [];\n\n\t\tif ( children ) {\n\t\t\tthis.insertChildren( 0, children );\n\t\t}\n\n\t\t/**\n\t\t * Set of classes associated with element instance.\n\t\t *\n\t\t * @protected\n\t\t * @member {Set}\n\t\t */\n\t\tthis._classes = new Set();\n\n\t\tif ( this._attrs.has( 'class' ) ) {\n\t\t\t// Remove class attribute and handle it by class set.\n\t\t\tconst classString = this._attrs.get( 'class' );\n\t\t\tparseClasses( this._classes, classString );\n\t\t\tthis._attrs.delete( 'class' );\n\t\t}\n\n\t\t/**\n\t\t * Map of styles.\n\t\t *\n\t\t * @protected\n\t\t * @member {Set} module:engine/view/element~Element#_styles\n\t\t */\n\t\tthis._styles = new Map();\n\n\t\tif ( this._attrs.has( 'style' ) ) {\n\t\t\t// Remove style attribute and handle it by styles map.\n\t\t\tparseInlineStyles( this._styles, this._attrs.get( 'style' ) );\n\t\t\tthis._attrs.delete( 'style' );\n\t\t}\n\n\t\t/**\n\t\t * Map of custom properties.\n\t\t * Custom properties can be added to element instance, will be cloned but not rendered into DOM.\n\t\t *\n\t\t * @protected\n\t\t * @memeber {Map}\n\t\t */\n\t\tthis._customProperties = new Map();\n\t}\n\n\t/**\n\t * Number of element's children.\n\t *\n\t * @readonly\n\t * @type {Number}\n\t */\n\tget childCount() {\n\t\treturn this._children.length;\n\t}\n\n\t/**\n\t * Is `true` if there are no nodes inside this element, `false` otherwise.\n\t *\n\t * @readonly\n\t * @type {Boolean}\n\t */\n\tget isEmpty() {\n\t\treturn this._children.length === 0;\n\t}\n\n\t/**\n\t * Checks whether given view tree object is of given type.\n\t *\n\t * Read more in {@link module:engine/view/node~Node#is}.\n\t *\n\t * @param {String} type\n\t * @param {String} [name] Element name.\n\t * @returns {Boolean}\n\t */\n\tis( type, name = null ) {\n\t\tif ( !name ) {\n\t\t\treturn type == 'element' || type == this.name;\n\t\t} else {\n\t\t\treturn type == 'element' && name == this.name;\n\t\t}\n\t}\n\n\t/**\n\t * Clones provided element.\n\t *\n\t * @param {Boolean} [deep=false] If set to `true` clones element and all its children recursively. When set to `false`,\n\t * element will be cloned without any children.\n\t * @returns {module:engine/view/element~Element} Clone of this element.\n\t */\n\tclone( deep = false ) {\n\t\tconst childrenClone = [];\n\n\t\tif ( deep ) {\n\t\t\tfor ( const child of this.getChildren() ) {\n\t\t\t\tchildrenClone.push( child.clone( deep ) );\n\t\t\t}\n\t\t}\n\n\t\t// ContainerElement and AttributeElement should be also cloned properly.\n\t\tconst cloned = new this.constructor( this.name, this._attrs, childrenClone );\n\n\t\t// Classes and styles are cloned separately - this solution is faster than adding them back to attributes and\n\t\t// parse once again in constructor.\n\t\tcloned._classes = new Set( this._classes );\n\t\tcloned._styles = new Map( this._styles );\n\n\t\t// Clone custom properties.\n\t\tcloned._customProperties = new Map( this._customProperties );\n\n\t\t// Clone filler offset method.\n\t\t// We can't define this method in a prototype because it's behavior which\n\t\t// is changed by e.g. toWidget() function from ckeditor5-widget. Perhaps this should be one of custom props.\n\t\tcloned.getFillerOffset = this.getFillerOffset;\n\n\t\treturn cloned;\n\t}\n\n\t/**\n\t * {@link module:engine/view/element~Element#insertChildren Insert} a child node or a list of child nodes at the end of this node\n\t * and sets the parent of these nodes to this element.\n\t *\n\t * @fires module:engine/view/node~Node#change\n\t * @param {module:engine/view/node~Node|Iterable.} nodes Node or the list of nodes to be inserted.\n\t * @returns {Number} Number of appended nodes.\n\t */\n\tappendChildren( nodes ) {\n\t\treturn this.insertChildren( this.childCount, nodes );\n\t}\n\n\t/**\n\t * Gets child at the given index.\n\t *\n\t * @param {Number} index Index of child.\n\t * @returns {module:engine/view/node~Node} Child node.\n\t */\n\tgetChild( index ) {\n\t\treturn this._children[ index ];\n\t}\n\n\t/**\n\t * Gets index of the given child node. Returns `-1` if child node is not found.\n\t *\n\t * @param {module:engine/view/node~Node} node Child node.\n\t * @returns {Number} Index of the child node.\n\t */\n\tgetChildIndex( node ) {\n\t\treturn this._children.indexOf( node );\n\t}\n\n\t/**\n\t * Gets child nodes iterator.\n\t *\n\t * @returns {Iterable.} Child nodes iterator.\n\t */\n\tgetChildren() {\n\t\treturn this._children[ Symbol.iterator ]();\n\t}\n\n\t/**\n\t * Returns an iterator that contains the keys for attributes. Order of inserting attributes is not preserved.\n\t *\n\t * @returns {Iterator.} Keys for attributes.\n\t */\n\t* getAttributeKeys() {\n\t\tif ( this._classes.size > 0 ) {\n\t\t\tyield 'class';\n\t\t}\n\n\t\tif ( this._styles.size > 0 ) {\n\t\t\tyield 'style';\n\t\t}\n\n\t\t// This is not an optimal solution because of https://github.com/ckeditor/ckeditor5-engine/issues/454.\n\t\t// It can be simplified to `yield* this._attrs.keys();`.\n\t\tfor ( const key of this._attrs.keys() ) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t/**\n\t * Returns iterator that iterates over this element's attributes.\n\t *\n\t * Attributes are returned as arrays containing two items. First one is attribute key and second is attribute value.\n\t * This format is accepted by native `Map` object and also can be passed in `Node` constructor.\n\t *\n\t * @returns {Iterable.<*>}\n\t */\n\t* getAttributes() {\n\t\tyield* this._attrs.entries();\n\n\t\tif ( this._classes.size > 0 ) {\n\t\t\tyield [ 'class', this.getAttribute( 'class' ) ];\n\t\t}\n\n\t\tif ( this._styles.size > 0 ) {\n\t\t\tyield [ 'style', this.getAttribute( 'style' ) ];\n\t\t}\n\t}\n\n\t/**\n\t * Gets attribute by key. If attribute is not present - returns undefined.\n\t *\n\t * @param {String} key Attribute key.\n\t * @returns {String|undefined} Attribute value.\n\t */\n\tgetAttribute( key ) {\n\t\tif ( key == 'class' ) {\n\t\t\tif ( this._classes.size > 0 ) {\n\t\t\t\treturn [ ...this._classes ].join( ' ' );\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( key == 'style' ) {\n\t\t\tif ( this._styles.size > 0 ) {\n\t\t\t\tlet styleString = '';\n\n\t\t\t\tfor ( const [ property, value ] of this._styles ) {\n\t\t\t\t\tstyleString += `${ property }:${ value };`;\n\t\t\t\t}\n\n\t\t\t\treturn styleString;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn this._attrs.get( key );\n\t}\n\n\t/**\n\t * Returns a boolean indicating whether an attribute with the specified key exists in the element.\n\t *\n\t * @param {String} key Attribute key.\n\t * @returns {Boolean} `true` if attribute with the specified key exists in the element, false otherwise.\n\t */\n\thasAttribute( key ) {\n\t\tif ( key == 'class' ) {\n\t\t\treturn this._classes.size > 0;\n\t\t}\n\n\t\tif ( key == 'style' ) {\n\t\t\treturn this._styles.size > 0;\n\t\t}\n\n\t\treturn this._attrs.has( key );\n\t}\n\n\t/**\n\t * Adds or overwrite attribute with a specified key and value.\n\t *\n\t * @param {String} key Attribute key.\n\t * @param {String} value Attribute value.\n\t * @fires module:engine/view/node~Node#change\n\t */\n\tsetAttribute( key, value ) {\n\t\tthis._fireChange( 'attributes', this );\n\n\t\tif ( key == 'class' ) {\n\t\t\tparseClasses( this._classes, value );\n\t\t} else if ( key == 'style' ) {\n\t\t\tparseInlineStyles( this._styles, value );\n\t\t} else {\n\t\t\tthis._attrs.set( key, value );\n\t\t}\n\t}\n\n\t/**\n\t * Inserts a child node or a list of child nodes on the given index and sets the parent of these nodes to\n\t * this element.\n\t *\n\t * @param {Number} index Position where nodes should be inserted.\n\t * @param {module:engine/view/node~Node|Iterable.} nodes Node or the list of nodes to be inserted.\n\t * @fires module:engine/view/node~Node#change\n\t * @returns {Number} Number of inserted nodes.\n\t */\n\tinsertChildren( index, nodes ) {\n\t\tthis._fireChange( 'children', this );\n\t\tlet count = 0;\n\n\t\tnodes = normalize( nodes );\n\n\t\tfor ( const node of nodes ) {\n\t\t\t// If node that is being added to this element is already inside another element, first remove it from the old parent.\n\t\t\tif ( node.parent !== null ) {\n\t\t\t\tnode.remove();\n\t\t\t}\n\n\t\t\tnode.parent = this;\n\n\t\t\tthis._children.splice( index, 0, node );\n\t\t\tindex++;\n\t\t\tcount++;\n\t\t}\n\n\t\treturn count;\n\t}\n\n\t/**\n\t * Removes attribute from the element.\n\t *\n\t * @param {String} key Attribute key.\n\t * @returns {Boolean} Returns true if an attribute existed and has been removed.\n\t * @fires module:engine/view/node~Node#change\n\t */\n\tremoveAttribute( key ) {\n\t\tthis._fireChange( 'attributes', this );\n\n\t\t// Remove class attribute.\n\t\tif ( key == 'class' ) {\n\t\t\tif ( this._classes.size > 0 ) {\n\t\t\t\tthis._classes.clear();\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// Remove style attribute.\n\t\tif ( key == 'style' ) {\n\t\t\tif ( this._styles.size > 0 ) {\n\t\t\t\tthis._styles.clear();\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// Remove other attributes.\n\t\treturn this._attrs.delete( key );\n\t}\n\n\t/**\n\t * Removes number of child nodes starting at the given index and set the parent of these nodes to `null`.\n\t *\n\t * @param {Number} index Number of the first node to remove.\n\t * @param {Number} [howMany=1] Number of nodes to remove.\n\t * @returns {Array.} The array of removed nodes.\n\t * @fires module:engine/view/node~Node#change\n\t */\n\tremoveChildren( index, howMany = 1 ) {\n\t\tthis._fireChange( 'children', this );\n\n\t\tfor ( let i = index; i < index + howMany; i++ ) {\n\t\t\tthis._children[ i ].parent = null;\n\t\t}\n\n\t\treturn this._children.splice( index, howMany );\n\t}\n\n\t/**\n\t * Checks if this element is similar to other element.\n\t * Both elements should have the same name and attributes to be considered as similar. Two similar elements\n\t * can contain different set of children nodes.\n\t *\n\t * @param {module:engine/view/element~Element} otherElement\n\t * @returns {Boolean}\n\t */\n\tisSimilar( otherElement ) {\n\t\tif ( !( otherElement instanceof Element ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If exactly the same Element is provided - return true immediately.\n\t\tif ( this === otherElement ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check element name.\n\t\tif ( this.name != otherElement.name ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check number of attributes, classes and styles.\n\t\tif ( this._attrs.size !== otherElement._attrs.size || this._classes.size !== otherElement._classes.size ||\n\t\t\tthis._styles.size !== otherElement._styles.size ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if attributes are the same.\n\t\tfor ( const [ key, value ] of this._attrs ) {\n\t\t\tif ( !otherElement._attrs.has( key ) || otherElement._attrs.get( key ) !== value ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if classes are the same.\n\t\tfor ( const className of this._classes ) {\n\t\t\tif ( !otherElement._classes.has( className ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if styles are the same.\n\t\tfor ( const [ property, value ] of this._styles ) {\n\t\t\tif ( !otherElement._styles.has( property ) || otherElement._styles.get( property ) !== value ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Adds specified class.\n\t *\n\t *\t\telement.addClass( 'foo' ); // Adds 'foo' class.\n\t *\t\telement.addClass( 'foo', 'bar' ); // Adds 'foo' and 'bar' classes.\n\t *\n\t * @param {...String} className\n\t * @fires module:engine/view/node~Node#change\n\t */\n\taddClass( ...className ) {\n\t\tthis._fireChange( 'attributes', this );\n\t\tclassName.forEach( name => this._classes.add( name ) );\n\t}\n\n\t/**\n\t * Removes specified class.\n\t *\n \t *\t\telement.removeClass( 'foo' ); // Removes 'foo' class.\n\t *\t\telement.removeClass( 'foo', 'bar' ); // Removes both 'foo' and 'bar' classes.\n\t *\n\t * @param {...String} className\n\t * @fires module:engine/view/node~Node#change\n\t */\n\tremoveClass( ...className ) {\n\t\tthis._fireChange( 'attributes', this );\n\t\tclassName.forEach( name => this._classes.delete( name ) );\n\t}\n\n\t/**\n\t * Returns true if class is present.\n\t * If more then one class is provided - returns true only when all classes are present.\n\t *\n\t *\t\telement.hasClass( 'foo' ); // Returns true if 'foo' class is present.\n\t *\t\telement.hasClass( 'foo', 'bar' ); // Returns true if 'foo' and 'bar' classes are both present.\n\t *\n\t * @param {...String} className\n\t */\n\thasClass( ...className ) {\n\t\tfor ( const name of className ) {\n\t\t\tif ( !this._classes.has( name ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Returns iterator that contains all class names.\n\t *\n\t * @returns {Iterator.}\n\t */\n\tgetClassNames() {\n\t\treturn this._classes.keys();\n\t}\n\n\t/**\n\t * Adds style to the element.\n\t *\n\t *\t\telement.setStyle( 'color', 'red' );\n\t *\t\telement.setStyle( {\n\t *\t\t\tcolor: 'red',\n\t *\t\t\tposition: 'fixed'\n\t *\t\t} );\n\t *\n\t * @param {String|Object} property Property name or object with key - value pairs.\n\t * @param {String} [value] Value to set. This parameter is ignored if object is provided as the first parameter.\n\t * @fires module:engine/view/node~Node#change\n\t */\n\tsetStyle( property, value ) {\n\t\tthis._fireChange( 'attributes', this );\n\n\t\tif ( isPlainObject( property ) ) {\n\t\t\tconst keys = Object.keys( property );\n\n\t\t\tfor ( const key of keys ) {\n\t\t\t\tthis._styles.set( key, property[ key ] );\n\t\t\t}\n\t\t} else {\n\t\t\tthis._styles.set( property, value );\n\t\t}\n\t}\n\n\t/**\n\t * Returns style value for given property.\n\t * Undefined is returned if style does not exist.\n\t *\n\t * @param {String} property\n\t * @returns {String|undefined}\n\t */\n\tgetStyle( property ) {\n\t\treturn this._styles.get( property );\n\t}\n\n\t/**\n\t * Returns iterator that contains all style names.\n\t *\n\t * @returns {Iterator.}\n\t */\n\tgetStyleNames() {\n\t\treturn this._styles.keys();\n\t}\n\n\t/**\n\t * Returns true if style keys are present.\n\t * If more then one style property is provided - returns true only when all properties are present.\n\t *\n\t *\t\telement.hasStyle( 'color' ); // Returns true if 'border-top' style is present.\n\t *\t\telement.hasStyle( 'color', 'border-top' ); // Returns true if 'color' and 'border-top' styles are both present.\n\t *\n\t * @param {...String} property\n\t */\n\thasStyle( ...property ) {\n\t\tfor ( const name of property ) {\n\t\t\tif ( !this._styles.has( name ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Removes specified style.\n\t *\n\t *\t\telement.removeStyle( 'color' ); // Removes 'color' style.\n\t *\t\telement.removeStyle( 'color', 'border-top' ); // Removes both 'color' and 'border-top' styles.\n\t *\n\t * @param {...String} property\n\t * @fires module:engine/view/node~Node#change\n\t */\n\tremoveStyle( ...property ) {\n\t\tthis._fireChange( 'attributes', this );\n\t\tproperty.forEach( name => this._styles.delete( name ) );\n\t}\n\n\t/**\n\t * Returns ancestor element that match specified pattern.\n\t * Provided patterns should be compatible with {@link module:engine/view/matcher~Matcher Matcher} as it is used internally.\n\t *\n\t * @see module:engine/view/matcher~Matcher\n\t * @param {Object|String|RegExp|Function} patterns Patterns used to match correct ancestor.\n\t * See {@link module:engine/view/matcher~Matcher}.\n\t * @returns {module:engine/view/element~Element|null} Found element or `null` if no matching ancestor was found.\n\t */\n\tfindAncestor( ...patterns ) {\n\t\tconst matcher = new Matcher( ...patterns );\n\t\tlet parent = this.parent;\n\n\t\twhile ( parent ) {\n\t\t\tif ( matcher.match( parent ) ) {\n\t\t\t\treturn parent;\n\t\t\t}\n\n\t\t\tparent = parent.parent;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Sets a custom property. Unlike attributes, custom properties are not rendered to the DOM,\n\t * so they can be used to add special data to elements.\n\t *\n\t * @param {String|Symbol} key\n\t * @param {*} value\n\t */\n\tsetCustomProperty( key, value ) {\n\t\tthis._customProperties.set( key, value );\n\t}\n\n\t/**\n\t * Returns the custom property value for the given key.\n\t *\n\t * @param {String|Symbol} key\n\t * @returns {*}\n\t */\n\tgetCustomProperty( key ) {\n\t\treturn this._customProperties.get( key );\n\t}\n\n\t/**\n\t * Removes the custom property stored under the given key.\n\t *\n\t * @param {String|Symbol} key\n\t * @returns {Boolean} Returns true if property was removed.\n\t */\n\tremoveCustomProperty( key ) {\n\t\treturn this._customProperties.delete( key );\n\t}\n\n\t/**\n\t * Returns an iterator which iterates over this element's custom properties.\n\t * Iterator provides [key, value] pair for each stored property.\n\t *\n\t * @returns {Iterable.<*>}\n\t */\n\t* getCustomProperties() {\n\t\tyield* this._customProperties.entries();\n\t}\n\n\t/**\n\t * Returns identity string based on element's name, styles, classes and other attributes.\n\t * Two elements that {@link #isSimilar are similar} will have same identity string.\n\t * It has the following format:\n\t *\n\t *\t\t'name class=\"class1,class2\" style=\"style1:value1;style2:value2\" attr1=\"val1\" attr2=\"val2\"'\n \t *\n\t * For example:\n\t *\n\t *\t\tconst element = new ViewElement( 'foo' );\n\t *\t\telement.setAttribute( 'banana', '10' );\n\t *\t\telement.setAttribute( 'apple', '20' );\n\t *\t\telement.setStyle( 'color', 'red' );\n\t *\t\telement.setStyle( 'border-color', 'white' );\n\t *\t\telement.addClass( 'baz' );\n\t *\n\t *\t\t// returns 'foo class=\"baz\" style=\"border-color:white;color:red\" apple=\"20\" banana=\"10\"'\n\t *\t\telement.getIdentity();\n\t *\n\t * NOTE: Classes, styles and other attributes are sorted alphabetically.\n\t *\n\t * @returns {String}\n\t */\n\tgetIdentity() {\n\t\tconst classes = Array.from( this._classes ).sort().join( ',' );\n\t\tconst styles = Array.from( this._styles ).map( i => `${ i[ 0 ] }:${ i[ 1 ] }` ).sort().join( ';' );\n\t\tconst attributes = Array.from( this._attrs ).map( i => `${ i[ 0 ] }=\"${ i[ 1 ] }\"` ).sort().join( ' ' );\n\n\t\treturn this.name +\n\t\t\t( classes == '' ? '' : ` class=\"${ classes }\"` ) +\n\t\t\t( styles == '' ? '' : ` style=\"${ styles }\"` ) +\n\t\t\t( attributes == '' ? '' : ` ${ attributes }` );\n\t}\n\n\t/**\n\t * Returns block {@link module:engine/view/filler filler} offset or `null` if block filler is not needed.\n\t *\n\t * @abstract\n\t * @method module:engine/view/element~Element#getFillerOffset\n\t */\n}\n\n// Parses inline styles and puts property - value pairs into styles map.\n// Styles map is cleared before insertion.\n//\n// @param {Map.} stylesMap Map to insert parsed properties and values.\n// @param {String} stylesString Styles to parse.\nfunction parseInlineStyles( stylesMap, stylesString ) {\n\t// `null` if no quote was found in input string or last found quote was a closing quote. See below.\n\tlet quoteType = null;\n\tlet propertyNameStart = 0;\n\tlet propertyValueStart = 0;\n\tlet propertyName = null;\n\n\tstylesMap.clear();\n\n\t// Do not set anything if input string is empty.\n\tif ( stylesString === '' ) {\n\t\treturn;\n\t}\n\n\t// Fix inline styles that do not end with `;` so they are compatible with algorithm below.\n\tif ( stylesString.charAt( stylesString.length - 1 ) != ';' ) {\n\t\tstylesString = stylesString + ';';\n\t}\n\n\t// Seek the whole string for \"special characters\".\n\tfor ( let i = 0; i < stylesString.length; i++ ) {\n\t\tconst char = stylesString.charAt( i );\n\n\t\tif ( quoteType === null ) {\n\t\t\t// No quote found yet or last found quote was a closing quote.\n\t\t\tswitch ( char ) {\n\t\t\t\tcase ':':\n\t\t\t\t\t// Most of time colon means that property name just ended.\n\t\t\t\t\t// Sometimes however `:` is found inside property value (for example in background image url).\n\t\t\t\t\tif ( !propertyName ) {\n\t\t\t\t\t\t// Treat this as end of property only if property name is not already saved.\n\t\t\t\t\t\t// Save property name.\n\t\t\t\t\t\tpropertyName = stylesString.substr( propertyNameStart, i - propertyNameStart );\n\t\t\t\t\t\t// Save this point as the start of property value.\n\t\t\t\t\t\tpropertyValueStart = i + 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase '\"':\n\t\t\t\tcase '\\'':\n\t\t\t\t\t// Opening quote found (this is an opening quote, because `quoteType` is `null`).\n\t\t\t\t\tquoteType = char;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t// eslint-disable-next-line no-case-declarations\n\t\t\t\tcase ';':\n\t\t\t\t\t// Property value just ended.\n\t\t\t\t\t// Use previously stored property value start to obtain property value.\n\t\t\t\t\tconst propertyValue = stylesString.substr( propertyValueStart, i - propertyValueStart );\n\n\t\t\t\t\tif ( propertyName ) {\n\t\t\t\t\t\t// Save parsed part.\n\t\t\t\t\t\tstylesMap.set( propertyName.trim(), propertyValue.trim() );\n\t\t\t\t\t}\n\n\t\t\t\t\tpropertyName = null;\n\n\t\t\t\t\t// Save this point as property name start. Property name starts immediately after previous property value ends.\n\t\t\t\t\tpropertyNameStart = i + 1;\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if ( char === quoteType ) {\n\t\t\t// If a quote char is found and it is a closing quote, mark this fact by `null`-ing `quoteType`.\n\t\t\tquoteType = null;\n\t\t}\n\t}\n}\n\n// Parses class attribute and puts all classes into classes set.\n// Classes set s cleared before insertion.\n//\n// @param {Set.} classesSet Set to insert parsed classes.\n// @param {String} classesString String with classes to parse.\nfunction parseClasses( classesSet, classesString ) {\n\tconst classArray = classesString.split( /\\s+/ );\n\tclassesSet.clear();\n\tclassArray.forEach( name => classesSet.add( name ) );\n}\n\n// Converts strings to Text and non-iterables to arrays.\n//\n// @param {String|module:engine/view/node~Node|Iterable.}\n// @return {Iterable.}\nfunction normalize( nodes ) {\n\t// Separate condition because string is iterable.\n\tif ( typeof nodes == 'string' ) {\n\t\treturn [ new Text( nodes ) ];\n\t}\n\n\tif ( !isIterable( nodes ) ) {\n\t\tnodes = [ nodes ];\n\t}\n\n\t// Array.from to enable .map() on non-arrays.\n\treturn Array.from( nodes )\n\t\t.map( node => {\n\t\t\treturn typeof node == 'string' ? new Text( node ) : node;\n\t\t} );\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/view/element.js\n// module id = 27\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * Set of utils related to keyboard support.\n *\n * @module utils/keyboard\n */\n\nimport CKEditorError from './ckeditorerror';\nimport env from './env';\n\n/**\n * Object with `keyName => keyCode` pairs for a set of known keys.\n *\n * Contains:\n *\n * * `a-z`,\n * * `0-9`,\n * * `f1-f12`,\n * * `arrow(left|up|right|bottom)`,\n * * `backspace`, `delete`, `enter`, `esc`, `tab`,\n * * `ctrl`, `cmd`, `shift`, `alt`.\n */\nexport const keyCodes = generateKnownKeyCodes();\n\n/**\n * Converts a key name or a {@link module:utils/keyboard~KeystrokeInfo keystroke info} into a key code.\n *\n * Note: Key names are matched with {@link module:utils/keyboard~keyCodes} in a case-insensitive way.\n *\n * @param {String|module:utils/keyboard~KeystrokeInfo} Key name (see {@link module:utils/keyboard~keyCodes})\n * or a keystroke data object.\n * @returns {Number} Key or keystroke code.\n */\nexport function getCode( key ) {\n\tlet keyCode;\n\n\tif ( typeof key == 'string' ) {\n\t\tkeyCode = keyCodes[ key.toLowerCase() ];\n\n\t\tif ( !keyCode ) {\n\t\t\t/**\n\t\t\t * Unknown key name. Only key names contained by the {@link module:utils/keyboard~keyCodes} can be used.\n\t\t\t *\n\t\t\t * @errror keyboard-unknown-key\n\t\t\t * @param {String} key\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'keyboard-unknown-key: Unknown key name.', { key } );\n\t\t}\n\t} else {\n\t\tkeyCode = key.keyCode +\n\t\t\t( key.altKey ? keyCodes.alt : 0 ) +\n\t\t\t( key.ctrlKey ? keyCodes.ctrl : 0 ) +\n\t\t\t( key.shiftKey ? keyCodes.shift : 0 );\n\t}\n\n\treturn keyCode;\n}\n\n/**\n * Parses keystroke and returns a keystroke code that will match the code returned by\n * link {@link module:utils/keyboard.getCode} for a corresponding {@link module:utils/keyboard~KeystrokeInfo keystroke info}.\n *\n * The keystroke can be passed in two formats:\n *\n * * as a single string – e.g. `ctrl + A`,\n * * as an array of {@link module:utils/keyboard~keyCodes known key names} and key codes – e.g.:\n * * `[ 'ctrl', 32 ]` (ctrl + space),\n * * `[ 'ctrl', 'a' ]` (ctrl + A).\n *\n * Note: Key names are matched with {@link module:utils/keyboard~keyCodes} in a case-insensitive way.\n *\n * Note: Only keystrokes with a single non-modifier key are supported (e.g. `ctrl+A` is OK, but `ctrl+A+B` is not).\n *\n * @param {String|Array.} keystroke Keystroke definition.\n * @returns {Number} Keystroke code.\n */\nexport function parseKeystroke( keystroke ) {\n\tif ( typeof keystroke == 'string' ) {\n\t\tkeystroke = splitKeystrokeText( keystroke );\n\t}\n\n\treturn keystroke\n\t\t.map( key => ( typeof key == 'string' ) ? getCode( key ) : key )\n\t\t.reduce( ( key, sum ) => sum + key, 0 );\n}\n\n/**\n * It translates any keystroke string text like `\"CTRL+A\"` to an\n * environment–specific keystroke, i.e. `\"⌘A\"` on Mac OSX.\n *\n * @param {String} keystroke Keystroke text.\n * @returns {String} Keystroke text specific for the environment.\n */\nexport function getEnvKeystrokeText( keystroke ) {\n\tconst split = splitKeystrokeText( keystroke );\n\n\tif ( env.mac ) {\n\t\tif ( split[ 0 ].toLowerCase() == 'ctrl' ) {\n\t\t\treturn '⌘' + ( split[ 1 ] || '' );\n\t\t}\n\t}\n\n\treturn keystroke;\n}\n\nfunction generateKnownKeyCodes() {\n\tconst keyCodes = {\n\t\tarrowleft: 37,\n\t\tarrowup: 38,\n\t\tarrowright: 39,\n\t\tarrowdown: 40,\n\t\tbackspace: 8,\n\t\tdelete: 46,\n\t\tenter: 13,\n\t\tspace: 32,\n\t\tesc: 27,\n\t\ttab: 9,\n\n\t\t// The idea about these numbers is that they do not collide with any real key codes, so we can use them\n\t\t// like bit masks.\n\t\tctrl: 0x110000,\n\t\t// Has the same code as ctrl, because their behaviour should be unified across the editor.\n\t\t// See http://ckeditor.github.io/editor-recommendations/general-policies#ctrl-vs-cmd\n\t\tcmd: 0x110000,\n\t\tshift: 0x220000,\n\t\talt: 0x440000\n\t};\n\n\t// a-z\n\tfor ( let code = 65; code <= 90; code++ ) {\n\t\tconst letter = String.fromCharCode( code );\n\n\t\tkeyCodes[ letter.toLowerCase() ] = code;\n\t}\n\n\t// 0-9\n\tfor ( let code = 48; code <= 57; code++ ) {\n\t\tkeyCodes[ code - 48 ] = code;\n\t}\n\n\t// F1-F12\n\tfor ( let code = 112; code <= 123; code++ ) {\n\t\tkeyCodes[ 'f' + ( code - 111 ) ] = code;\n\t}\n\n\treturn keyCodes;\n}\n\nfunction splitKeystrokeText( keystroke ) {\n\treturn keystroke.split( /\\s*\\+\\s*/ );\n}\n\n/**\n * Information about a keystroke.\n *\n * @interface module:utils/keyboard~KeystrokeInfo\n */\n\n/**\n * The [key code](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode).\n *\n * @member {Number} module:utils/keyboard~KeystrokeInfo#keyCode\n */\n\n/**\n * Whether the Alt modifier was pressed.\n *\n * @member {Bolean} module:utils/keyboard~KeystrokeInfo#altKey\n */\n\n/**\n * Whether the Ctrl or Cmd modifier was pressed.\n *\n * @member {Bolean} module:utils/keyboard~KeystrokeInfo#ctrlKey\n */\n\n/**\n * Whether the Shift modifier was pressed.\n *\n * @member {Bolean} module:utils/keyboard~KeystrokeInfo#shiftKey\n */\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/keyboard.js\n// module id = 28\n// module chunks = 0","/**\n * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/model/operation/moveoperation\n */\n\nimport Operation from './operation';\nimport Position from '../position';\nimport Range from '../range';\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport compareArrays from '@ckeditor/ckeditor5-utils/src/comparearrays';\nimport writer from './../writer';\n\n/**\n * Operation to move a range of {@link module:engine/model/item~Item model items}\n * to given {@link module:engine/model/position~Position target position}.\n *\n * @extends module:engine/model/operation/operation~Operation\n */\nexport default class MoveOperation extends Operation {\n\t/**\n\t * Creates a move operation.\n\t *\n\t * @param {module:engine/model/position~Position} sourcePosition\n\t * Position before the first {@link module:engine/model/item~Item model item} to move.\n\t * @param {Number} howMany Offset size of moved range. Moved range will start from `sourcePosition` and end at\n\t * `sourcePosition` with offset shifted by `howMany`.\n\t * @param {module:engine/model/position~Position} targetPosition Position at which moved nodes will be inserted.\n\t * @param {Number} baseVersion {@link module:engine/model/document~Document#version} on which operation can be applied.\n\t */\n\tconstructor( sourcePosition, howMany, targetPosition, baseVersion ) {\n\t\tsuper( baseVersion );\n\n\t\t/**\n\t\t * Position before the first {@link module:engine/model/item~Item model item} to move.\n\t\t *\n\t\t * @member {module:engine/model/position~Position} module:engine/model/operation/moveoperation~MoveOperation#sourcePosition\n\t\t */\n\t\tthis.sourcePosition = Position.createFromPosition( sourcePosition );\n\n\t\t/**\n\t\t * Offset size of moved range.\n\t\t *\n\t\t * @member {Number} module:engine/model/operation/moveoperation~MoveOperation#howMany\n\t\t */\n\t\tthis.howMany = howMany;\n\n\t\t/**\n\t\t * Position at which moved nodes will be inserted.\n\t\t *\n\t\t * @member {module:engine/model/position~Position} module:engine/model/operation/moveoperation~MoveOperation#targetPosition\n\t\t */\n\t\tthis.targetPosition = Position.createFromPosition( targetPosition );\n\n\t\t/**\n\t\t * Defines whether `MoveOperation` is sticky. If `MoveOperation` is sticky, during\n\t\t * {@link module:engine/model/operation/transform~transform operational transformation} if there will be an operation that\n\t\t * inserts some nodes at the position equal to the boundary of this `MoveOperation`, that operation will\n\t\t * get their insertion path updated to the position where this `MoveOperation` moves the range.\n\t\t *\n\t\t * @member {Boolean} module:engine/model/operation/moveoperation~MoveOperation#isSticky\n\t\t */\n\t\tthis.isSticky = false;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tget type() {\n\t\treturn 'move';\n\t}\n\n\t/**\n\t * Creates and returns an operation that has the same parameters as this operation.\n\t *\n\t * @returns {module:engine/model/operation/moveoperation~MoveOperation} Clone of this operation.\n\t */\n\tclone() {\n\t\tconst op = new this.constructor( this.sourcePosition, this.howMany, this.targetPosition, this.baseVersion );\n\t\top.isSticky = this.isSticky;\n\n\t\treturn op;\n\t}\n\n\t/**\n\t * Returns the start position of the moved range after it got moved. This may be different than\n\t * {@link module:engine/model/operation/moveoperation~MoveOperation#targetPosition} in some cases, i.e. when a range is moved\n\t * inside the same parent but {@link module:engine/model/operation/moveoperation~MoveOperation#targetPosition targetPosition}\n\t * is after {@link module:engine/model/operation/moveoperation~MoveOperation#sourcePosition sourcePosition}.\n\t *\n\t *\t\t vv vv\n\t *\t\tabcdefg ===> adefbcg\n\t *\t\t ^ ^\n\t *\t\t targetPos\tmovedRangeStart\n\t *\t\t offset 6\toffset 4\n\t *\n\t * @returns {module:engine/model/position~Position}\n\t */\n\tgetMovedRangeStart() {\n\t\treturn this.targetPosition._getTransformedByDeletion( this.sourcePosition, this.howMany );\n\t}\n\n\t/**\n\t * See {@link module:engine/model/operation/operation~Operation#getReversed `Operation#getReversed()`}.\n\t *\n\t * @returns {module:engine/model/operation/moveoperation~MoveOperation}\n\t */\n\tgetReversed() {\n\t\tconst newTargetPosition = this.sourcePosition._getTransformedByInsertion( this.targetPosition, this.howMany );\n\n\t\tconst op = new this.constructor( this.getMovedRangeStart(), this.howMany, newTargetPosition, this.baseVersion + 1 );\n\t\top.isSticky = this.isSticky;\n\n\t\treturn op;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\t_execute() {\n\t\tconst sourceElement = this.sourcePosition.parent;\n\t\tconst targetElement = this.targetPosition.parent;\n\t\tconst sourceOffset = this.sourcePosition.offset;\n\t\tconst targetOffset = this.targetPosition.offset;\n\n\t\t// Validate whether move operation has correct parameters.\n\t\t// Validation is pretty complex but move operation is one of the core ways to manipulate the document state.\n\t\t// We expect that many errors might be connected with one of scenarios described below.\n\t\tif ( !sourceElement || !targetElement ) {\n\t\t\t/**\n\t\t\t * Source position or target position is invalid.\n\t\t\t *\n\t\t\t * @error move-operation-position-invalid\n\t\t\t */\n\t\t\tthrow new CKEditorError(\n\t\t\t\t'move-operation-position-invalid: Source position or target position is invalid.'\n\t\t\t);\n\t\t} else if ( sourceOffset + this.howMany > sourceElement.maxOffset ) {\n\t\t\t/**\n\t\t\t * The nodes which should be moved do not exist.\n\t\t\t *\n\t\t\t * @error move-operation-nodes-do-not-exist\n\t\t\t */\n\t\t\tthrow new CKEditorError(\n\t\t\t\t'move-operation-nodes-do-not-exist: The nodes which should be moved do not exist.'\n\t\t\t);\n\t\t} else if ( sourceElement === targetElement && sourceOffset < targetOffset && targetOffset < sourceOffset + this.howMany ) {\n\t\t\t/**\n\t\t\t * Trying to move a range of nodes into the middle of that range.\n\t\t\t *\n\t\t\t * @error move-operation-range-into-itself\n\t\t\t */\n\t\t\tthrow new CKEditorError(\n\t\t\t\t'move-operation-range-into-itself: Trying to move a range of nodes to the inside of that range.'\n\t\t\t);\n\t\t} else if ( this.sourcePosition.root == this.targetPosition.root ) {\n\t\t\tif ( compareArrays( this.sourcePosition.getParentPath(), this.targetPosition.getParentPath() ) == 'prefix' ) {\n\t\t\t\tconst i = this.sourcePosition.path.length - 1;\n\n\t\t\t\tif ( this.targetPosition.path[ i ] >= sourceOffset && this.targetPosition.path[ i ] < sourceOffset + this.howMany ) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Trying to move a range of nodes into one of nodes from that range.\n\t\t\t\t\t *\n\t\t\t\t\t * @error move-operation-node-into-itself\n\t\t\t\t\t */\n\t\t\t\t\tthrow new CKEditorError(\n\t\t\t\t\t\t'move-operation-node-into-itself: Trying to move a range of nodes into one of nodes from that range.'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst range = writer.move( Range.createFromPositionAndShift( this.sourcePosition, this.howMany ), this.targetPosition );\n\n\t\treturn {\n\t\t\tsourcePosition: this.sourcePosition,\n\t\t\trange\n\t\t};\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tstatic get className() {\n\t\treturn 'engine.model.operation.MoveOperation';\n\t}\n\n\t/**\n\t * Creates `MoveOperation` object from deserilized object, i.e. from parsed JSON string.\n\t *\n\t * @param {Object} json Deserialized JSON object.\n\t * @param {module:engine/model/document~Document} document Document on which this operation will be applied.\n\t * @returns {module:engine/model/operation/moveoperation~MoveOperation}\n\t */\n\tstatic fromJSON( json, document ) {\n\t\tconst sourcePosition = Position.fromJSON( json.sourcePosition, document );\n\t\tconst targetPosition = Position.fromJSON( json.targetPosition, document );\n\n\t\tconst move = new this( sourcePosition, json.howMany, targetPosition, json.baseVersion );\n\n\t\tif ( json.isSticky ) {\n\t\t\tmove.isSticky = true;\n\t\t}\n\n\t\treturn move;\n\t}\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-engine/src/model/operation/moveoperation.js\n// module id = 29\n// module chunks = 0","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../ckeditor5-utils/src/lib/lodash/_arrayMap.js\n// module id = 30\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// /workspace/ckeditor5/node_modules/css-loader/lib/css-base.js\n// module id = 31\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n\nvar stylesInDom = {};\n\nvar\tmemoize = function (fn) {\n\tvar memo;\n\n\treturn function () {\n\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\treturn memo;\n\t};\n};\n\nvar isOldIE = memoize(function () {\n\t// Test for IE <= 9 as proposed by Browserhacks\n\t// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n\t// Tests for existence of standard globals is to allow style-loader\n\t// to operate correctly into non-standard environments\n\t// @see https://github.com/webpack-contrib/style-loader/issues/177\n\treturn window && document && document.all && !window.atob;\n});\n\nvar getElement = (function (fn) {\n\tvar memo = {};\n\n\treturn function(selector) {\n\t\tif (typeof memo[selector] === \"undefined\") {\n\t\t\tmemo[selector] = fn.call(this, selector);\n\t\t}\n\n\t\treturn memo[selector]\n\t};\n})(function (target) {\n\treturn document.querySelector(target)\n});\n\nvar singleton = null;\nvar\tsingletonCounter = 0;\nvar\tstylesInsertedAtTop = [];\n\nvar\tfixUrls = require(\"./urls\");\n\nmodule.exports = function(list, options) {\n\tif (typeof DEBUG !== \"undefined\" && DEBUG) {\n\t\tif (typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t}\n\n\toptions = options || {};\n\n\toptions.attrs = typeof options.attrs === \"object\" ? options.attrs : {};\n\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of