{"version":3,"sources":["webpack:///./ref/constants.js","webpack:///./ref/stores/mutation_types.js","webpack:///./ref/stores/actions.js","webpack:///./ref/stores/getters.js","webpack:///./ref/stores/mutations.js","webpack:///./ref/stores/index.js","webpack:///./ref/stores/state.js","webpack:///./behaviors/shortcuts/shortcuts_network.js","webpack:///./network/raphael.js","webpack:///./network/branch_graph.js","webpack:///./pages/projects/network/network.js","webpack:///./pages/projects/network/show/index.js","webpack:///./lib/utils/http_status.js","webpack:////build/source/node_modules/raphael/raphael.js","webpack:///./ref/format_refs.js","webpack:///ref/components/ref_selector.vue","webpack:///./ref/components/ref_selector.vue?1e36","webpack:///./ref/components/ref_selector.vue?3221","webpack:///./ref/components/ref_selector.vue"],"names":["REF_TYPE_BRANCHES","REF_TYPE_TAGS","REF_TYPE_COMMITS","ALL_REF_TYPES","Object","freeze","BRANCH_REF_TYPE","TAG_REF_TYPE","TAG_REF_TYPE_ICON","BRANCH_REF_TYPE_ICON","REF_TYPE_PARAM_NAME","X_TOTAL_HEADER","SEARCH_DEBOUNCE_MS","DEFAULT_DEBOUNCE_AND_THROTTLE_MS","DEFAULT_I18N","defaultLabelText","__","dropdownHeader","searchPlaceholder","noResultsWithQuery","noResults","branchesErrorMessage","tagsErrorMessage","commitsErrorMessage","branches","tags","commits","noRefSelected","totalCountLabel","s__","setEnabledRefTypes","commit","refTypes","setParams","params","setUseSymbolicRefNames","useSymbolicRefNames","setProjectId","projectId","setSelectedRef","selectedRef","search","state","dispatch","query","dispatchIfRefTypeEnabled","refType","action","enabledRefTypes","includes","searchBranches","Api","then","response","catch","error","finally","searchTags","searchCommits","getters","isQueryPossiblyASha","test","isLoading","requestCount","matches","list","convertObjectPropsToCamelCase","data","map","b","name","value","undefined","default","protected","totalCount","parseInt","headers","shortId","id","subtitle","title","_error$response","status","HTTP_STATUS_NOT_FOUND","Vue","use","Vuex","Store","actions","mutations","createRefModule","namespaced","ShortcutsNetwork","constructor","shortcuts","graph","addAll","REPO_GRAPH_SCROLL_LEFT","scrollLeft","REPO_GRAPH_SCROLL_RIGHT","scrollRight","REPO_GRAPH_SCROLL_UP","scrollUp","REPO_GRAPH_SCROLL_DOWN","scrollDown","REPO_GRAPH_SCROLL_TOP","scrollTop","REPO_GRAPH_SCROLL_BOTTOM","scrollBottom","ShortcutsNavigation","Raphael","prototype","commitTooltip","x","y","icon","this","image","gon","relative_url_root","author","nameText","text","dateText","formatDate","date","idText","messageText","message","replace","textSet","set","attr","font","fill","node","style","textWrap","boxWidth","rect","stroke","tooltip","height","getBBox","width","transform","t","content","abc","letterWidth","length","words","split","s","j","len","word","push","join","trim","h","Math","abs","y2","BranchGraph","element1","options1","element","options","bind","preparedCommits","mtime","mspace","parents","colors","offsetX","offsetY","unitTime","unitSpace","prev_start","load","_this","axios","get","url","$","hide","prepareData","days","buildGraph","_this2","collectParents","graphHeight","graphWidth","ch","max","cw","r","top","barHeight","reduce","acc","updatedCommit","isParent","markCommit","collectColors","_this3","ref","results","forEach","c","time","space","ref1","results1","p","k","getColor","mm","cuday","cumonth","cuyear","day","renderPartialGraph","bindEvents","i","start","floor","end","hasDrawn","drawDot","drawLines","appendLabel","appendAnchor","toFront","_this4","scroll","find","refs","shortrefs","substr","textbox","path","circle","opacity","cursor","click","visitUrl","commit_url","hover","insertBefore","remove","avatarBoxX","avatarBoxY","class","arrow","offset","color","parent","parentCommit","parentY","parentX1","parentX2","route","commit_id","vph","window","Network","opts","filter_ref","network_graph","submit","branch_graph","css","closest","_networkPath$match","refSwitcherEl","document","getElementById","networkPath","dataset","networkRootPath","match","el","render","createElement","RefSelector","props","on","input","joinPaths","encodeURIComponent","initRefSwitcher","networkGraph","addShortcutsExtension","HTTP_STATUS_ABORTED","HTTP_STATUS_OK","HTTP_STATUS_CREATED","HTTP_STATUS_NO_CONTENT","HTTP_STATUS_BAD_REQUEST","HTTP_STATUS_UNAUTHORIZED","HTTP_STATUS_FORBIDDEN","HTTP_STATUS_CONFLICT","HTTP_STATUS_GONE","HTTP_STATUS_PAYLOAD_TOO_LARGE","HTTP_STATUS_UNPROCESSABLE_ENTITY","HTTP_STATUS_TOO_MANY_REQUESTS","HTTP_STATUS_INTERNAL_SERVER_ERROR","successCodes","factory","modules","installedModules","__webpack_require__","moduleId","exports","module","loaded","call","m","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","R","apply","eve","first","is","array","_engine","create","splice","nu","add","args","Array","slice","arguments","f","pop","version","paperproto","uuidRegEx","uuidReplacer","separator","elements","ellipse","formatrg","has","g","doc","win","oldRaphael","was","Paper","ca","customAttributes","concat","supportsTouch","DocumentTouch","E","S","Str","String","events","touchMap","mousedown","mousemove","mouseup","lowerCase","toLowerCase","math","mmax","mmin","min","pow","PI","objectToString","toString","colourRegExp","_ISURL","isnan","bezierrg","round","toFloat","parseFloat","toInt","upperCase","toUpperCase","availableAttrs","_availableAttrs","blur","cx","cy","gradient","href","rx","ry","src","target","availableAnimAttrs","_availableAnimAttrs","commaSpaces","hsrg","hs","rg","p2s","pathCommand","tCommand","pathValues","eldata","_radial_gradient","sortByNumber","a","pipe","rectPath","_rectPath","w","ellipsePath","getPath","_getPath","attrs","bbox","_getBBox","mapPath","matrix","ii","jj","pathi","path2curve","_g","type","SVGAngle","implementation","hasFeature","d","innerHTML","firstChild","behavior","adj","clone","obj","res","key","svg","vml","_Paper","fn","_id","o","isArray","angle","x1","y1","x2","x3","y3","atan2","rad","deg","snapTo","values","tolerance","rem","createUUID","random","setWindow","newwin","initWin","toHex","bod","docum","ActiveXObject","write","close","body","e","createPopup","range","createTextRange","cacher","queryCommandValue","display","appendChild","defaultView","getComputedStyle","getPropertyValue","hsbtoString","hsltoString","l","rgbtoString","hex","prepareRGB","clr","getRGB","packageRGB","rgb","repush","item","scope","postprocessor","newf","arg","cache","count","shift","clrToString","catmullRom2bezier","crp","z","iLen","hsb2rgb","hsl2rgb","rgb2hsl","rgb2hsb","v","G","B","X","C","V","L","M","_path2string","_preload","img","cssText","onload","removeChild","onerror","colour","indexOf","substring","charAt","red","green","blue","hsb","hsl","reset","parsePathString","pathString","pth","paths","arr","pathClone","paramCounts","q","parseTransformString","TString","ps","sleep","setTimeout","base3","p1","p2","p3","p4","bezlen","x4","y4","z2","Tvalues","Cvalues","sum","ct","xbase","ybase","comb","sqrt","intersect","denominator","px","py","px2","toFixed","py2","interHelper","bez1","bez2","justCount","bbox1","bezierBBox","bbox2","isBBoxIntersect","l1","l2","n1","n2","dots1","dots2","xy","findDotsAtSegment","di","di1","dj","dj1","ci","cj","t1","t2","interPathHelper","path1","path2","_path2curve","x1m","y1m","x2m","y2m","pi","pj","intr","kk","segment1","segment2","p1x","p1y","c1x","c1y","c2x","c2y","p2x","p2y","t13","t12","t3","mx","my","nx","ny","ax","ay","alpha","n","curveDim","isPointInsideBBox","pathIntersection","pathIntersectionNumber","isPointInsidePath","pathBBox","_removedFactory","methodname","pathDimensions","Y","dim","xmin","ymin","xmax","ymax","bb","pathArray","pathToRelative","_pathToRelative","rel","pa","pathToAbsolute","_pathToAbsolute","crz","dots","l2c","q2c","a2c","large_arc_flag","sweep_flag","recursive","_120","rotate","cos","sin","f1","f2","rx2","ry2","asin","df","f2old","x2old","y2old","c1","s1","c2","s2","tan","hx","hy","m1","m2","m3","m4","newres","findDotAtSegment","dot","curve","bx","by","qx","qy","attrs2","processPath","pcom","T","Q","fixArc","pp","pcoms1","pcoms2","fixM","a1","a2","pfirst","seg","seg2","seglen","seg2len","tear","_parseDots","par","_tear","paper","prev","bottom","next","toMatrix","_tofront","_toback","_insertafter","el2","_insertbefore","_","extractTransform","transformPath","_extractTransform","tstr","dx","dy","tdata","sx","sy","Matrix","tlen","command","absolute","inver","invert","translate","scale","dirtyT","getEmpty","equaliseTransform","_equaliseTransform","tt1","tt2","maxlength","from","to","_getContainer","container","tagName","pixelWidth","offsetWidth","pixelHeight","offsetHeight","matrixproto","norm","normalize","mag","out","me","fromCharCode","toFilter","row","scalex","shear","scaley","acos","isSimple","isSuperSimple","noRotation","toTransformString","shorter","preventDefault","returnValue","preventTouch","originalEvent","stopPropagation","cancelBubble","stopTouch","getEventPosition","scrollY","documentElement","scrollX","clientX","clientY","addEvent","addEventListener","pos","_f","olde","targetTouches","removeEventListener","attachEvent","event","detachEvent","drag","dragMove","dragi","touches","touch","identifier","_drag","nextSibling","parentNode","opera","getElementByPoint","move_scope","dragUp","unmousemove","unmouseup","end_scope","start_scope","elproto","eventName","unbind","shape","removeData","getData","f_in","f_out","scope_in","scope_out","mouseover","mouseout","unhover","unmouseover","unmouseout","draggable","x_y_w_h","onmove","onstart","onend","onDragOver","undrag","unmousedown","__set__","format","itemsArray","Set","setStart","setFinish","getSize","canvas","setSize","setViewBox","fit","raphael","elem","box","docElem","clientTop","clientLeft","elementFromPoint","so","getBoundingClientRect","ownerDocument","pageYOffset","left","pageXOffset","sr","createSVGRect","hits","getIntersectionList","getById","raphaelid","getElementsByBBox","bot","callback","thisArg","getElementsByPoint","isPointInside","rp","realPath","isWithoutTransform","removed","dirty","bboxwt","glow","offsetx","offsety","getPointAtSegmentLength","ll","step","getTatLen","getLengthFactory","istotal","subpath","onlystart","point","sp","subpaths","getTotalLength","getPointAtLength","getSubpathsAtLength","getSubpath","ef","easing_formulas","linear","backIn","backOut","elastic","bounce","easeIn","easeOut","easeInOut","animationElements","requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","animation","Now","Date","paused","now","ms","easing","diff","that","init","initstatus","anim","percent","stop","upto255","real","from2","repeat","totalOrigin","runAnimation","percents","CubicBezierAtTime","duration","sampleCurveX","epsilon","t0","d2","solveCurveX","solve","Animation","newAnim","times","sort","isInAnim","isInAnimSet","timestamp","toColour","pathes","toPath","eq","to2","easyeasy","del","origin","stopAnimation","animateWith","onAnimation","delay","json","100","lastKey","animate","setTime","pause","resume","tokenRegex","objNotationRegex","items","setproto","method","clear","index","insertion","tail","todel","arglen","exclude","collector","insertAfter","glowConfig","ret","shape2","index2","registerFont","face","fonts","fontcopy","glyphs","family","prop","glyph","getFont","weight","stretch","normal","bold","lighter","bolder","thefont","RegExp","fontName","print","string","size","letter_spacing","line_spacing","letters","notfirst","lineHeight","shifty","descent","curr","token","str","fullfill","all","quote","quotedName","isFunc","replacer","ninja","st","readyState","isLoaded","current_event","comaseparator","numsort","firstDefined","lastDefined","objtos","ar","oldstop","listeners","indexed","queue","ce","zIndex","_events","nes","names","es","sep","exist","hasOwnProperty","nt","subname","cur","nts","off","funcs","once","xlink","markers","block","classic","diamond","open","oval","markerCounter","setAttributeNS","setAttribute","createElementNS","webkitTapHighlightColor","addGradientFill","fx","fy","SVG","_fx","_fy","dir","isNaN","vector","defs","gradientTransform","isFinite","fillurl","fillOpacity","mode","documentMode","location","protocol","host","pathname","updatePosition","pattern","patternTransform","addArrow","isEnd","refX","se","arrows","endPath","endMarker","startPath","startMarker","pathId","markerId","marker","getElementsByTagName","markerHeight","markerWidth","orient","refY","delta","startdx","enddx","dasharray","addDashes","butt","square","dashes","setFillAndStroke","vis","visibility","att","nodeValue","val","createTextNode","pn","hl","clip","rc","getAttribute","startString","endString","isURL","ig","patternUnits","stops","cssrule","tuneText","fontSize","tspan","texts","tspans","dif","getRealNode","Element","sw","show","containerStyle","canvasHidden","parentElement","clientWidth","clientHeight","def","subkey","toBack","afterNode","beforeNode","fltr","stdDeviation","_blur","filter","removeAttribute","preserveAspectRatio","_viewBox","con","Error","isFloating","cnvs","xmlns","_left","_top","renderfix","vb","paperSize","aspectRatio","_vbSize","viewBox","getScreenCTM","createSVGMatrix","desc","Z","bites","blurregexp","cssDot","zoom","pathTypes","ovalTypes","compensation","setCoords","fillpos","flip","kx","ky","coordsize","rotation","coordorigin","fillsize","position","createNode","newpath","isOval","total","vals","isMove","path2vml","div","clipRect","dstyle","textpath","textpathStyle","fontFamily","fontWeight","fontStyle","newstroke","strokeColor","joinstyle","miterlimit","endcap","dashstyle","span","brect","W","right","H","dirtyattrs","dd","bbx","fxfy","color2","clrs","focus","focussize","focusposition","_oid","oldt","vbs","_viewBoxShift","vbt","skew","isGrad","isPatt","bbt","auxGetBBox","runtimeStyle","margin","Path","textpathok","cs","styleSheets","createStyleSheet","addRule","namespaces","rvml","convertToListBoxItems","components","GlBadge","GlIcon","GlCollapsibleListbox","ProtectedBadge","inheritAttrs","disabled","Boolean","required","validator","_isArray","every","queryParams","translations","toggleButtonClass","computed","mapState","lastQuery","mapGetters","i18n","listBoxItems","addToFinalResult","header","formatListBoxItems","extendedToggleButtonClass","classes","footerSlotProps","errors","errorsList","formatErrors","selectedRefForDisplay","buttonText","noResultsMessage","sprintf","dropdownIcon","watch","immediate","handler","beforeCreate","$store","createStore","created","debouncedSearch","_debounce","$watch","methods","mapActions","storeSearch","onSearchBoxInput","searchQuery","selectRef","$emit","totalCountText","component","_vm","_c","_self","_b","staticClass","$event","scopedSlots","_u","group","_v","_s","_e","_t","_l","errorMessage","proxy","$attrs","$listeners","domProps"],"mappings":"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","file":"pages.projects.network.show.f20ec31a.chunk.js","sourcesContent":["import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';\nimport { s__, __ } from '~/locale';\n\nexport const REF_TYPE_BRANCHES = 'REF_TYPE_BRANCHES';\nexport const REF_TYPE_TAGS = 'REF_TYPE_TAGS';\nexport const REF_TYPE_COMMITS = 'REF_TYPE_COMMITS';\nexport const ALL_REF_TYPES = Object.freeze([REF_TYPE_BRANCHES, REF_TYPE_TAGS, REF_TYPE_COMMITS]);\nexport const BRANCH_REF_TYPE = 'heads';\nexport const TAG_REF_TYPE = 'tags';\nexport const TAG_REF_TYPE_ICON = 'tag';\nexport const BRANCH_REF_TYPE_ICON = 'branch';\nexport const SEARCH_ICON = 'search';\nexport const REF_TYPE_PARAM_NAME = 'ref_type';\n\nexport const X_TOTAL_HEADER = 'x-total';\n\nexport const SEARCH_DEBOUNCE_MS = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;\n\nexport const DEFAULT_I18N = Object.freeze({\n  defaultLabelText: __('default'),\n  dropdownHeader: __('Select Git revision'),\n  searchPlaceholder: __('Search by Git revision'),\n  noResultsWithQuery: __('No matching results for \"%{query}\"'),\n  noResults: __('No matching results'),\n  branchesErrorMessage: __('An error occurred while fetching branches. Retry the search.'),\n  tagsErrorMessage: __('An error occurred while fetching tags. Retry the search.'),\n  commitsErrorMessage: __('An error occurred while fetching commits. Retry the search.'),\n  branches: __('Branches'),\n  tags: __('Tags'),\n  commits: __('Commits'),\n  noRefSelected: __('No ref selected'),\n  totalCountLabel: s__('TotalRefCountIndicator|1000+'),\n});\n","export const SET_ENABLED_REF_TYPES = 'SET_ENABLED_REF_TYPES';\nexport const SET_USE_SYMBOLIC_REF_NAMES = 'SET_USE_SYMBOLIC_REF_NAMES';\nexport const SET_PARAMS = 'SET_PARAMS';\n\nexport const SET_PROJECT_ID = 'SET_PROJECT_ID';\nexport const SET_SELECTED_REF = 'SET_SELECTED_REF';\nexport const SET_QUERY = 'SET_QUERY';\n\nexport const REQUEST_START = 'REQUEST_START';\nexport const REQUEST_FINISH = 'REQUEST_FINISH';\n\nexport const RECEIVE_BRANCHES_SUCCESS = 'RECEIVE_BRANCHES_SUCCESS';\nexport const RECEIVE_BRANCHES_ERROR = 'RECEIVE_BRANCHES_ERROR';\n\nexport const RECEIVE_TAGS_SUCCESS = 'RECEIVE_TAGS_SUCCESS';\nexport const RECEIVE_TAGS_ERROR = 'RECEIVE_TAGS_ERROR';\n\nexport const RECEIVE_COMMITS_SUCCESS = 'RECEIVE_COMMITS_SUCCESS';\nexport const RECEIVE_COMMITS_ERROR = 'RECEIVE_COMMITS_ERROR';\nexport const RESET_COMMIT_MATCHES = 'RESET_COMMIT_MATCHES';\n","import Api from '~/api';\nimport { REF_TYPE_BRANCHES, REF_TYPE_TAGS, REF_TYPE_COMMITS } from '../constants';\nimport * as types from './mutation_types';\n\nexport const setEnabledRefTypes = ({ commit }, refTypes) =>\n  commit(types.SET_ENABLED_REF_TYPES, refTypes);\n\nexport const setParams = ({ commit }, params) => commit(types.SET_PARAMS, params);\n\nexport const setUseSymbolicRefNames = ({ commit }, useSymbolicRefNames) =>\n  commit(types.SET_USE_SYMBOLIC_REF_NAMES, useSymbolicRefNames);\n\nexport const setProjectId = ({ commit }, projectId) => commit(types.SET_PROJECT_ID, projectId);\n\nexport const setSelectedRef = ({ commit }, selectedRef) =>\n  commit(types.SET_SELECTED_REF, selectedRef);\n\nexport const search = ({ state, dispatch, commit }, query) => {\n  commit(types.SET_QUERY, query);\n\n  const dispatchIfRefTypeEnabled = (refType, action) => {\n    if (state.enabledRefTypes.includes(refType)) {\n      dispatch(action);\n    }\n  };\n  dispatchIfRefTypeEnabled(REF_TYPE_BRANCHES, 'searchBranches');\n  dispatchIfRefTypeEnabled(REF_TYPE_TAGS, 'searchTags');\n  dispatchIfRefTypeEnabled(REF_TYPE_COMMITS, 'searchCommits');\n};\n\nexport const searchBranches = ({ commit, state }) => {\n  commit(types.REQUEST_START);\n\n  Api.branches(state.projectId, state.query, state.params)\n    .then((response) => {\n      commit(types.RECEIVE_BRANCHES_SUCCESS, response);\n    })\n    .catch((error) => {\n      commit(types.RECEIVE_BRANCHES_ERROR, error);\n    })\n    .finally(() => {\n      commit(types.REQUEST_FINISH);\n    });\n};\n\nexport const searchTags = ({ commit, state }) => {\n  commit(types.REQUEST_START);\n\n  Api.tags(state.projectId, state.query)\n    .then((response) => {\n      commit(types.RECEIVE_TAGS_SUCCESS, response);\n    })\n    .catch((error) => {\n      commit(types.RECEIVE_TAGS_ERROR, error);\n    })\n    .finally(() => {\n      commit(types.REQUEST_FINISH);\n    });\n};\n\nexport const searchCommits = ({ commit, state, getters }) => {\n  // Only query the Commit API if the search query looks like a commit SHA\n  if (getters.isQueryPossiblyASha) {\n    commit(types.REQUEST_START);\n\n    Api.commit(state.projectId, state.query)\n      .then((response) => {\n        commit(types.RECEIVE_COMMITS_SUCCESS, response);\n      })\n      .catch((error) => {\n        commit(types.RECEIVE_COMMITS_ERROR, error);\n      })\n      .finally(() => {\n        commit(types.REQUEST_FINISH);\n      });\n  } else {\n    commit(types.RESET_COMMIT_MATCHES);\n  }\n};\n","/** Returns `true` if the query string looks like it could be a commit SHA */\nexport const isQueryPossiblyASha = ({ query }) => /^[0-9a-f]{4,40}$/i.test(query);\n\n/** Returns `true` if there is at least one in-progress request */\nexport const isLoading = ({ requestCount }) => requestCount > 0;\n","import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';\nimport { HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status';\nimport { X_TOTAL_HEADER } from '../constants';\nimport * as types from './mutation_types';\n\nexport default {\n  [types.SET_ENABLED_REF_TYPES](state, refTypes) {\n    state.enabledRefTypes = refTypes;\n  },\n  [types.SET_USE_SYMBOLIC_REF_NAMES](state, useSymbolicRefNames) {\n    state.useSymbolicRefNames = useSymbolicRefNames;\n  },\n  [types.SET_PARAMS](state, params) {\n    state.params = params;\n  },\n  [types.SET_PROJECT_ID](state, projectId) {\n    state.projectId = projectId;\n  },\n  [types.SET_SELECTED_REF](state, selectedRef) {\n    state.selectedRef = selectedRef;\n  },\n  [types.SET_QUERY](state, query) {\n    state.query = query;\n  },\n\n  [types.REQUEST_START](state) {\n    state.requestCount += 1;\n  },\n  [types.REQUEST_FINISH](state) {\n    state.requestCount -= 1;\n  },\n\n  [types.RECEIVE_BRANCHES_SUCCESS](state, response) {\n    state.matches.branches = {\n      list: convertObjectPropsToCamelCase(response.data).map((b) => ({\n        name: b.name,\n        value: state.useSymbolicRefNames ? `refs/heads/${b.name}` : undefined,\n        default: b.default,\n        protected: b.protected,\n      })),\n      totalCount: parseInt(response.headers[X_TOTAL_HEADER], 10),\n      error: null,\n    };\n  },\n  [types.RECEIVE_BRANCHES_ERROR](state, error) {\n    state.matches.branches = {\n      list: [],\n      totalCount: 0,\n      error,\n    };\n  },\n\n  [types.RECEIVE_TAGS_SUCCESS](state, response) {\n    state.matches.tags = {\n      list: convertObjectPropsToCamelCase(response.data).map((b) => ({\n        name: b.name,\n        value: state.useSymbolicRefNames ? `refs/tags/${b.name}` : undefined,\n        protected: b.protected,\n      })),\n      totalCount: parseInt(response.headers[X_TOTAL_HEADER], 10),\n      error: null,\n    };\n  },\n  [types.RECEIVE_TAGS_ERROR](state, error) {\n    state.matches.tags = {\n      list: [],\n      totalCount: 0,\n      error,\n    };\n  },\n\n  [types.RECEIVE_COMMITS_SUCCESS](state, response) {\n    const commit = convertObjectPropsToCamelCase(response.data);\n\n    state.matches.commits = {\n      list: [\n        {\n          name: commit.shortId,\n          value: commit.id,\n          subtitle: commit.title,\n        },\n      ],\n      totalCount: 1,\n      error: null,\n    };\n  },\n  [types.RECEIVE_COMMITS_ERROR](state, error) {\n    state.matches.commits = {\n      list: [],\n      totalCount: 0,\n\n      // 404's are expected when the search query doesn't match any commits\n      // and shouldn't be treated as an actual error\n      error: error.response?.status !== HTTP_STATUS_NOT_FOUND ? error : null,\n    };\n  },\n  [types.RESET_COMMIT_MATCHES](state) {\n    state.matches.commits = {\n      list: [],\n      totalCount: 0,\n      error: null,\n    };\n  },\n};\n","import Vue from 'vue';\n// eslint-disable-next-line no-restricted-imports\nimport Vuex from 'vuex';\nimport * as actions from './actions';\nimport * as getters from './getters';\nimport mutations from './mutations';\nimport createState from './state';\n\nVue.use(Vuex);\n\nexport default () =>\n  new Vuex.Store({\n    actions,\n    getters,\n    mutations,\n    state: createState(),\n  });\n\nexport const createRefModule = () => ({\n  namespaced: true,\n  actions,\n  getters,\n  mutations,\n  state: createState(),\n});\n","const createRefTypeState = () => ({\n  list: [],\n  totalCount: 0,\n  error: null,\n});\n\nexport default () => ({\n  enabledRefTypes: [],\n  projectId: null,\n\n  query: '',\n  matches: {\n    branches: createRefTypeState(),\n    tags: createRefTypeState(),\n    commits: createRefTypeState(),\n  },\n  selectedRef: null,\n  params: null,\n  requestCount: 0,\n});\n","import {\n  REPO_GRAPH_SCROLL_BOTTOM,\n  REPO_GRAPH_SCROLL_DOWN,\n  REPO_GRAPH_SCROLL_LEFT,\n  REPO_GRAPH_SCROLL_RIGHT,\n  REPO_GRAPH_SCROLL_TOP,\n  REPO_GRAPH_SCROLL_UP,\n} from './keybindings';\nimport ShortcutsNavigation from './shortcuts_navigation';\n\nexport default class ShortcutsNetwork {\n  constructor(shortcuts, graph) {\n    shortcuts.addAll([\n      [REPO_GRAPH_SCROLL_LEFT, graph.scrollLeft],\n      [REPO_GRAPH_SCROLL_RIGHT, graph.scrollRight],\n      [REPO_GRAPH_SCROLL_UP, graph.scrollUp],\n      [REPO_GRAPH_SCROLL_DOWN, graph.scrollDown],\n      [REPO_GRAPH_SCROLL_TOP, graph.scrollTop],\n      [REPO_GRAPH_SCROLL_BOTTOM, graph.scrollBottom],\n    ]);\n  }\n\n  static dependencies = [ShortcutsNavigation];\n}\n","import Raphael from 'raphael/raphael';\nimport { formatDate } from '~/lib/utils/datetime_utility';\n\nRaphael.prototype.commitTooltip = function commitTooltip(x, y, commit) {\n  const boxWidth = 300;\n  const icon = this.image(gon.relative_url_root + commit.author.icon, x, y, 20, 20);\n  const nameText = this.text(x + 25, y + 10, commit.author.name);\n  const dateText = this.text(x, y + 35, formatDate(commit.date));\n  const idText = this.text(x, y + 55, commit.id);\n  const messageText = this.text(x, y + 70, commit.message.replace(/\\r?\\n/g, ' \\n '));\n  const textSet = this.set(icon, nameText, dateText, idText, messageText).attr({\n    'text-anchor': 'start',\n    font: '12px Monaco, monospace',\n  });\n  nameText.attr({\n    font: '14px Arial',\n    'font-weight': 'bold',\n  });\n  dateText.attr({\n    fill: '#666',\n  });\n  idText.attr({\n    fill: '#AAA',\n  });\n  messageText.node.style['white-space'] = 'pre';\n  this.textWrap(messageText, boxWidth - 50);\n  const rect = this.rect(x - 10, y - 10, boxWidth, 100, 4).attr({\n    fill: '#FFF',\n    stroke: '#000',\n    'stroke-linecap': 'round',\n    'stroke-width': 2,\n  });\n  const tooltip = this.set(rect, textSet);\n  rect.attr({\n    height: tooltip.getBBox().height + 10,\n    width: tooltip.getBBox().width + 10,\n  });\n  tooltip.transform(['t', 20, 20]);\n  return tooltip;\n};\n\nRaphael.prototype.textWrap = function testWrap(t, width) {\n  const content = t.attr('text');\n  const abc = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n  t.attr({\n    text: abc,\n  });\n  const letterWidth = t.getBBox().width / abc.length;\n  t.attr({\n    text: content,\n  });\n  const words = content.split(' ');\n  let x = 0;\n  const s = [];\n  for (let j = 0, len = words.length; j < len; j += 1) {\n    const word = words[j];\n    if (x + word.length * letterWidth > width) {\n      s.push('\\n');\n      x = 0;\n    }\n    if (word === '\\n') {\n      s.push('\\n');\n      x = 0;\n    } else {\n      s.push(`${word} `);\n      x += word.length * letterWidth;\n    }\n  }\n  t.attr({\n    text: s.join('').trim(),\n  });\n  const b = t.getBBox();\n  const h = Math.abs(b.y2) + 1;\n  return t.attr({\n    y: h,\n  });\n};\n\nexport default Raphael;\n","/* eslint-disable func-names, consistent-return */\n\nimport $ from 'jquery';\nimport axios from '~/lib/utils/axios_utils';\nimport { visitUrl } from '~/lib/utils/url_utility';\nimport { __ } from '~/locale';\nimport Raphael from './raphael';\n\nexport default class BranchGraph {\n  constructor(element1, options1) {\n    this.element = element1;\n    this.options = options1;\n    this.scrollTop = this.scrollTop.bind(this);\n    this.scrollBottom = this.scrollBottom.bind(this);\n    this.scrollRight = this.scrollRight.bind(this);\n    this.scrollLeft = this.scrollLeft.bind(this);\n    this.scrollUp = this.scrollUp.bind(this);\n    this.scrollDown = this.scrollDown.bind(this);\n    this.preparedCommits = {};\n    this.mtime = 0;\n    this.mspace = 0;\n    this.parents = {};\n    this.colors = ['#000'];\n    this.offsetX = 150;\n    this.offsetY = 20;\n    this.unitTime = 30;\n    this.unitSpace = 10;\n    this.prev_start = -1;\n    this.load();\n  }\n\n  load() {\n    axios\n      .get(this.options.url)\n      .then(({ data }) => {\n        $('.loading', this.element).hide();\n        this.prepareData(data.days, data.commits);\n        this.buildGraph();\n      })\n      .catch(() => __('Error fetching network graph.'));\n  }\n\n  prepareData(days, commits) {\n    this.days = days;\n    this.commits = commits;\n    this.collectParents();\n    this.graphHeight = $(this.element).height();\n    this.graphWidth = $(this.element).width();\n    const ch = Math.max(this.graphHeight, this.offsetY + this.unitTime * this.mtime + 150);\n    const cw = Math.max(this.graphWidth, this.offsetX + this.unitSpace * this.mspace + 300);\n    this.r = Raphael(this.element.get(0), cw, ch);\n    this.top = this.r.set();\n    this.barHeight = Math.max(this.graphHeight, this.unitTime * this.days.length + 320);\n    this.commits = this.commits.reduce((acc, commit) => {\n      const updatedCommit = commit;\n      if (commit.id in this.parents) {\n        updatedCommit.isParent = true;\n      }\n      acc.push(updatedCommit);\n      this.preparedCommits[commit.id] = commit;\n      this.markCommit(commit);\n      return acc;\n    }, []);\n    return this.collectColors();\n  }\n\n  collectParents() {\n    const ref = this.commits;\n    const results = [];\n    ref.forEach((c) => {\n      this.mtime = Math.max(this.mtime, c.time);\n      this.mspace = Math.max(this.mspace, c.space);\n      const ref1 = c.parents;\n      const results1 = [];\n      ref1.forEach((p) => {\n        this.parents[p[0]] = true;\n        results1.push((this.mspace = Math.max(this.mspace, p[1])));\n      });\n      results.push(results1);\n    });\n    return results;\n  }\n\n  collectColors() {\n    let k = 0;\n    const results = [];\n    while (k < this.mspace) {\n      this.colors.push(Raphael.getColor(0.8));\n      // Skipping a few colors in the spectrum to get more contrast between colors\n      Raphael.getColor();\n      Raphael.getColor();\n      results.push((k += 1));\n    }\n    return results;\n  }\n\n  buildGraph() {\n    let mm = 0;\n    let len = 0;\n    let cuday = 0;\n    let cumonth = '';\n    let cuyear = '';\n    const { r } = this;\n    r.rect(0, 0, 40, this.barHeight).attr({\n      fill: '#222',\n    });\n    r.rect(40, 0, 30, this.barHeight).attr({\n      fill: '#444',\n    });\n    const ref = this.days;\n    for (mm = 0, len = ref.length; mm < len; mm += 1) {\n      const day = ref[mm];\n      if (cuday !== day[0] || cumonth !== day[1] || cuyear !== day[2]) {\n        // Dates\n        r.text(55, this.offsetY + this.unitTime * mm, day[0]).attr({\n          font: '12px Monaco, monospace',\n          fill: '#BBB',\n        });\n      }\n      if (cumonth !== day[1] || cuyear !== day[2]) {\n        // Months\n        r.text(20, this.offsetY + this.unitTime * mm, day[1]).attr({\n          font: '12px Monaco, monospace',\n          fill: '#EEE',\n        });\n      }\n      [cuday, cumonth, cuyear] = day;\n    }\n    this.renderPartialGraph();\n    return this.bindEvents();\n  }\n\n  renderPartialGraph() {\n    const isGraphEdge = true;\n    let i = 0;\n    let start = Math.floor((this.element.scrollTop() - this.offsetY) / this.unitTime) - 10;\n    if (start < 0) {\n      start = 0;\n    }\n    let end = start + 40;\n    if (this.commits.length < end) {\n      end = this.commits.length;\n    }\n    if (this.prev_start === -1 || Math.abs(this.prev_start - start) > 10 || isGraphEdge) {\n      i = start;\n      this.prev_start = start;\n      while (i < end) {\n        const commit = this.commits[i];\n        i += 1;\n        if (commit.hasDrawn !== true) {\n          const x = this.offsetX + this.unitSpace * (this.mspace - commit.space);\n          const y = this.offsetY + this.unitTime * commit.time;\n          this.drawDot(x, y, commit);\n          this.drawLines(x, y, commit);\n          this.appendLabel(x, y, commit);\n          this.appendAnchor(x, y, commit);\n          commit.hasDrawn = true;\n        }\n      }\n      return this.top.toFront();\n    }\n  }\n\n  bindEvents() {\n    const { element } = this;\n\n    return $(element).scroll(() => this.renderPartialGraph());\n  }\n\n  scrollDown() {\n    this.element.scrollTop(this.element.scrollTop() + 50);\n    return this.renderPartialGraph();\n  }\n\n  scrollUp() {\n    this.element.scrollTop(this.element.scrollTop() - 50);\n    return this.renderPartialGraph();\n  }\n\n  scrollLeft() {\n    this.element.scrollLeft(this.element.scrollLeft() - 50);\n    return this.renderPartialGraph();\n  }\n\n  scrollRight() {\n    this.element.scrollLeft(this.element.scrollLeft() + 50);\n    return this.renderPartialGraph();\n  }\n\n  scrollBottom() {\n    return this.element.scrollTop(this.element.find('svg').height());\n  }\n\n  scrollTop() {\n    return this.element.scrollTop(0);\n  }\n\n  appendLabel(x, y, commit) {\n    if (!commit.refs) {\n      return;\n    }\n\n    const { r } = this;\n    let shortrefs = commit.refs;\n    // Truncate if longer than 15 chars\n    if (shortrefs.length > 17) {\n      shortrefs = `${shortrefs.substr(0, 15)}…`;\n    }\n    const text = r.text(x + 4, y, shortrefs).attr({\n      'text-anchor': 'start',\n      font: '10px Monaco, monospace',\n      fill: '#FFF',\n      title: commit.refs,\n    });\n    const textbox = text.getBBox();\n    // Create rectangle based on the size of the textbox\n    const rect = r.rect(x, y - 7, textbox.width + 5, textbox.height + 5, 4).attr({\n      fill: '#000',\n      'fill-opacity': 0.5,\n      stroke: 'none',\n    });\n    // Generate the triangle right of the tag box\n    r.path(['M', x - 5, y, 'L', x - 15, y - 4, 'L', x - 15, y + 4, 'Z']).attr({\n      fill: '#000',\n      'fill-opacity': 0.5,\n      stroke: 'none',\n    });\n    const label = r.set(rect, text);\n    label.transform(['t', -rect.getBBox().width - 15, 0]);\n    // Set text to front\n    return text.toFront();\n  }\n\n  appendAnchor(x, y, commit) {\n    const { r, top, options } = this;\n    r.circle(x, y, 10)\n      .attr({\n        fill: '#000',\n        opacity: 0,\n        cursor: 'pointer',\n      })\n      .click(() => visitUrl(options.commit_url.replace('%s', commit.id), true))\n      .hover(\n        function () {\n          this.tooltip = r.commitTooltip(x + 5, y, commit);\n          top.push(this.tooltip.insertBefore(this));\n          return this.tooltip.toFront();\n        },\n        function () {\n          top.remove(this.tooltip);\n          return this.tooltip && this.tooltip.remove() && delete this.tooltip;\n        },\n      );\n  }\n\n  drawDot(x, y, commit) {\n    const { r } = this;\n    r.circle(x, y, 3).attr({\n      fill: this.colors[commit.space],\n      stroke: 'none',\n    });\n\n    const avatarBoxX = this.offsetX + this.unitSpace * this.mspace + 10;\n    const avatarBoxY = y - 10;\n\n    r.rect(avatarBoxX, avatarBoxY, 20, 20).attr({\n      stroke: this.colors[commit.space],\n      'stroke-width': 2,\n    });\n    r.image(commit.author.icon, avatarBoxX, avatarBoxY, 20, 20);\n    return r\n      .text(this.offsetX + this.unitSpace * this.mspace + 35, y, commit.message.split('\\n')[0])\n      .attr({\n        fill: 'currentColor',\n        class: 'gl-text-default',\n        'text-anchor': 'start',\n        font: '14px Monaco, monospace',\n      });\n  }\n\n  drawLines(x, y, commit) {\n    let i = 0;\n    let len = 0;\n    let arrow = '';\n    let offset = [];\n    let color = [];\n    const { r } = this;\n    const ref = commit.parents;\n    const results = [];\n    for (i = 0, len = ref.length; i < len; i += 1) {\n      const parent = ref[i];\n      const parentCommit = this.preparedCommits[parent[0]];\n      const parentY = this.offsetY + this.unitTime * parentCommit.time;\n      const parentX1 = this.offsetX + this.unitSpace * (this.mspace - parentCommit.space);\n      const parentX2 = this.offsetX + this.unitSpace * (this.mspace - parent[1]);\n      // Set line color\n      if (parentCommit.space <= commit.space) {\n        color = this.colors[commit.space];\n      } else {\n        color = this.colors[parentCommit.space];\n      }\n      // Build line shape\n      if (parent[1] === commit.space) {\n        offset = [0, 5];\n        arrow = 'l-2,5,4,0,-2,-5,0,5';\n      } else if (parent[1] < commit.space) {\n        offset = [3, 3];\n        arrow = 'l5,0,-2,4,-3,-4,4,2';\n      } else {\n        offset = [-3, 3];\n        arrow = 'l-5,0,2,4,3,-4,-4,2';\n      }\n      // Start point\n      const route = ['M', x + offset[0], y + offset[1]];\n      // Add arrow if not first parent\n      if (i > 0) {\n        route.push(arrow);\n      }\n      // Circumvent if overlap\n      if (commit.space !== parentCommit.space || commit.space !== parent[1]) {\n        route.push('L', parentX2, y + 10, 'L', parentX2, parentY - 5);\n      }\n      // End point\n      route.push('L', parentX1, parentY);\n      results.push(\n        r.path(route).attr({\n          stroke: color,\n          'stroke-width': 2,\n        }),\n      );\n    }\n    return results;\n  }\n\n  markCommit(commit) {\n    if (commit.id === this.options.commit_id) {\n      const { r } = this;\n      const x = this.offsetX + this.unitSpace * (this.mspace - commit.space);\n      const y = this.offsetY + this.unitTime * commit.time;\n      r.path(['M', x + 5, y, 'L', x + 15, y + 4, 'L', x + 15, y - 4, 'Z']).attr({\n        fill: '#000',\n        'fill-opacity': 0.5,\n        stroke: 'none',\n      });\n      // Displayed in the center\n      return this.element.scrollTop(y - this.graphHeight / 2);\n    }\n  }\n}\n","import $ from 'jquery';\nimport BranchGraph from '~/network/branch_graph';\n\nconst vph = $(window).height() - 250;\n\nexport default class Network {\n  constructor(opts) {\n    this.opts = opts;\n    this.filter_ref = $('#filter_ref');\n    this.network_graph = $('.network-graph');\n    this.filter_ref.click(() => this.submit());\n    this.branch_graph = new BranchGraph(this.network_graph, this.opts);\n    this.network_graph.css({ height: `${vph}px` });\n  }\n\n  submit() {\n    return this.filter_ref.closest('form').submit();\n  }\n}\n","import $ from 'jquery';\nimport Vue from 'vue';\nimport { visitUrl, joinPaths } from '~/lib/utils/url_utility';\nimport { addShortcutsExtension } from '~/behaviors/shortcuts';\nimport ShortcutsNetwork from '~/behaviors/shortcuts/shortcuts_network';\nimport RefSelector from '~/ref/components/ref_selector.vue';\nimport Network from '../network';\n\nconst initRefSwitcher = () => {\n  const refSwitcherEl = document.getElementById('js-graph-ref-switcher');\n  const NETWORK_PATH_REGEX = /^(.*?)\\/-\\/network/g;\n\n  if (!refSwitcherEl) return false;\n\n  const { projectId, ref, networkPath } = refSwitcherEl.dataset;\n  const networkRootPath = networkPath.match(NETWORK_PATH_REGEX)?.[0]; // gets the network path without the ref\n\n  return new Vue({\n    el: refSwitcherEl,\n    render(createElement) {\n      return createElement(RefSelector, {\n        props: {\n          projectId,\n          value: ref,\n        },\n        on: {\n          input(selectedRef) {\n            visitUrl(joinPaths(networkRootPath, encodeURIComponent(selectedRef)));\n          },\n        },\n      });\n    },\n  });\n};\n\ninitRefSwitcher();\n\n(() => {\n  if (!$('.network-graph').length) return;\n\n  const networkGraph = new Network({\n    url: $('.network-graph').attr('data-url'),\n    commit_url: $('.network-graph').attr('data-commit-url'),\n    ref: $('.network-graph').attr('data-ref'),\n    commit_id: $('.network-graph').attr('data-commit-id'),\n  });\n\n  addShortcutsExtension(ShortcutsNetwork, networkGraph.branch_graph);\n})();\n","export const HTTP_STATUS_ABORTED = 0;\nexport const HTTP_STATUS_OK = 200;\nexport const HTTP_STATUS_CREATED = 201;\nexport const HTTP_STATUS_ACCEPTED = 202;\nexport const HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203;\nexport const HTTP_STATUS_NO_CONTENT = 204;\nexport const HTTP_STATUS_RESET_CONTENT = 205;\nexport const HTTP_STATUS_PARTIAL_CONTENT = 206;\nexport const HTTP_STATUS_MULTI_STATUS = 207;\nexport const HTTP_STATUS_ALREADY_REPORTED = 208;\nexport const HTTP_STATUS_IM_USED = 226;\nexport const HTTP_STATUS_BAD_REQUEST = 400;\nexport const HTTP_STATUS_UNAUTHORIZED = 401;\nexport const HTTP_STATUS_FORBIDDEN = 403;\nexport const HTTP_STATUS_NOT_FOUND = 404;\nexport const HTTP_STATUS_METHOD_NOT_ALLOWED = 405;\nexport const HTTP_STATUS_CONFLICT = 409;\nexport const HTTP_STATUS_GONE = 410;\nexport const HTTP_STATUS_PAYLOAD_TOO_LARGE = 413;\nexport const HTTP_STATUS_IM_A_TEAPOT = 418;\nexport const HTTP_STATUS_UNPROCESSABLE_ENTITY = 422;\nexport const HTTP_STATUS_TOO_MANY_REQUESTS = 429;\nexport const HTTP_STATUS_INTERNAL_SERVER_ERROR = 500;\nexport const HTTP_STATUS_SERVICE_UNAVAILABLE = 503;\n\nexport const successCodes = [\n  HTTP_STATUS_OK,\n  HTTP_STATUS_CREATED,\n  HTTP_STATUS_ACCEPTED,\n  HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION,\n  HTTP_STATUS_NO_CONTENT,\n  HTTP_STATUS_RESET_CONTENT,\n  HTTP_STATUS_PARTIAL_CONTENT,\n  HTTP_STATUS_MULTI_STATUS,\n  HTTP_STATUS_ALREADY_REPORTED,\n  HTTP_STATUS_IM_USED,\n];\n","// ┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ \\\\\n// │ Raphaël 2.2.0 - JavaScript Vector Library                                                             │ \\\\\n// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\\\\n// │ Copyright © 2008-2016 Dmitry Baranovskiy (http://raphaeljs.com)                                       │ \\\\\n// │ Copyright © 2008-2016 Sencha Labs (http://sencha.com)                                                 │ \\\\\n// ├───────────────────────────────────────────────────────────────────────────────────────────────────────┤ \\\\\n// │ Licensed under the MIT (https://github.com/DmitryBaranovskiy/raphael/blob/master/license.txt) license.│ \\\\\n// └───────────────────────────────────────────────────────────────────────────────────────────────────────┘ \\\\\n\n(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[\"Raphael\"] = factory();\n\telse\n\t\troot[\"Raphael\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \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\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1), __webpack_require__(3), __webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\n\n\t    return R;\n\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(2)], __WEBPACK_AMD_DEFINE_RESULT__ = function(eve) {\n\n\t    /*\\\n\t     * Raphael\n\t     [ method ]\n\t     **\n\t     * Creates a canvas object on which to draw.\n\t     * You must do this first, as all future calls to drawing methods\n\t     * from this instance will be bound to this canvas.\n\t     > Parameters\n\t     **\n\t     - container (HTMLElement|string) DOM element or its ID which is going to be a parent for drawing surface\n\t     - width (number)\n\t     - height (number)\n\t     - callback (function) #optional callback function which is going to be executed in the context of newly created paper\n\t     * or\n\t     - x (number)\n\t     - y (number)\n\t     - width (number)\n\t     - height (number)\n\t     - callback (function) #optional callback function which is going to be executed in the context of newly created paper\n\t     * or\n\t     - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, <attributes>}). See @Paper.add.\n\t     - callback (function) #optional callback function which is going to be executed in the context of newly created paper\n\t     * or\n\t     - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve’s “DOMLoad” event. In this case method returns `undefined`.\n\t     = (object) @Paper\n\t     > Usage\n\t     | // Each of the following examples create a canvas\n\t     | // that is 320px wide by 200px high.\n\t     | // Canvas is created at the viewport’s 10,50 coordinate.\n\t     | var paper = Raphael(10, 50, 320, 200);\n\t     | // Canvas is created at the top left corner of the #notepad element\n\t     | // (or its top right corner in dir=\"rtl\" elements)\n\t     | var paper = Raphael(document.getElementById(\"notepad\"), 320, 200);\n\t     | // Same as above\n\t     | var paper = Raphael(\"notepad\", 320, 200);\n\t     | // Image dump\n\t     | var set = Raphael([\"notepad\", 320, 200, {\n\t     |     type: \"rect\",\n\t     |     x: 10,\n\t     |     y: 10,\n\t     |     width: 25,\n\t     |     height: 25,\n\t     |     stroke: \"#f00\"\n\t     | }, {\n\t     |     type: \"text\",\n\t     |     x: 30,\n\t     |     y: 40,\n\t     |     text: \"Dump\"\n\t     | }]);\n\t    \\*/\n\t    function R(first) {\n\t        if (R.is(first, \"function\")) {\n\t            return loaded ? first() : eve.on(\"raphael.DOMload\", first);\n\t        } else if (R.is(first, array)) {\n\t            return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first);\n\t        } else {\n\t            var args = Array.prototype.slice.call(arguments, 0);\n\t            if (R.is(args[args.length - 1], \"function\")) {\n\t                var f = args.pop();\n\t                return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on(\"raphael.DOMload\", function () {\n\t                    f.call(R._engine.create[apply](R, args));\n\t                });\n\t            } else {\n\t                return R._engine.create[apply](R, arguments);\n\t            }\n\t        }\n\t    }\n\t    R.version = \"2.2.0\";\n\t    R.eve = eve;\n\t    var loaded,\n\t        separator = /[, ]+/,\n\t        elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1},\n\t        formatrg = /\\{(\\d+)\\}/g,\n\t        proto = \"prototype\",\n\t        has = \"hasOwnProperty\",\n\t        g = {\n\t            doc: document,\n\t            win: window\n\t        },\n\t        oldRaphael = {\n\t            was: Object.prototype[has].call(g.win, \"Raphael\"),\n\t            is: g.win.Raphael\n\t        },\n\t        Paper = function () {\n\t            /*\\\n\t             * Paper.ca\n\t             [ property (object) ]\n\t             **\n\t             * Shortcut for @Paper.customAttributes\n\t            \\*/\n\t            /*\\\n\t             * Paper.customAttributes\n\t             [ property (object) ]\n\t             **\n\t             * If you have a set of attributes that you would like to represent\n\t             * as a function of some number you can do it easily with custom attributes:\n\t             > Usage\n\t             | paper.customAttributes.hue = function (num) {\n\t             |     num = num % 1;\n\t             |     return {fill: \"hsb(\" + num + \", 0.75, 1)\"};\n\t             | };\n\t             | // Custom attribute “hue” will change fill\n\t             | // to be given hue with fixed saturation and brightness.\n\t             | // Now you can use it like this:\n\t             | var c = paper.circle(10, 10, 10).attr({hue: .45});\n\t             | // or even like this:\n\t             | c.animate({hue: 1}, 1e3);\n\t             |\n\t             | // You could also create custom attribute\n\t             | // with multiple parameters:\n\t             | paper.customAttributes.hsb = function (h, s, b) {\n\t             |     return {fill: \"hsb(\" + [h, s, b].join(\",\") + \")\"};\n\t             | };\n\t             | c.attr({hsb: \"0.5 .8 1\"});\n\t             | c.animate({hsb: [1, 0, 0.5]}, 1e3);\n\t            \\*/\n\t            this.ca = this.customAttributes = {};\n\t        },\n\t        paperproto,\n\t        appendChild = \"appendChild\",\n\t        apply = \"apply\",\n\t        concat = \"concat\",\n\t        supportsTouch = ('ontouchstart' in g.win) || g.win.DocumentTouch && g.doc instanceof DocumentTouch, //taken from Modernizr touch test\n\t        E = \"\",\n\t        S = \" \",\n\t        Str = String,\n\t        split = \"split\",\n\t        events = \"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel\"[split](S),\n\t        touchMap = {\n\t            mousedown: \"touchstart\",\n\t            mousemove: \"touchmove\",\n\t            mouseup: \"touchend\"\n\t        },\n\t        lowerCase = Str.prototype.toLowerCase,\n\t        math = Math,\n\t        mmax = math.max,\n\t        mmin = math.min,\n\t        abs = math.abs,\n\t        pow = math.pow,\n\t        PI = math.PI,\n\t        nu = \"number\",\n\t        string = \"string\",\n\t        array = \"array\",\n\t        toString = \"toString\",\n\t        fillString = \"fill\",\n\t        objectToString = Object.prototype.toString,\n\t        paper = {},\n\t        push = \"push\",\n\t        ISURL = R._ISURL = /^url\\(['\"]?(.+?)['\"]?\\)$/i,\n\t        colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\))\\s*$/i,\n\t        isnan = {\"NaN\": 1, \"Infinity\": 1, \"-Infinity\": 1},\n\t        bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n\t        round = math.round,\n\t        setAttribute = \"setAttribute\",\n\t        toFloat = parseFloat,\n\t        toInt = parseInt,\n\t        upperCase = Str.prototype.toUpperCase,\n\t        availableAttrs = R._availableAttrs = {\n\t            \"arrow-end\": \"none\",\n\t            \"arrow-start\": \"none\",\n\t            blur: 0,\n\t            \"clip-rect\": \"0 0 1e9 1e9\",\n\t            cursor: \"default\",\n\t            cx: 0,\n\t            cy: 0,\n\t            fill: \"#fff\",\n\t            \"fill-opacity\": 1,\n\t            font: '10px \"Arial\"',\n\t            \"font-family\": '\"Arial\"',\n\t            \"font-size\": \"10\",\n\t            \"font-style\": \"normal\",\n\t            \"font-weight\": 400,\n\t            gradient: 0,\n\t            height: 0,\n\t            href: \"http://raphaeljs.com/\",\n\t            \"letter-spacing\": 0,\n\t            opacity: 1,\n\t            path: \"M0,0\",\n\t            r: 0,\n\t            rx: 0,\n\t            ry: 0,\n\t            src: \"\",\n\t            stroke: \"#000\",\n\t            \"stroke-dasharray\": \"\",\n\t            \"stroke-linecap\": \"butt\",\n\t            \"stroke-linejoin\": \"butt\",\n\t            \"stroke-miterlimit\": 0,\n\t            \"stroke-opacity\": 1,\n\t            \"stroke-width\": 1,\n\t            target: \"_blank\",\n\t            \"text-anchor\": \"middle\",\n\t            title: \"Raphael\",\n\t            transform: \"\",\n\t            width: 0,\n\t            x: 0,\n\t            y: 0,\n\t            \"class\": \"\"\n\t        },\n\t        availableAnimAttrs = R._availableAnimAttrs = {\n\t            blur: nu,\n\t            \"clip-rect\": \"csv\",\n\t            cx: nu,\n\t            cy: nu,\n\t            fill: \"colour\",\n\t            \"fill-opacity\": nu,\n\t            \"font-size\": nu,\n\t            height: nu,\n\t            opacity: nu,\n\t            path: \"path\",\n\t            r: nu,\n\t            rx: nu,\n\t            ry: nu,\n\t            stroke: \"colour\",\n\t            \"stroke-opacity\": nu,\n\t            \"stroke-width\": nu,\n\t            transform: \"transform\",\n\t            width: nu,\n\t            x: nu,\n\t            y: nu\n\t        },\n\t        whitespace = /[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]/g,\n\t        commaSpaces = /[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/,\n\t        hsrg = {hs: 1, rg: 1},\n\t        p2s = /,?([achlmqrstvxz]),?/gi,\n\t        pathCommand = /([achlmrqstvz])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/ig,\n\t        tCommand = /([rstm])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/ig,\n\t        pathValues = /(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/ig,\n\t        radial_gradient = R._radial_gradient = /^r(?:\\(([^,]+?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*([^\\)]+?)\\))?/,\n\t        eldata = {},\n\t        sortByKey = function (a, b) {\n\t            return a.key - b.key;\n\t        },\n\t        sortByNumber = function (a, b) {\n\t            return toFloat(a) - toFloat(b);\n\t        },\n\t        fun = function () {},\n\t        pipe = function (x) {\n\t            return x;\n\t        },\n\t        rectPath = R._rectPath = function (x, y, w, h, r) {\n\t            if (r) {\n\t                return [[\"M\", x + r, y], [\"l\", w - r * 2, 0], [\"a\", r, r, 0, 0, 1, r, r], [\"l\", 0, h - r * 2], [\"a\", r, r, 0, 0, 1, -r, r], [\"l\", r * 2 - w, 0], [\"a\", r, r, 0, 0, 1, -r, -r], [\"l\", 0, r * 2 - h], [\"a\", r, r, 0, 0, 1, r, -r], [\"z\"]];\n\t            }\n\t            return [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n\t        },\n\t        ellipsePath = function (x, y, rx, ry) {\n\t            if (ry == null) {\n\t                ry = rx;\n\t            }\n\t            return [[\"M\", x, y], [\"m\", 0, -ry], [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry], [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry], [\"z\"]];\n\t        },\n\t        getPath = R._getPath = {\n\t            path: function (el) {\n\t                return el.attr(\"path\");\n\t            },\n\t            circle: function (el) {\n\t                var a = el.attrs;\n\t                return ellipsePath(a.cx, a.cy, a.r);\n\t            },\n\t            ellipse: function (el) {\n\t                var a = el.attrs;\n\t                return ellipsePath(a.cx, a.cy, a.rx, a.ry);\n\t            },\n\t            rect: function (el) {\n\t                var a = el.attrs;\n\t                return rectPath(a.x, a.y, a.width, a.height, a.r);\n\t            },\n\t            image: function (el) {\n\t                var a = el.attrs;\n\t                return rectPath(a.x, a.y, a.width, a.height);\n\t            },\n\t            text: function (el) {\n\t                var bbox = el._getBBox();\n\t                return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n\t            },\n\t            set : function(el) {\n\t                var bbox = el._getBBox();\n\t                return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n\t            }\n\t        },\n\t        /*\\\n\t         * Raphael.mapPath\n\t         [ method ]\n\t         **\n\t         * Transform the path string with given matrix.\n\t         > Parameters\n\t         - path (string) path string\n\t         - matrix (object) see @Matrix\n\t         = (string) transformed path string\n\t        \\*/\n\t        mapPath = R.mapPath = function (path, matrix) {\n\t            if (!matrix) {\n\t                return path;\n\t            }\n\t            var x, y, i, j, ii, jj, pathi;\n\t            path = path2curve(path);\n\t            for (i = 0, ii = path.length; i < ii; i++) {\n\t                pathi = path[i];\n\t                for (j = 1, jj = pathi.length; j < jj; j += 2) {\n\t                    x = matrix.x(pathi[j], pathi[j + 1]);\n\t                    y = matrix.y(pathi[j], pathi[j + 1]);\n\t                    pathi[j] = x;\n\t                    pathi[j + 1] = y;\n\t                }\n\t            }\n\t            return path;\n\t        };\n\n\t    R._g = g;\n\t    /*\\\n\t     * Raphael.type\n\t     [ property (string) ]\n\t     **\n\t     * Can be “SVG”, “VML” or empty, depending on browser support.\n\t    \\*/\n\t    R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\") ? \"SVG\" : \"VML\");\n\t    if (R.type == \"VML\") {\n\t        var d = g.doc.createElement(\"div\"),\n\t            b;\n\t        d.innerHTML = '<v:shape adj=\"1\"/>';\n\t        b = d.firstChild;\n\t        b.style.behavior = \"url(#default#VML)\";\n\t        if (!(b && typeof b.adj == \"object\")) {\n\t            return (R.type = E);\n\t        }\n\t        d = null;\n\t    }\n\t    /*\\\n\t     * Raphael.svg\n\t     [ property (boolean) ]\n\t     **\n\t     * `true` if browser supports SVG.\n\t    \\*/\n\t    /*\\\n\t     * Raphael.vml\n\t     [ property (boolean) ]\n\t     **\n\t     * `true` if browser supports VML.\n\t    \\*/\n\t    R.svg = !(R.vml = R.type == \"VML\");\n\t    R._Paper = Paper;\n\t    /*\\\n\t     * Raphael.fn\n\t     [ property (object) ]\n\t     **\n\t     * You can add your own method to the canvas. For example if you want to draw a pie chart,\n\t     * you can create your own pie chart function and ship it as a Raphaël plugin. To do this\n\t     * you need to extend the `Raphael.fn` object. You should modify the `fn` object before a\n\t     * Raphaël instance is created, otherwise it will take no effect. Please note that the\n\t     * ability for namespaced plugins was removed in Raphael 2.0. It is up to the plugin to\n\t     * ensure any namespacing ensures proper context.\n\t     > Usage\n\t     | Raphael.fn.arrow = function (x1, y1, x2, y2, size) {\n\t     |     return this.path( ... );\n\t     | };\n\t     | // or create namespace\n\t     | Raphael.fn.mystuff = {\n\t     |     arrow: function () {…},\n\t     |     star: function () {…},\n\t     |     // etc…\n\t     | };\n\t     | var paper = Raphael(10, 10, 630, 480);\n\t     | // then use it\n\t     | paper.arrow(10, 10, 30, 30, 5).attr({fill: \"#f00\"});\n\t     | paper.mystuff.arrow();\n\t     | paper.mystuff.star();\n\t    \\*/\n\t    R.fn = paperproto = Paper.prototype = R.prototype;\n\t    R._id = 0;\n\t    /*\\\n\t     * Raphael.is\n\t     [ method ]\n\t     **\n\t     * Handful of replacements for `typeof` operator.\n\t     > Parameters\n\t     - o (…) any object or primitive\n\t     - type (string) name of the type, i.e. “string”, “function”, “number”, etc.\n\t     = (boolean) is given value is of given type\n\t    \\*/\n\t    R.is = function (o, type) {\n\t        type = lowerCase.call(type);\n\t        if (type == \"finite\") {\n\t            return !isnan[has](+o);\n\t        }\n\t        if (type == \"array\") {\n\t            return o instanceof Array;\n\t        }\n\t        return  (type == \"null\" && o === null) ||\n\t                (type == typeof o && o !== null) ||\n\t                (type == \"object\" && o === Object(o)) ||\n\t                (type == \"array\" && Array.isArray && Array.isArray(o)) ||\n\t                objectToString.call(o).slice(8, -1).toLowerCase() == type;\n\t    };\n\n\t    function clone(obj) {\n\t        if (typeof obj == \"function\" || Object(obj) !== obj) {\n\t            return obj;\n\t        }\n\t        var res = new obj.constructor;\n\t        for (var key in obj) if (obj[has](key)) {\n\t            res[key] = clone(obj[key]);\n\t        }\n\t        return res;\n\t    }\n\n\t    /*\\\n\t     * Raphael.angle\n\t     [ method ]\n\t     **\n\t     * Returns angle between two or three points\n\t     > Parameters\n\t     - x1 (number) x coord of first point\n\t     - y1 (number) y coord of first point\n\t     - x2 (number) x coord of second point\n\t     - y2 (number) y coord of second point\n\t     - x3 (number) #optional x coord of third point\n\t     - y3 (number) #optional y coord of third point\n\t     = (number) angle in degrees.\n\t    \\*/\n\t    R.angle = function (x1, y1, x2, y2, x3, y3) {\n\t        if (x3 == null) {\n\t            var x = x1 - x2,\n\t                y = y1 - y2;\n\t            if (!x && !y) {\n\t                return 0;\n\t            }\n\t            return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n\t        } else {\n\t            return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3);\n\t        }\n\t    };\n\t    /*\\\n\t     * Raphael.rad\n\t     [ method ]\n\t     **\n\t     * Transform angle to radians\n\t     > Parameters\n\t     - deg (number) angle in degrees\n\t     = (number) angle in radians.\n\t    \\*/\n\t    R.rad = function (deg) {\n\t        return deg % 360 * PI / 180;\n\t    };\n\t    /*\\\n\t     * Raphael.deg\n\t     [ method ]\n\t     **\n\t     * Transform angle to degrees\n\t     > Parameters\n\t     - rad (number) angle in radians\n\t     = (number) angle in degrees.\n\t    \\*/\n\t    R.deg = function (rad) {\n\t        return Math.round ((rad * 180 / PI% 360)* 1000) / 1000;\n\t    };\n\t    /*\\\n\t     * Raphael.snapTo\n\t     [ method ]\n\t     **\n\t     * Snaps given value to given grid.\n\t     > Parameters\n\t     - values (array|number) given array of values or step of the grid\n\t     - value (number) value to adjust\n\t     - tolerance (number) #optional tolerance for snapping. Default is `10`.\n\t     = (number) adjusted value.\n\t    \\*/\n\t    R.snapTo = function (values, value, tolerance) {\n\t        tolerance = R.is(tolerance, \"finite\") ? tolerance : 10;\n\t        if (R.is(values, array)) {\n\t            var i = values.length;\n\t            while (i--) if (abs(values[i] - value) <= tolerance) {\n\t                return values[i];\n\t            }\n\t        } else {\n\t            values = +values;\n\t            var rem = value % values;\n\t            if (rem < tolerance) {\n\t                return value - rem;\n\t            }\n\t            if (rem > values - tolerance) {\n\t                return value - rem + values;\n\t            }\n\t        }\n\t        return value;\n\t    };\n\n\t    /*\\\n\t     * Raphael.createUUID\n\t     [ method ]\n\t     **\n\t     * Returns RFC4122, version 4 ID\n\t    \\*/\n\t    var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) {\n\t        return function () {\n\t            return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(uuidRegEx, uuidReplacer).toUpperCase();\n\t        };\n\t    })(/[xy]/g, function (c) {\n\t        var r = math.random() * 16 | 0,\n\t            v = c == \"x\" ? r : (r & 3 | 8);\n\t        return v.toString(16);\n\t    });\n\n\t    /*\\\n\t     * Raphael.setWindow\n\t     [ method ]\n\t     **\n\t     * Used when you need to draw in `&lt;iframe>`. Switched window to the iframe one.\n\t     > Parameters\n\t     - newwin (window) new window object\n\t    \\*/\n\t    R.setWindow = function (newwin) {\n\t        eve(\"raphael.setWindow\", R, g.win, newwin);\n\t        g.win = newwin;\n\t        g.doc = g.win.document;\n\t        if (R._engine.initWin) {\n\t            R._engine.initWin(g.win);\n\t        }\n\t    };\n\t    var toHex = function (color) {\n\t        if (R.vml) {\n\t            // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/\n\t            var trim = /^\\s+|\\s+$/g;\n\t            var bod;\n\t            try {\n\t                var docum = new ActiveXObject(\"htmlfile\");\n\t                docum.write(\"<body>\");\n\t                docum.close();\n\t                bod = docum.body;\n\t            } catch(e) {\n\t                bod = createPopup().document.body;\n\t            }\n\t            var range = bod.createTextRange();\n\t            toHex = cacher(function (color) {\n\t                try {\n\t                    bod.style.color = Str(color).replace(trim, E);\n\t                    var value = range.queryCommandValue(\"ForeColor\");\n\t                    value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16);\n\t                    return \"#\" + (\"000000\" + value.toString(16)).slice(-6);\n\t                } catch(e) {\n\t                    return \"none\";\n\t                }\n\t            });\n\t        } else {\n\t            var i = g.doc.createElement(\"i\");\n\t            i.title = \"Rapha\\xebl Colour Picker\";\n\t            i.style.display = \"none\";\n\t            g.doc.body.appendChild(i);\n\t            toHex = cacher(function (color) {\n\t                i.style.color = color;\n\t                return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n\t            });\n\t        }\n\t        return toHex(color);\n\t    },\n\t    hsbtoString = function () {\n\t        return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n\t    },\n\t    hsltoString = function () {\n\t        return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n\t    },\n\t    rgbtoString = function () {\n\t        return this.hex;\n\t    },\n\t    prepareRGB = function (r, g, b) {\n\t        if (g == null && R.is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n\t            b = r.b;\n\t            g = r.g;\n\t            r = r.r;\n\t        }\n\t        if (g == null && R.is(r, string)) {\n\t            var clr = R.getRGB(r);\n\t            r = clr.r;\n\t            g = clr.g;\n\t            b = clr.b;\n\t        }\n\t        if (r > 1 || g > 1 || b > 1) {\n\t            r /= 255;\n\t            g /= 255;\n\t            b /= 255;\n\t        }\n\n\t        return [r, g, b];\n\t    },\n\t    packageRGB = function (r, g, b, o) {\n\t        r *= 255;\n\t        g *= 255;\n\t        b *= 255;\n\t        var rgb = {\n\t            r: r,\n\t            g: g,\n\t            b: b,\n\t            hex: R.rgb(r, g, b),\n\t            toString: rgbtoString\n\t        };\n\t        R.is(o, \"finite\") && (rgb.opacity = o);\n\t        return rgb;\n\t    };\n\n\t    /*\\\n\t     * Raphael.color\n\t     [ method ]\n\t     **\n\t     * Parses the color string and returns object with all values for the given color.\n\t     > Parameters\n\t     - clr (string) color string in one of the supported formats (see @Raphael.getRGB)\n\t     = (object) Combined RGB & HSB object in format:\n\t     o {\n\t     o     r (number) red,\n\t     o     g (number) green,\n\t     o     b (number) blue,\n\t     o     hex (string) color in HTML/CSS format: #••••••,\n\t     o     error (boolean) `true` if string can’t be parsed,\n\t     o     h (number) hue,\n\t     o     s (number) saturation,\n\t     o     v (number) value (brightness),\n\t     o     l (number) lightness\n\t     o }\n\t    \\*/\n\t    R.color = function (clr) {\n\t        var rgb;\n\t        if (R.is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n\t            rgb = R.hsb2rgb(clr);\n\t            clr.r = rgb.r;\n\t            clr.g = rgb.g;\n\t            clr.b = rgb.b;\n\t            clr.hex = rgb.hex;\n\t        } else if (R.is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n\t            rgb = R.hsl2rgb(clr);\n\t            clr.r = rgb.r;\n\t            clr.g = rgb.g;\n\t            clr.b = rgb.b;\n\t            clr.hex = rgb.hex;\n\t        } else {\n\t            if (R.is(clr, \"string\")) {\n\t                clr = R.getRGB(clr);\n\t            }\n\t            if (R.is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr) {\n\t                rgb = R.rgb2hsl(clr);\n\t                clr.h = rgb.h;\n\t                clr.s = rgb.s;\n\t                clr.l = rgb.l;\n\t                rgb = R.rgb2hsb(clr);\n\t                clr.v = rgb.b;\n\t            } else {\n\t                clr = {hex: \"none\"};\n\t                clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n\t            }\n\t        }\n\t        clr.toString = rgbtoString;\n\t        return clr;\n\t    };\n\t    /*\\\n\t     * Raphael.hsb2rgb\n\t     [ method ]\n\t     **\n\t     * Converts HSB values to RGB object.\n\t     > Parameters\n\t     - h (number) hue\n\t     - s (number) saturation\n\t     - v (number) value or brightness\n\t     = (object) RGB object in format:\n\t     o {\n\t     o     r (number) red,\n\t     o     g (number) green,\n\t     o     b (number) blue,\n\t     o     hex (string) color in HTML/CSS format: #••••••\n\t     o }\n\t    \\*/\n\t    R.hsb2rgb = function (h, s, v, o) {\n\t        if (this.is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n\t            v = h.b;\n\t            s = h.s;\n\t            o = h.o;\n\t            h = h.h;\n\t        }\n\t        h *= 360;\n\t        var R, G, B, X, C;\n\t        h = (h % 360) / 60;\n\t        C = v * s;\n\t        X = C * (1 - abs(h % 2 - 1));\n\t        R = G = B = v - C;\n\n\t        h = ~~h;\n\t        R += [C, X, 0, 0, X, C][h];\n\t        G += [X, C, C, X, 0, 0][h];\n\t        B += [0, 0, X, C, C, X][h];\n\t        return packageRGB(R, G, B, o);\n\t    };\n\t    /*\\\n\t     * Raphael.hsl2rgb\n\t     [ method ]\n\t     **\n\t     * Converts HSL values to RGB object.\n\t     > Parameters\n\t     - h (number) hue\n\t     - s (number) saturation\n\t     - l (number) luminosity\n\t     = (object) RGB object in format:\n\t     o {\n\t     o     r (number) red,\n\t     o     g (number) green,\n\t     o     b (number) blue,\n\t     o     hex (string) color in HTML/CSS format: #••••••\n\t     o }\n\t    \\*/\n\t    R.hsl2rgb = function (h, s, l, o) {\n\t        if (this.is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n\t            l = h.l;\n\t            s = h.s;\n\t            h = h.h;\n\t        }\n\t        if (h > 1 || s > 1 || l > 1) {\n\t            h /= 360;\n\t            s /= 100;\n\t            l /= 100;\n\t        }\n\t        h *= 360;\n\t        var R, G, B, X, C;\n\t        h = (h % 360) / 60;\n\t        C = 2 * s * (l < .5 ? l : 1 - l);\n\t        X = C * (1 - abs(h % 2 - 1));\n\t        R = G = B = l - C / 2;\n\n\t        h = ~~h;\n\t        R += [C, X, 0, 0, X, C][h];\n\t        G += [X, C, C, X, 0, 0][h];\n\t        B += [0, 0, X, C, C, X][h];\n\t        return packageRGB(R, G, B, o);\n\t    };\n\t    /*\\\n\t     * Raphael.rgb2hsb\n\t     [ method ]\n\t     **\n\t     * Converts RGB values to HSB object.\n\t     > Parameters\n\t     - r (number) red\n\t     - g (number) green\n\t     - b (number) blue\n\t     = (object) HSB object in format:\n\t     o {\n\t     o     h (number) hue\n\t     o     s (number) saturation\n\t     o     b (number) brightness\n\t     o }\n\t    \\*/\n\t    R.rgb2hsb = function (r, g, b) {\n\t        b = prepareRGB(r, g, b);\n\t        r = b[0];\n\t        g = b[1];\n\t        b = b[2];\n\n\t        var H, S, V, C;\n\t        V = mmax(r, g, b);\n\t        C = V - mmin(r, g, b);\n\t        H = (C == 0 ? null :\n\t             V == r ? (g - b) / C :\n\t             V == g ? (b - r) / C + 2 :\n\t                      (r - g) / C + 4\n\t            );\n\t        H = ((H + 360) % 6) * 60 / 360;\n\t        S = C == 0 ? 0 : C / V;\n\t        return {h: H, s: S, b: V, toString: hsbtoString};\n\t    };\n\t    /*\\\n\t     * Raphael.rgb2hsl\n\t     [ method ]\n\t     **\n\t     * Converts RGB values to HSL object.\n\t     > Parameters\n\t     - r (number) red\n\t     - g (number) green\n\t     - b (number) blue\n\t     = (object) HSL object in format:\n\t     o {\n\t     o     h (number) hue\n\t     o     s (number) saturation\n\t     o     l (number) luminosity\n\t     o }\n\t    \\*/\n\t    R.rgb2hsl = function (r, g, b) {\n\t        b = prepareRGB(r, g, b);\n\t        r = b[0];\n\t        g = b[1];\n\t        b = b[2];\n\n\t        var H, S, L, M, m, C;\n\t        M = mmax(r, g, b);\n\t        m = mmin(r, g, b);\n\t        C = M - m;\n\t        H = (C == 0 ? null :\n\t             M == r ? (g - b) / C :\n\t             M == g ? (b - r) / C + 2 :\n\t                      (r - g) / C + 4);\n\t        H = ((H + 360) % 6) * 60 / 360;\n\t        L = (M + m) / 2;\n\t        S = (C == 0 ? 0 :\n\t             L < .5 ? C / (2 * L) :\n\t                      C / (2 - 2 * L));\n\t        return {h: H, s: S, l: L, toString: hsltoString};\n\t    };\n\t    R._path2string = function () {\n\t        return this.join(\",\").replace(p2s, \"$1\");\n\t    };\n\t    function repush(array, item) {\n\t        for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n\t            return array.push(array.splice(i, 1)[0]);\n\t        }\n\t    }\n\t    function cacher(f, scope, postprocessor) {\n\t        function newf() {\n\t            var arg = Array.prototype.slice.call(arguments, 0),\n\t                args = arg.join(\"\\u2400\"),\n\t                cache = newf.cache = newf.cache || {},\n\t                count = newf.count = newf.count || [];\n\t            if (cache[has](args)) {\n\t                repush(count, args);\n\t                return postprocessor ? postprocessor(cache[args]) : cache[args];\n\t            }\n\t            count.length >= 1e3 && delete cache[count.shift()];\n\t            count.push(args);\n\t            cache[args] = f[apply](scope, arg);\n\t            return postprocessor ? postprocessor(cache[args]) : cache[args];\n\t        }\n\t        return newf;\n\t    }\n\n\t    var preload = R._preload = function (src, f) {\n\t        var img = g.doc.createElement(\"img\");\n\t        img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n\t        img.onload = function () {\n\t            f.call(this);\n\t            this.onload = null;\n\t            g.doc.body.removeChild(this);\n\t        };\n\t        img.onerror = function () {\n\t            g.doc.body.removeChild(this);\n\t        };\n\t        g.doc.body.appendChild(img);\n\t        img.src = src;\n\t    };\n\n\t    function clrToString() {\n\t        return this.hex;\n\t    }\n\n\t    /*\\\n\t     * Raphael.getRGB\n\t     [ method ]\n\t     **\n\t     * Parses colour string as RGB object\n\t     > Parameters\n\t     - colour (string) colour string in one of formats:\n\t     # <ul>\n\t     #     <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li>\n\t     #     <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li>\n\t     #     <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li>\n\t     #     <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200,&nbsp;100,&nbsp;0)</code>”)</li>\n\t     #     <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>”)</li>\n\t     #     <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>”)</li>\n\t     #     <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\n\t     #     <li>hsl(•••, •••, •••) — same as hsb</li>\n\t     #     <li>hsl(•••%, •••%, •••%) — same as hsb</li>\n\t     # </ul>\n\t     = (object) RGB object in format:\n\t     o {\n\t     o     r (number) red,\n\t     o     g (number) green,\n\t     o     b (number) blue\n\t     o     hex (string) color in HTML/CSS format: #••••••,\n\t     o     error (boolean) true if string can’t be parsed\n\t     o }\n\t    \\*/\n\t    R.getRGB = cacher(function (colour) {\n\t        if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n\t            return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: clrToString};\n\t        }\n\t        if (colour == \"none\") {\n\t            return {r: -1, g: -1, b: -1, hex: \"none\", toString: clrToString};\n\t        }\n\t        !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n\t        var res,\n\t            red,\n\t            green,\n\t            blue,\n\t            opacity,\n\t            t,\n\t            values,\n\t            rgb = colour.match(colourRegExp);\n\t        if (rgb) {\n\t            if (rgb[2]) {\n\t                blue = toInt(rgb[2].substring(5), 16);\n\t                green = toInt(rgb[2].substring(3, 5), 16);\n\t                red = toInt(rgb[2].substring(1, 3), 16);\n\t            }\n\t            if (rgb[3]) {\n\t                blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n\t                green = toInt((t = rgb[3].charAt(2)) + t, 16);\n\t                red = toInt((t = rgb[3].charAt(1)) + t, 16);\n\t            }\n\t            if (rgb[4]) {\n\t                values = rgb[4][split](commaSpaces);\n\t                red = toFloat(values[0]);\n\t                values[0].slice(-1) == \"%\" && (red *= 2.55);\n\t                green = toFloat(values[1]);\n\t                values[1].slice(-1) == \"%\" && (green *= 2.55);\n\t                blue = toFloat(values[2]);\n\t                values[2].slice(-1) == \"%\" && (blue *= 2.55);\n\t                rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n\t                values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n\t            }\n\t            if (rgb[5]) {\n\t                values = rgb[5][split](commaSpaces);\n\t                red = toFloat(values[0]);\n\t                values[0].slice(-1) == \"%\" && (red *= 2.55);\n\t                green = toFloat(values[1]);\n\t                values[1].slice(-1) == \"%\" && (green *= 2.55);\n\t                blue = toFloat(values[2]);\n\t                values[2].slice(-1) == \"%\" && (blue *= 2.55);\n\t                (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n\t                rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n\t                values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n\t                return R.hsb2rgb(red, green, blue, opacity);\n\t            }\n\t            if (rgb[6]) {\n\t                values = rgb[6][split](commaSpaces);\n\t                red = toFloat(values[0]);\n\t                values[0].slice(-1) == \"%\" && (red *= 2.55);\n\t                green = toFloat(values[1]);\n\t                values[1].slice(-1) == \"%\" && (green *= 2.55);\n\t                blue = toFloat(values[2]);\n\t                values[2].slice(-1) == \"%\" && (blue *= 2.55);\n\t                (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n\t                rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n\t                values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n\t                return R.hsl2rgb(red, green, blue, opacity);\n\t            }\n\t            rgb = {r: red, g: green, b: blue, toString: clrToString};\n\t            rgb.hex = \"#\" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);\n\t            R.is(opacity, \"finite\") && (rgb.opacity = opacity);\n\t            return rgb;\n\t        }\n\t        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: clrToString};\n\t    }, R);\n\t    /*\\\n\t     * Raphael.hsb\n\t     [ method ]\n\t     **\n\t     * Converts HSB values to hex representation of the colour.\n\t     > Parameters\n\t     - h (number) hue\n\t     - s (number) saturation\n\t     - b (number) value or brightness\n\t     = (string) hex representation of the colour.\n\t    \\*/\n\t    R.hsb = cacher(function (h, s, b) {\n\t        return R.hsb2rgb(h, s, b).hex;\n\t    });\n\t    /*\\\n\t     * Raphael.hsl\n\t     [ method ]\n\t     **\n\t     * Converts HSL values to hex representation of the colour.\n\t     > Parameters\n\t     - h (number) hue\n\t     - s (number) saturation\n\t     - l (number) luminosity\n\t     = (string) hex representation of the colour.\n\t    \\*/\n\t    R.hsl = cacher(function (h, s, l) {\n\t        return R.hsl2rgb(h, s, l).hex;\n\t    });\n\t    /*\\\n\t     * Raphael.rgb\n\t     [ method ]\n\t     **\n\t     * Converts RGB values to hex representation of the colour.\n\t     > Parameters\n\t     - r (number) red\n\t     - g (number) green\n\t     - b (number) blue\n\t     = (string) hex representation of the colour.\n\t    \\*/\n\t    R.rgb = cacher(function (r, g, b) {\n\t        function round(x) { return (x + 0.5) | 0; }\n\t        return \"#\" + (16777216 | round(b) | (round(g) << 8) | (round(r) << 16)).toString(16).slice(1);\n\t    });\n\t    /*\\\n\t     * Raphael.getColor\n\t     [ method ]\n\t     **\n\t     * On each call returns next colour in the spectrum. To reset it back to red call @Raphael.getColor.reset\n\t     > Parameters\n\t     - value (number) #optional brightness, default is `0.75`\n\t     = (string) hex representation of the colour.\n\t    \\*/\n\t    R.getColor = function (value) {\n\t        var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75},\n\t            rgb = this.hsb2rgb(start.h, start.s, start.b);\n\t        start.h += .075;\n\t        if (start.h > 1) {\n\t            start.h = 0;\n\t            start.s -= .2;\n\t            start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b});\n\t        }\n\t        return rgb.hex;\n\t    };\n\t    /*\\\n\t     * Raphael.getColor.reset\n\t     [ method ]\n\t     **\n\t     * Resets spectrum position for @Raphael.getColor back to red.\n\t    \\*/\n\t    R.getColor.reset = function () {\n\t        delete this.start;\n\t    };\n\n\t    // http://schepers.cc/getting-to-the-point\n\t    function catmullRom2bezier(crp, z) {\n\t        var d = [];\n\t        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n\t            var p = [\n\t                        {x: +crp[i - 2], y: +crp[i - 1]},\n\t                        {x: +crp[i],     y: +crp[i + 1]},\n\t                        {x: +crp[i + 2], y: +crp[i + 3]},\n\t                        {x: +crp[i + 4], y: +crp[i + 5]}\n\t                    ];\n\t            if (z) {\n\t                if (!i) {\n\t                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n\t                } else if (iLen - 4 == i) {\n\t                    p[3] = {x: +crp[0], y: +crp[1]};\n\t                } else if (iLen - 2 == i) {\n\t                    p[2] = {x: +crp[0], y: +crp[1]};\n\t                    p[3] = {x: +crp[2], y: +crp[3]};\n\t                }\n\t            } else {\n\t                if (iLen - 4 == i) {\n\t                    p[3] = p[2];\n\t                } else if (!i) {\n\t                    p[0] = {x: +crp[i], y: +crp[i + 1]};\n\t                }\n\t            }\n\t            d.push([\"C\",\n\t                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n\t                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n\t                  (p[1].x + 6 * p[2].x - p[3].x) / 6,\n\t                  (p[1].y + 6*p[2].y - p[3].y) / 6,\n\t                  p[2].x,\n\t                  p[2].y\n\t            ]);\n\t        }\n\n\t        return d;\n\t    }\n\t    /*\\\n\t     * Raphael.parsePathString\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Parses given path string into an array of arrays of path segments.\n\t     > Parameters\n\t     - pathString (string|array) path string or array of segments (in the last case it will be returned straight away)\n\t     = (array) array of segments.\n\t    \\*/\n\t    R.parsePathString = function (pathString) {\n\t        if (!pathString) {\n\t            return null;\n\t        }\n\t        var pth = paths(pathString);\n\t        if (pth.arr) {\n\t            return pathClone(pth.arr);\n\t        }\n\n\t        var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0},\n\t            data = [];\n\t        if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption\n\t            data = pathClone(pathString);\n\t        }\n\t        if (!data.length) {\n\t            Str(pathString).replace(pathCommand, function (a, b, c) {\n\t                var params = [],\n\t                    name = b.toLowerCase();\n\t                c.replace(pathValues, function (a, b) {\n\t                    b && params.push(+b);\n\t                });\n\t                if (name == \"m\" && params.length > 2) {\n\t                    data.push([b][concat](params.splice(0, 2)));\n\t                    name = \"l\";\n\t                    b = b == \"m\" ? \"l\" : \"L\";\n\t                }\n\t                if (name == \"r\") {\n\t                    data.push([b][concat](params));\n\t                } else while (params.length >= paramCounts[name]) {\n\t                    data.push([b][concat](params.splice(0, paramCounts[name])));\n\t                    if (!paramCounts[name]) {\n\t                        break;\n\t                    }\n\t                }\n\t            });\n\t        }\n\t        data.toString = R._path2string;\n\t        pth.arr = pathClone(data);\n\t        return data;\n\t    };\n\t    /*\\\n\t     * Raphael.parseTransformString\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Parses given path string into an array of transformations.\n\t     > Parameters\n\t     - TString (string|array) transform string or array of transformations (in the last case it will be returned straight away)\n\t     = (array) array of transformations.\n\t    \\*/\n\t    R.parseTransformString = cacher(function (TString) {\n\t        if (!TString) {\n\t            return null;\n\t        }\n\t        var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n\t            data = [];\n\t        if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption\n\t            data = pathClone(TString);\n\t        }\n\t        if (!data.length) {\n\t            Str(TString).replace(tCommand, function (a, b, c) {\n\t                var params = [],\n\t                    name = lowerCase.call(b);\n\t                c.replace(pathValues, function (a, b) {\n\t                    b && params.push(+b);\n\t                });\n\t                data.push([b][concat](params));\n\t            });\n\t        }\n\t        data.toString = R._path2string;\n\t        return data;\n\t    });\n\t    // PATHS\n\t    var paths = function (ps) {\n\t        var p = paths.ps = paths.ps || {};\n\t        if (p[ps]) {\n\t            p[ps].sleep = 100;\n\t        } else {\n\t            p[ps] = {\n\t                sleep: 100\n\t            };\n\t        }\n\t        setTimeout(function () {\n\t            for (var key in p) if (p[has](key) && key != ps) {\n\t                p[key].sleep--;\n\t                !p[key].sleep && delete p[key];\n\t            }\n\t        });\n\t        return p[ps];\n\t    };\n\t    /*\\\n\t     * Raphael.findDotsAtSegment\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Find dot coordinates on the given cubic bezier curve at the given t.\n\t     > Parameters\n\t     - p1x (number) x of the first point of the curve\n\t     - p1y (number) y of the first point of the curve\n\t     - c1x (number) x of the first anchor of the curve\n\t     - c1y (number) y of the first anchor of the curve\n\t     - c2x (number) x of the second anchor of the curve\n\t     - c2y (number) y of the second anchor of the curve\n\t     - p2x (number) x of the second point of the curve\n\t     - p2y (number) y of the second point of the curve\n\t     - t (number) position on the curve (0..1)\n\t     = (object) point information in format:\n\t     o {\n\t     o     x: (number) x coordinate of the point\n\t     o     y: (number) y coordinate of the point\n\t     o     m: {\n\t     o         x: (number) x coordinate of the left anchor\n\t     o         y: (number) y coordinate of the left anchor\n\t     o     }\n\t     o     n: {\n\t     o         x: (number) x coordinate of the right anchor\n\t     o         y: (number) y coordinate of the right anchor\n\t     o     }\n\t     o     start: {\n\t     o         x: (number) x coordinate of the start of the curve\n\t     o         y: (number) y coordinate of the start of the curve\n\t     o     }\n\t     o     end: {\n\t     o         x: (number) x coordinate of the end of the curve\n\t     o         y: (number) y coordinate of the end of the curve\n\t     o     }\n\t     o     alpha: (number) angle of the curve derivative at the point\n\t     o }\n\t    \\*/\n\t    R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n\t        var t1 = 1 - t,\n\t            t13 = pow(t1, 3),\n\t            t12 = pow(t1, 2),\n\t            t2 = t * t,\n\t            t3 = t2 * t,\n\t            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n\t            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n\t            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n\t            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n\t            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n\t            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n\t            ax = t1 * p1x + t * c1x,\n\t            ay = t1 * p1y + t * c1y,\n\t            cx = t1 * c2x + t * p2x,\n\t            cy = t1 * c2y + t * p2y,\n\t            alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);\n\t        (mx > nx || my < ny) && (alpha += 180);\n\t        return {\n\t            x: x,\n\t            y: y,\n\t            m: {x: mx, y: my},\n\t            n: {x: nx, y: ny},\n\t            start: {x: ax, y: ay},\n\t            end: {x: cx, y: cy},\n\t            alpha: alpha\n\t        };\n\t    };\n\t    /*\\\n\t     * Raphael.bezierBBox\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Return bounding box of a given cubic bezier curve\n\t     > Parameters\n\t     - p1x (number) x of the first point of the curve\n\t     - p1y (number) y of the first point of the curve\n\t     - c1x (number) x of the first anchor of the curve\n\t     - c1y (number) y of the first anchor of the curve\n\t     - c2x (number) x of the second anchor of the curve\n\t     - c2y (number) y of the second anchor of the curve\n\t     - p2x (number) x of the second point of the curve\n\t     - p2y (number) y of the second point of the curve\n\t     * or\n\t     - bez (array) array of six points for bezier curve\n\t     = (object) point information in format:\n\t     o {\n\t     o     min: {\n\t     o         x: (number) x coordinate of the left point\n\t     o         y: (number) y coordinate of the top point\n\t     o     }\n\t     o     max: {\n\t     o         x: (number) x coordinate of the right point\n\t     o         y: (number) y coordinate of the bottom point\n\t     o     }\n\t     o }\n\t    \\*/\n\t    R.bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n\t        if (!R.is(p1x, \"array\")) {\n\t            p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n\t        }\n\t        var bbox = curveDim.apply(null, p1x);\n\t        return {\n\t            x: bbox.min.x,\n\t            y: bbox.min.y,\n\t            x2: bbox.max.x,\n\t            y2: bbox.max.y,\n\t            width: bbox.max.x - bbox.min.x,\n\t            height: bbox.max.y - bbox.min.y\n\t        };\n\t    };\n\t    /*\\\n\t     * Raphael.isPointInsideBBox\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Returns `true` if given point is inside bounding boxes.\n\t     > Parameters\n\t     - bbox (string) bounding box\n\t     - x (string) x coordinate of the point\n\t     - y (string) y coordinate of the point\n\t     = (boolean) `true` if point inside\n\t    \\*/\n\t    R.isPointInsideBBox = function (bbox, x, y) {\n\t        return x >= bbox.x && x <= bbox.x2 && y >= bbox.y && y <= bbox.y2;\n\t    };\n\t    /*\\\n\t     * Raphael.isBBoxIntersect\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Returns `true` if two bounding boxes intersect\n\t     > Parameters\n\t     - bbox1 (string) first bounding box\n\t     - bbox2 (string) second bounding box\n\t     = (boolean) `true` if they intersect\n\t    \\*/\n\t    R.isBBoxIntersect = function (bbox1, bbox2) {\n\t        var i = R.isPointInsideBBox;\n\t        return i(bbox2, bbox1.x, bbox1.y)\n\t            || i(bbox2, bbox1.x2, bbox1.y)\n\t            || i(bbox2, bbox1.x, bbox1.y2)\n\t            || i(bbox2, bbox1.x2, bbox1.y2)\n\t            || i(bbox1, bbox2.x, bbox2.y)\n\t            || i(bbox1, bbox2.x2, bbox2.y)\n\t            || i(bbox1, bbox2.x, bbox2.y2)\n\t            || i(bbox1, bbox2.x2, bbox2.y2)\n\t            || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n\t            && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n\t    };\n\t    function base3(t, p1, p2, p3, p4) {\n\t        var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n\t            t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n\t        return t * t2 - 3 * p1 + 3 * p2;\n\t    }\n\t    function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n\t        if (z == null) {\n\t            z = 1;\n\t        }\n\t        z = z > 1 ? 1 : z < 0 ? 0 : z;\n\t        var z2 = z / 2,\n\t            n = 12,\n\t            Tvalues = [-0.1252,0.1252,-0.3678,0.3678,-0.5873,0.5873,-0.7699,0.7699,-0.9041,0.9041,-0.9816,0.9816],\n\t            Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n\t            sum = 0;\n\t        for (var i = 0; i < n; i++) {\n\t            var ct = z2 * Tvalues[i] + z2,\n\t                xbase = base3(ct, x1, x2, x3, x4),\n\t                ybase = base3(ct, y1, y2, y3, y4),\n\t                comb = xbase * xbase + ybase * ybase;\n\t            sum += Cvalues[i] * math.sqrt(comb);\n\t        }\n\t        return z2 * sum;\n\t    }\n\t    function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n\t        if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n\t            return;\n\t        }\n\t        var t = 1,\n\t            step = t / 2,\n\t            t2 = t - step,\n\t            l,\n\t            e = .01;\n\t        l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n\t        while (abs(l - ll) > e) {\n\t            step /= 2;\n\t            t2 += (l < ll ? 1 : -1) * step;\n\t            l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n\t        }\n\t        return t2;\n\t    }\n\t    function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n\t        if (\n\t            mmax(x1, x2) < mmin(x3, x4) ||\n\t            mmin(x1, x2) > mmax(x3, x4) ||\n\t            mmax(y1, y2) < mmin(y3, y4) ||\n\t            mmin(y1, y2) > mmax(y3, y4)\n\t        ) {\n\t            return;\n\t        }\n\t        var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n\t            ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n\t            denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n\t        if (!denominator) {\n\t            return;\n\t        }\n\t        var px = nx / denominator,\n\t            py = ny / denominator,\n\t            px2 = +px.toFixed(2),\n\t            py2 = +py.toFixed(2);\n\t        if (\n\t            px2 < +mmin(x1, x2).toFixed(2) ||\n\t            px2 > +mmax(x1, x2).toFixed(2) ||\n\t            px2 < +mmin(x3, x4).toFixed(2) ||\n\t            px2 > +mmax(x3, x4).toFixed(2) ||\n\t            py2 < +mmin(y1, y2).toFixed(2) ||\n\t            py2 > +mmax(y1, y2).toFixed(2) ||\n\t            py2 < +mmin(y3, y4).toFixed(2) ||\n\t            py2 > +mmax(y3, y4).toFixed(2)\n\t        ) {\n\t            return;\n\t        }\n\t        return {x: px, y: py};\n\t    }\n\t    function inter(bez1, bez2) {\n\t        return interHelper(bez1, bez2);\n\t    }\n\t    function interCount(bez1, bez2) {\n\t        return interHelper(bez1, bez2, 1);\n\t    }\n\t    function interHelper(bez1, bez2, justCount) {\n\t        var bbox1 = R.bezierBBox(bez1),\n\t            bbox2 = R.bezierBBox(bez2);\n\t        if (!R.isBBoxIntersect(bbox1, bbox2)) {\n\t            return justCount ? 0 : [];\n\t        }\n\t        var l1 = bezlen.apply(0, bez1),\n\t            l2 = bezlen.apply(0, bez2),\n\t            n1 = mmax(~~(l1 / 5), 1),\n\t            n2 = mmax(~~(l2 / 5), 1),\n\t            dots1 = [],\n\t            dots2 = [],\n\t            xy = {},\n\t            res = justCount ? 0 : [];\n\t        for (var i = 0; i < n1 + 1; i++) {\n\t            var p = R.findDotsAtSegment.apply(R, bez1.concat(i / n1));\n\t            dots1.push({x: p.x, y: p.y, t: i / n1});\n\t        }\n\t        for (i = 0; i < n2 + 1; i++) {\n\t            p = R.findDotsAtSegment.apply(R, bez2.concat(i / n2));\n\t            dots2.push({x: p.x, y: p.y, t: i / n2});\n\t        }\n\t        for (i = 0; i < n1; i++) {\n\t            for (var j = 0; j < n2; j++) {\n\t                var di = dots1[i],\n\t                    di1 = dots1[i + 1],\n\t                    dj = dots2[j],\n\t                    dj1 = dots2[j + 1],\n\t                    ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n\t                    cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n\t                    is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n\t                if (is) {\n\t                    if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n\t                        continue;\n\t                    }\n\t                    xy[is.x.toFixed(4)] = is.y.toFixed(4);\n\t                    var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n\t                        t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n\t                    if (t1 >= 0 && t1 <= 1.001 && t2 >= 0 && t2 <= 1.001) {\n\t                        if (justCount) {\n\t                            res++;\n\t                        } else {\n\t                            res.push({\n\t                                x: is.x,\n\t                                y: is.y,\n\t                                t1: mmin(t1, 1),\n\t                                t2: mmin(t2, 1)\n\t                            });\n\t                        }\n\t                    }\n\t                }\n\t            }\n\t        }\n\t        return res;\n\t    }\n\t    /*\\\n\t     * Raphael.pathIntersection\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Finds intersections of two paths\n\t     > Parameters\n\t     - path1 (string) path string\n\t     - path2 (string) path string\n\t     = (array) dots of intersection\n\t     o [\n\t     o     {\n\t     o         x: (number) x coordinate of the point\n\t     o         y: (number) y coordinate of the point\n\t     o         t1: (number) t value for segment of path1\n\t     o         t2: (number) t value for segment of path2\n\t     o         segment1: (number) order number for segment of path1\n\t     o         segment2: (number) order number for segment of path2\n\t     o         bez1: (array) eight coordinates representing beziér curve for the segment of path1\n\t     o         bez2: (array) eight coordinates representing beziér curve for the segment of path2\n\t     o     }\n\t     o ]\n\t    \\*/\n\t    R.pathIntersection = function (path1, path2) {\n\t        return interPathHelper(path1, path2);\n\t    };\n\t    R.pathIntersectionNumber = function (path1, path2) {\n\t        return interPathHelper(path1, path2, 1);\n\t    };\n\t    function interPathHelper(path1, path2, justCount) {\n\t        path1 = R._path2curve(path1);\n\t        path2 = R._path2curve(path2);\n\t        var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n\t            res = justCount ? 0 : [];\n\t        for (var i = 0, ii = path1.length; i < ii; i++) {\n\t            var pi = path1[i];\n\t            if (pi[0] == \"M\") {\n\t                x1 = x1m = pi[1];\n\t                y1 = y1m = pi[2];\n\t            } else {\n\t                if (pi[0] == \"C\") {\n\t                    bez1 = [x1, y1].concat(pi.slice(1));\n\t                    x1 = bez1[6];\n\t                    y1 = bez1[7];\n\t                } else {\n\t                    bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n\t                    x1 = x1m;\n\t                    y1 = y1m;\n\t                }\n\t                for (var j = 0, jj = path2.length; j < jj; j++) {\n\t                    var pj = path2[j];\n\t                    if (pj[0] == \"M\") {\n\t                        x2 = x2m = pj[1];\n\t                        y2 = y2m = pj[2];\n\t                    } else {\n\t                        if (pj[0] == \"C\") {\n\t                            bez2 = [x2, y2].concat(pj.slice(1));\n\t                            x2 = bez2[6];\n\t                            y2 = bez2[7];\n\t                        } else {\n\t                            bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n\t                            x2 = x2m;\n\t                            y2 = y2m;\n\t                        }\n\t                        var intr = interHelper(bez1, bez2, justCount);\n\t                        if (justCount) {\n\t                            res += intr;\n\t                        } else {\n\t                            for (var k = 0, kk = intr.length; k < kk; k++) {\n\t                                intr[k].segment1 = i;\n\t                                intr[k].segment2 = j;\n\t                                intr[k].bez1 = bez1;\n\t                                intr[k].bez2 = bez2;\n\t                            }\n\t                            res = res.concat(intr);\n\t                        }\n\t                    }\n\t                }\n\t            }\n\t        }\n\t        return res;\n\t    }\n\t    /*\\\n\t     * Raphael.isPointInsidePath\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Returns `true` if given point is inside a given closed path.\n\t     > Parameters\n\t     - path (string) path string\n\t     - x (number) x of the point\n\t     - y (number) y of the point\n\t     = (boolean) true, if point is inside the path\n\t    \\*/\n\t    R.isPointInsidePath = function (path, x, y) {\n\t        var bbox = R.pathBBox(path);\n\t        return R.isPointInsideBBox(bbox, x, y) &&\n\t               interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n\t    };\n\t    R._removedFactory = function (methodname) {\n\t        return function () {\n\t            eve(\"raphael.log\", null, \"Rapha\\xebl: you are calling to method \\u201c\" + methodname + \"\\u201d of removed object\", methodname);\n\t        };\n\t    };\n\t    /*\\\n\t     * Raphael.pathBBox\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Return bounding box of a given path\n\t     > Parameters\n\t     - path (string) path string\n\t     = (object) bounding box\n\t     o {\n\t     o     x: (number) x coordinate of the left top point of the box\n\t     o     y: (number) y coordinate of the left top point of the box\n\t     o     x2: (number) x coordinate of the right bottom point of the box\n\t     o     y2: (number) y coordinate of the right bottom point of the box\n\t     o     width: (number) width of the box\n\t     o     height: (number) height of the box\n\t     o     cx: (number) x coordinate of the center of the box\n\t     o     cy: (number) y coordinate of the center of the box\n\t     o }\n\t    \\*/\n\t    var pathDimensions = R.pathBBox = function (path) {\n\t        var pth = paths(path);\n\t        if (pth.bbox) {\n\t            return clone(pth.bbox);\n\t        }\n\t        if (!path) {\n\t            return {x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0};\n\t        }\n\t        path = path2curve(path);\n\t        var x = 0,\n\t            y = 0,\n\t            X = [],\n\t            Y = [],\n\t            p;\n\t        for (var i = 0, ii = path.length; i < ii; i++) {\n\t            p = path[i];\n\t            if (p[0] == \"M\") {\n\t                x = p[1];\n\t                y = p[2];\n\t                X.push(x);\n\t                Y.push(y);\n\t            } else {\n\t                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n\t                X = X[concat](dim.min.x, dim.max.x);\n\t                Y = Y[concat](dim.min.y, dim.max.y);\n\t                x = p[5];\n\t                y = p[6];\n\t            }\n\t        }\n\t        var xmin = mmin[apply](0, X),\n\t            ymin = mmin[apply](0, Y),\n\t            xmax = mmax[apply](0, X),\n\t            ymax = mmax[apply](0, Y),\n\t            width = xmax - xmin,\n\t            height = ymax - ymin,\n\t                bb = {\n\t                x: xmin,\n\t                y: ymin,\n\t                x2: xmax,\n\t                y2: ymax,\n\t                width: width,\n\t                height: height,\n\t                cx: xmin + width / 2,\n\t                cy: ymin + height / 2\n\t            };\n\t        pth.bbox = clone(bb);\n\t        return bb;\n\t    },\n\t        pathClone = function (pathArray) {\n\t            var res = clone(pathArray);\n\t            res.toString = R._path2string;\n\t            return res;\n\t        },\n\t        pathToRelative = R._pathToRelative = function (pathArray) {\n\t            var pth = paths(pathArray);\n\t            if (pth.rel) {\n\t                return pathClone(pth.rel);\n\t            }\n\t            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption\n\t                pathArray = R.parsePathString(pathArray);\n\t            }\n\t            var res = [],\n\t                x = 0,\n\t                y = 0,\n\t                mx = 0,\n\t                my = 0,\n\t                start = 0;\n\t            if (pathArray[0][0] == \"M\") {\n\t                x = pathArray[0][1];\n\t                y = pathArray[0][2];\n\t                mx = x;\n\t                my = y;\n\t                start++;\n\t                res.push([\"M\", x, y]);\n\t            }\n\t            for (var i = start, ii = pathArray.length; i < ii; i++) {\n\t                var r = res[i] = [],\n\t                    pa = pathArray[i];\n\t                if (pa[0] != lowerCase.call(pa[0])) {\n\t                    r[0] = lowerCase.call(pa[0]);\n\t                    switch (r[0]) {\n\t                        case \"a\":\n\t                            r[1] = pa[1];\n\t                            r[2] = pa[2];\n\t                            r[3] = pa[3];\n\t                            r[4] = pa[4];\n\t                            r[5] = pa[5];\n\t                            r[6] = +(pa[6] - x).toFixed(3);\n\t                            r[7] = +(pa[7] - y).toFixed(3);\n\t                            break;\n\t                        case \"v\":\n\t                            r[1] = +(pa[1] - y).toFixed(3);\n\t                            break;\n\t                        case \"m\":\n\t                            mx = pa[1];\n\t                            my = pa[2];\n\t                        default:\n\t                            for (var j = 1, jj = pa.length; j < jj; j++) {\n\t                                r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);\n\t                            }\n\t                    }\n\t                } else {\n\t                    r = res[i] = [];\n\t                    if (pa[0] == \"m\") {\n\t                        mx = pa[1] + x;\n\t                        my = pa[2] + y;\n\t                    }\n\t                    for (var k = 0, kk = pa.length; k < kk; k++) {\n\t                        res[i][k] = pa[k];\n\t                    }\n\t                }\n\t                var len = res[i].length;\n\t                switch (res[i][0]) {\n\t                    case \"z\":\n\t                        x = mx;\n\t                        y = my;\n\t                        break;\n\t                    case \"h\":\n\t                        x += +res[i][len - 1];\n\t                        break;\n\t                    case \"v\":\n\t                        y += +res[i][len - 1];\n\t                        break;\n\t                    default:\n\t                        x += +res[i][len - 2];\n\t                        y += +res[i][len - 1];\n\t                }\n\t            }\n\t            res.toString = R._path2string;\n\t            pth.rel = pathClone(res);\n\t            return res;\n\t        },\n\t        pathToAbsolute = R._pathToAbsolute = function (pathArray) {\n\t            var pth = paths(pathArray);\n\t            if (pth.abs) {\n\t                return pathClone(pth.abs);\n\t            }\n\t            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption\n\t                pathArray = R.parsePathString(pathArray);\n\t            }\n\t            if (!pathArray || !pathArray.length) {\n\t                return [[\"M\", 0, 0]];\n\t            }\n\t            var res = [],\n\t                x = 0,\n\t                y = 0,\n\t                mx = 0,\n\t                my = 0,\n\t                start = 0;\n\t            if (pathArray[0][0] == \"M\") {\n\t                x = +pathArray[0][1];\n\t                y = +pathArray[0][2];\n\t                mx = x;\n\t                my = y;\n\t                start++;\n\t                res[0] = [\"M\", x, y];\n\t            }\n\t            var crz = pathArray.length == 3 && pathArray[0][0] == \"M\" && pathArray[1][0].toUpperCase() == \"R\" && pathArray[2][0].toUpperCase() == \"Z\";\n\t            for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n\t                res.push(r = []);\n\t                pa = pathArray[i];\n\t                if (pa[0] != upperCase.call(pa[0])) {\n\t                    r[0] = upperCase.call(pa[0]);\n\t                    switch (r[0]) {\n\t                        case \"A\":\n\t                            r[1] = pa[1];\n\t                            r[2] = pa[2];\n\t                            r[3] = pa[3];\n\t                            r[4] = pa[4];\n\t                            r[5] = pa[5];\n\t                            r[6] = +(pa[6] + x);\n\t                            r[7] = +(pa[7] + y);\n\t                            break;\n\t                        case \"V\":\n\t                            r[1] = +pa[1] + y;\n\t                            break;\n\t                        case \"H\":\n\t                            r[1] = +pa[1] + x;\n\t                            break;\n\t                        case \"R\":\n\t                            var dots = [x, y][concat](pa.slice(1));\n\t                            for (var j = 2, jj = dots.length; j < jj; j++) {\n\t                                dots[j] = +dots[j] + x;\n\t                                dots[++j] = +dots[j] + y;\n\t                            }\n\t                            res.pop();\n\t                            res = res[concat](catmullRom2bezier(dots, crz));\n\t                            break;\n\t                        case \"M\":\n\t                            mx = +pa[1] + x;\n\t                            my = +pa[2] + y;\n\t                        default:\n\t                            for (j = 1, jj = pa.length; j < jj; j++) {\n\t                                r[j] = +pa[j] + ((j % 2) ? x : y);\n\t                            }\n\t                    }\n\t                } else if (pa[0] == \"R\") {\n\t                    dots = [x, y][concat](pa.slice(1));\n\t                    res.pop();\n\t                    res = res[concat](catmullRom2bezier(dots, crz));\n\t                    r = [\"R\"][concat](pa.slice(-2));\n\t                } else {\n\t                    for (var k = 0, kk = pa.length; k < kk; k++) {\n\t                        r[k] = pa[k];\n\t                    }\n\t                }\n\t                switch (r[0]) {\n\t                    case \"Z\":\n\t                        x = mx;\n\t                        y = my;\n\t                        break;\n\t                    case \"H\":\n\t                        x = r[1];\n\t                        break;\n\t                    case \"V\":\n\t                        y = r[1];\n\t                        break;\n\t                    case \"M\":\n\t                        mx = r[r.length - 2];\n\t                        my = r[r.length - 1];\n\t                    default:\n\t                        x = r[r.length - 2];\n\t                        y = r[r.length - 1];\n\t                }\n\t            }\n\t            res.toString = R._path2string;\n\t            pth.abs = pathClone(res);\n\t            return res;\n\t        },\n\t        l2c = function (x1, y1, x2, y2) {\n\t            return [x1, y1, x2, y2, x2, y2];\n\t        },\n\t        q2c = function (x1, y1, ax, ay, x2, y2) {\n\t            var _13 = 1 / 3,\n\t                _23 = 2 / 3;\n\t            return [\n\t                    _13 * x1 + _23 * ax,\n\t                    _13 * y1 + _23 * ay,\n\t                    _13 * x2 + _23 * ax,\n\t                    _13 * y2 + _23 * ay,\n\t                    x2,\n\t                    y2\n\t                ];\n\t        },\n\t        a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n\t            // for more information of where this math came from visit:\n\t            // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n\t            var _120 = PI * 120 / 180,\n\t                rad = PI / 180 * (+angle || 0),\n\t                res = [],\n\t                xy,\n\t                rotate = cacher(function (x, y, rad) {\n\t                    var X = x * math.cos(rad) - y * math.sin(rad),\n\t                        Y = x * math.sin(rad) + y * math.cos(rad);\n\t                    return {x: X, y: Y};\n\t                });\n\t            if (!recursive) {\n\t                xy = rotate(x1, y1, -rad);\n\t                x1 = xy.x;\n\t                y1 = xy.y;\n\t                xy = rotate(x2, y2, -rad);\n\t                x2 = xy.x;\n\t                y2 = xy.y;\n\t                var cos = math.cos(PI / 180 * angle),\n\t                    sin = math.sin(PI / 180 * angle),\n\t                    x = (x1 - x2) / 2,\n\t                    y = (y1 - y2) / 2;\n\t                var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n\t                if (h > 1) {\n\t                    h = math.sqrt(h);\n\t                    rx = h * rx;\n\t                    ry = h * ry;\n\t                }\n\t                var rx2 = rx * rx,\n\t                    ry2 = ry * ry,\n\t                    k = (large_arc_flag == sweep_flag ? -1 : 1) *\n\t                        math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n\t                    cx = k * rx * y / ry + (x1 + x2) / 2,\n\t                    cy = k * -ry * x / rx + (y1 + y2) / 2,\n\t                    f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n\t                    f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n\t                f1 = x1 < cx ? PI - f1 : f1;\n\t                f2 = x2 < cx ? PI - f2 : f2;\n\t                f1 < 0 && (f1 = PI * 2 + f1);\n\t                f2 < 0 && (f2 = PI * 2 + f2);\n\t                if (sweep_flag && f1 > f2) {\n\t                    f1 = f1 - PI * 2;\n\t                }\n\t                if (!sweep_flag && f2 > f1) {\n\t                    f2 = f2 - PI * 2;\n\t                }\n\t            } else {\n\t                f1 = recursive[0];\n\t                f2 = recursive[1];\n\t                cx = recursive[2];\n\t                cy = recursive[3];\n\t            }\n\t            var df = f2 - f1;\n\t            if (abs(df) > _120) {\n\t                var f2old = f2,\n\t                    x2old = x2,\n\t                    y2old = y2;\n\t                f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n\t                x2 = cx + rx * math.cos(f2);\n\t                y2 = cy + ry * math.sin(f2);\n\t                res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n\t            }\n\t            df = f2 - f1;\n\t            var c1 = math.cos(f1),\n\t                s1 = math.sin(f1),\n\t                c2 = math.cos(f2),\n\t                s2 = math.sin(f2),\n\t                t = math.tan(df / 4),\n\t                hx = 4 / 3 * rx * t,\n\t                hy = 4 / 3 * ry * t,\n\t                m1 = [x1, y1],\n\t                m2 = [x1 + hx * s1, y1 - hy * c1],\n\t                m3 = [x2 + hx * s2, y2 - hy * c2],\n\t                m4 = [x2, y2];\n\t            m2[0] = 2 * m1[0] - m2[0];\n\t            m2[1] = 2 * m1[1] - m2[1];\n\t            if (recursive) {\n\t                return [m2, m3, m4][concat](res);\n\t            } else {\n\t                res = [m2, m3, m4][concat](res).join()[split](\",\");\n\t                var newres = [];\n\t                for (var i = 0, ii = res.length; i < ii; i++) {\n\t                    newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n\t                }\n\t                return newres;\n\t            }\n\t        },\n\t        findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n\t            var t1 = 1 - t;\n\t            return {\n\t                x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n\t                y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n\t            };\n\t        },\n\t        curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n\t            var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),\n\t                b = 2 * (c1x - p1x) - 2 * (c2x - c1x),\n\t                c = p1x - c1x,\n\t                t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,\n\t                t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,\n\t                y = [p1y, p2y],\n\t                x = [p1x, p2x],\n\t                dot;\n\t            abs(t1) > \"1e12\" && (t1 = .5);\n\t            abs(t2) > \"1e12\" && (t2 = .5);\n\t            if (t1 > 0 && t1 < 1) {\n\t                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n\t                x.push(dot.x);\n\t                y.push(dot.y);\n\t            }\n\t            if (t2 > 0 && t2 < 1) {\n\t                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n\t                x.push(dot.x);\n\t                y.push(dot.y);\n\t            }\n\t            a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);\n\t            b = 2 * (c1y - p1y) - 2 * (c2y - c1y);\n\t            c = p1y - c1y;\n\t            t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;\n\t            t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;\n\t            abs(t1) > \"1e12\" && (t1 = .5);\n\t            abs(t2) > \"1e12\" && (t2 = .5);\n\t            if (t1 > 0 && t1 < 1) {\n\t                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n\t                x.push(dot.x);\n\t                y.push(dot.y);\n\t            }\n\t            if (t2 > 0 && t2 < 1) {\n\t                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n\t                x.push(dot.x);\n\t                y.push(dot.y);\n\t            }\n\t            return {\n\t                min: {x: mmin[apply](0, x), y: mmin[apply](0, y)},\n\t                max: {x: mmax[apply](0, x), y: mmax[apply](0, y)}\n\t            };\n\t        }),\n\t        path2curve = R._path2curve = cacher(function (path, path2) {\n\t            var pth = !path2 && paths(path);\n\t            if (!path2 && pth.curve) {\n\t                return pathClone(pth.curve);\n\t            }\n\t            var p = pathToAbsolute(path),\n\t                p2 = path2 && pathToAbsolute(path2),\n\t                attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n\t                attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n\t                processPath = function (path, d, pcom) {\n\t                    var nx, ny, tq = {T:1, Q:1};\n\t                    if (!path) {\n\t                        return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n\t                    }\n\t                    !(path[0] in tq) && (d.qx = d.qy = null);\n\t                    switch (path[0]) {\n\t                        case \"M\":\n\t                            d.X = path[1];\n\t                            d.Y = path[2];\n\t                            break;\n\t                        case \"A\":\n\t                            path = [\"C\"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));\n\t                            break;\n\t                        case \"S\":\n\t                            if (pcom == \"C\" || pcom == \"S\") { // In \"S\" case we have to take into account, if the previous command is C/S.\n\t                                nx = d.x * 2 - d.bx;          // And reflect the previous\n\t                                ny = d.y * 2 - d.by;          // command's control point relative to the current point.\n\t                            }\n\t                            else {                            // or some else or nothing\n\t                                nx = d.x;\n\t                                ny = d.y;\n\t                            }\n\t                            path = [\"C\", nx, ny][concat](path.slice(1));\n\t                            break;\n\t                        case \"T\":\n\t                            if (pcom == \"Q\" || pcom == \"T\") { // In \"T\" case we have to take into account, if the previous command is Q/T.\n\t                                d.qx = d.x * 2 - d.qx;        // And make a reflection similar\n\t                                d.qy = d.y * 2 - d.qy;        // to case \"S\".\n\t                            }\n\t                            else {                            // or something else or nothing\n\t                                d.qx = d.x;\n\t                                d.qy = d.y;\n\t                            }\n\t                            path = [\"C\"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n\t                            break;\n\t                        case \"Q\":\n\t                            d.qx = path[1];\n\t                            d.qy = path[2];\n\t                            path = [\"C\"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n\t                            break;\n\t                        case \"L\":\n\t                            path = [\"C\"][concat](l2c(d.x, d.y, path[1], path[2]));\n\t                            break;\n\t                        case \"H\":\n\t                            path = [\"C\"][concat](l2c(d.x, d.y, path[1], d.y));\n\t                            break;\n\t                        case \"V\":\n\t                            path = [\"C\"][concat](l2c(d.x, d.y, d.x, path[1]));\n\t                            break;\n\t                        case \"Z\":\n\t                            path = [\"C\"][concat](l2c(d.x, d.y, d.X, d.Y));\n\t                            break;\n\t                    }\n\t                    return path;\n\t                },\n\t                fixArc = function (pp, i) {\n\t                    if (pp[i].length > 7) {\n\t                        pp[i].shift();\n\t                        var pi = pp[i];\n\t                        while (pi.length) {\n\t                            pcoms1[i]=\"A\"; // if created multiple C:s, their original seg is saved\n\t                            p2 && (pcoms2[i]=\"A\"); // the same as above\n\t                            pp.splice(i++, 0, [\"C\"][concat](pi.splice(0, 6)));\n\t                        }\n\t                        pp.splice(i, 1);\n\t                        ii = mmax(p.length, p2 && p2.length || 0);\n\t                    }\n\t                },\n\t                fixM = function (path1, path2, a1, a2, i) {\n\t                    if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n\t                        path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n\t                        a1.bx = 0;\n\t                        a1.by = 0;\n\t                        a1.x = path1[i][1];\n\t                        a1.y = path1[i][2];\n\t                        ii = mmax(p.length, p2 && p2.length || 0);\n\t                    }\n\t                },\n\t                pcoms1 = [], // path commands of original path p\n\t                pcoms2 = [], // path commands of original path p2\n\t                pfirst = \"\", // temporary holder for original path command\n\t                pcom = \"\"; // holder for previous path command of original path\n\t            for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n\t                p[i] && (pfirst = p[i][0]); // save current path command\n\n\t                if (pfirst != \"C\") // C is not saved yet, because it may be result of conversion\n\t                {\n\t                    pcoms1[i] = pfirst; // Save current path command\n\t                    i && ( pcom = pcoms1[i-1]); // Get previous path command pcom\n\t                }\n\t                p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\n\n\t                if (pcoms1[i] != \"A\" && pfirst == \"C\") pcoms1[i] = \"C\"; // A is the only command\n\t                // which may produce multiple C:s\n\t                // so we have to make sure that C is also C in original path\n\n\t                fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\n\n\t                if (p2) { // the same procedures is done to p2\n\t                    p2[i] && (pfirst = p2[i][0]);\n\t                    if (pfirst != \"C\")\n\t                    {\n\t                        pcoms2[i] = pfirst;\n\t                        i && (pcom = pcoms2[i-1]);\n\t                    }\n\t                    p2[i] = processPath(p2[i], attrs2, pcom);\n\n\t                    if (pcoms2[i]!=\"A\" && pfirst==\"C\") pcoms2[i]=\"C\";\n\n\t                    fixArc(p2, i);\n\t                }\n\t                fixM(p, p2, attrs, attrs2, i);\n\t                fixM(p2, p, attrs2, attrs, i);\n\t                var seg = p[i],\n\t                    seg2 = p2 && p2[i],\n\t                    seglen = seg.length,\n\t                    seg2len = p2 && seg2.length;\n\t                attrs.x = seg[seglen - 2];\n\t                attrs.y = seg[seglen - 1];\n\t                attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n\t                attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n\t                attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n\t                attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n\t                attrs2.x = p2 && seg2[seg2len - 2];\n\t                attrs2.y = p2 && seg2[seg2len - 1];\n\t            }\n\t            if (!p2) {\n\t                pth.curve = pathClone(p);\n\t            }\n\t            return p2 ? [p, p2] : p;\n\t        }, null, pathClone),\n\t        parseDots = R._parseDots = cacher(function (gradient) {\n\t            var dots = [];\n\t            for (var i = 0, ii = gradient.length; i < ii; i++) {\n\t                var dot = {},\n\t                    par = gradient[i].match(/^([^:]*):?([\\d\\.]*)/);\n\t                dot.color = R.getRGB(par[1]);\n\t                if (dot.color.error) {\n\t                    return null;\n\t                }\n\t                dot.opacity = dot.color.opacity;\n\t                dot.color = dot.color.hex;\n\t                par[2] && (dot.offset = par[2] + \"%\");\n\t                dots.push(dot);\n\t            }\n\t            for (i = 1, ii = dots.length - 1; i < ii; i++) {\n\t                if (!dots[i].offset) {\n\t                    var start = toFloat(dots[i - 1].offset || 0),\n\t                        end = 0;\n\t                    for (var j = i + 1; j < ii; j++) {\n\t                        if (dots[j].offset) {\n\t                            end = dots[j].offset;\n\t                            break;\n\t                        }\n\t                    }\n\t                    if (!end) {\n\t                        end = 100;\n\t                        j = ii;\n\t                    }\n\t                    end = toFloat(end);\n\t                    var d = (end - start) / (j - i + 1);\n\t                    for (; i < j; i++) {\n\t                        start += d;\n\t                        dots[i].offset = start + \"%\";\n\t                    }\n\t                }\n\t            }\n\t            return dots;\n\t        }),\n\t        tear = R._tear = function (el, paper) {\n\t            el == paper.top && (paper.top = el.prev);\n\t            el == paper.bottom && (paper.bottom = el.next);\n\t            el.next && (el.next.prev = el.prev);\n\t            el.prev && (el.prev.next = el.next);\n\t        },\n\t        tofront = R._tofront = function (el, paper) {\n\t            if (paper.top === el) {\n\t                return;\n\t            }\n\t            tear(el, paper);\n\t            el.next = null;\n\t            el.prev = paper.top;\n\t            paper.top.next = el;\n\t            paper.top = el;\n\t        },\n\t        toback = R._toback = function (el, paper) {\n\t            if (paper.bottom === el) {\n\t                return;\n\t            }\n\t            tear(el, paper);\n\t            el.next = paper.bottom;\n\t            el.prev = null;\n\t            paper.bottom.prev = el;\n\t            paper.bottom = el;\n\t        },\n\t        insertafter = R._insertafter = function (el, el2, paper) {\n\t            tear(el, paper);\n\t            el2 == paper.top && (paper.top = el);\n\t            el2.next && (el2.next.prev = el);\n\t            el.next = el2.next;\n\t            el.prev = el2;\n\t            el2.next = el;\n\t        },\n\t        insertbefore = R._insertbefore = function (el, el2, paper) {\n\t            tear(el, paper);\n\t            el2 == paper.bottom && (paper.bottom = el);\n\t            el2.prev && (el2.prev.next = el);\n\t            el.prev = el2.prev;\n\t            el2.prev = el;\n\t            el.next = el2;\n\t        },\n\t        /*\\\n\t         * Raphael.toMatrix\n\t         [ method ]\n\t         **\n\t         * Utility method\n\t         **\n\t         * Returns matrix of transformations applied to a given path\n\t         > Parameters\n\t         - path (string) path string\n\t         - transform (string|array) transformation string\n\t         = (object) @Matrix\n\t        \\*/\n\t        toMatrix = R.toMatrix = function (path, transform) {\n\t            var bb = pathDimensions(path),\n\t                el = {\n\t                    _: {\n\t                        transform: E\n\t                    },\n\t                    getBBox: function () {\n\t                        return bb;\n\t                    }\n\t                };\n\t            extractTransform(el, transform);\n\t            return el.matrix;\n\t        },\n\t        /*\\\n\t         * Raphael.transformPath\n\t         [ method ]\n\t         **\n\t         * Utility method\n\t         **\n\t         * Returns path transformed by a given transformation\n\t         > Parameters\n\t         - path (string) path string\n\t         - transform (string|array) transformation string\n\t         = (string) path\n\t        \\*/\n\t        transformPath = R.transformPath = function (path, transform) {\n\t            return mapPath(path, toMatrix(path, transform));\n\t        },\n\t        extractTransform = R._extractTransform = function (el, tstr) {\n\t            if (tstr == null) {\n\t                return el._.transform;\n\t            }\n\t            tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || E);\n\t            var tdata = R.parseTransformString(tstr),\n\t                deg = 0,\n\t                dx = 0,\n\t                dy = 0,\n\t                sx = 1,\n\t                sy = 1,\n\t                _ = el._,\n\t                m = new Matrix;\n\t            _.transform = tdata || [];\n\t            if (tdata) {\n\t                for (var i = 0, ii = tdata.length; i < ii; i++) {\n\t                    var t = tdata[i],\n\t                        tlen = t.length,\n\t                        command = Str(t[0]).toLowerCase(),\n\t                        absolute = t[0] != command,\n\t                        inver = absolute ? m.invert() : 0,\n\t                        x1,\n\t                        y1,\n\t                        x2,\n\t                        y2,\n\t                        bb;\n\t                    if (command == \"t\" && tlen == 3) {\n\t                        if (absolute) {\n\t                            x1 = inver.x(0, 0);\n\t                            y1 = inver.y(0, 0);\n\t                            x2 = inver.x(t[1], t[2]);\n\t                            y2 = inver.y(t[1], t[2]);\n\t                            m.translate(x2 - x1, y2 - y1);\n\t                        } else {\n\t                            m.translate(t[1], t[2]);\n\t                        }\n\t                    } else if (command == \"r\") {\n\t                        if (tlen == 2) {\n\t                            bb = bb || el.getBBox(1);\n\t                            m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n\t                            deg += t[1];\n\t                        } else if (tlen == 4) {\n\t                            if (absolute) {\n\t                                x2 = inver.x(t[2], t[3]);\n\t                                y2 = inver.y(t[2], t[3]);\n\t                                m.rotate(t[1], x2, y2);\n\t                            } else {\n\t                                m.rotate(t[1], t[2], t[3]);\n\t                            }\n\t                            deg += t[1];\n\t                        }\n\t                    } else if (command == \"s\") {\n\t                        if (tlen == 2 || tlen == 3) {\n\t                            bb = bb || el.getBBox(1);\n\t                            m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n\t                            sx *= t[1];\n\t                            sy *= t[tlen - 1];\n\t                        } else if (tlen == 5) {\n\t                            if (absolute) {\n\t                                x2 = inver.x(t[3], t[4]);\n\t                                y2 = inver.y(t[3], t[4]);\n\t                                m.scale(t[1], t[2], x2, y2);\n\t                            } else {\n\t                                m.scale(t[1], t[2], t[3], t[4]);\n\t                            }\n\t                            sx *= t[1];\n\t                            sy *= t[2];\n\t                        }\n\t                    } else if (command == \"m\" && tlen == 7) {\n\t                        m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n\t                    }\n\t                    _.dirtyT = 1;\n\t                    el.matrix = m;\n\t                }\n\t            }\n\n\t            /*\\\n\t             * Element.matrix\n\t             [ property (object) ]\n\t             **\n\t             * Keeps @Matrix object, which represents element transformation\n\t            \\*/\n\t            el.matrix = m;\n\n\t            _.sx = sx;\n\t            _.sy = sy;\n\t            _.deg = deg;\n\t            _.dx = dx = m.e;\n\t            _.dy = dy = m.f;\n\n\t            if (sx == 1 && sy == 1 && !deg && _.bbox) {\n\t                _.bbox.x += +dx;\n\t                _.bbox.y += +dy;\n\t            } else {\n\t                _.dirtyT = 1;\n\t            }\n\t        },\n\t        getEmpty = function (item) {\n\t            var l = item[0];\n\t            switch (l.toLowerCase()) {\n\t                case \"t\": return [l, 0, 0];\n\t                case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n\t                case \"r\": if (item.length == 4) {\n\t                    return [l, 0, item[2], item[3]];\n\t                } else {\n\t                    return [l, 0];\n\t                }\n\t                case \"s\": if (item.length == 5) {\n\t                    return [l, 1, 1, item[3], item[4]];\n\t                } else if (item.length == 3) {\n\t                    return [l, 1, 1];\n\t                } else {\n\t                    return [l, 1];\n\t                }\n\t            }\n\t        },\n\t        equaliseTransform = R._equaliseTransform = function (t1, t2) {\n\t            t2 = Str(t2).replace(/\\.{3}|\\u2026/g, t1);\n\t            t1 = R.parseTransformString(t1) || [];\n\t            t2 = R.parseTransformString(t2) || [];\n\t            var maxlength = mmax(t1.length, t2.length),\n\t                from = [],\n\t                to = [],\n\t                i = 0, j, jj,\n\t                tt1, tt2;\n\t            for (; i < maxlength; i++) {\n\t                tt1 = t1[i] || getEmpty(t2[i]);\n\t                tt2 = t2[i] || getEmpty(tt1);\n\t                if ((tt1[0] != tt2[0]) ||\n\t                    (tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||\n\t                    (tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))\n\t                    ) {\n\t                    return;\n\t                }\n\t                from[i] = [];\n\t                to[i] = [];\n\t                for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) {\n\t                    j in tt1 && (from[i][j] = tt1[j]);\n\t                    j in tt2 && (to[i][j] = tt2[j]);\n\t                }\n\t            }\n\t            return {\n\t                from: from,\n\t                to: to\n\t            };\n\t        };\n\t    R._getContainer = function (x, y, w, h) {\n\t        var container;\n\t        container = h == null && !R.is(x, \"object\") ? g.doc.getElementById(x) : x;\n\t        if (container == null) {\n\t            return;\n\t        }\n\t        if (container.tagName) {\n\t            if (y == null) {\n\t                return {\n\t                    container: container,\n\t                    width: container.style.pixelWidth || container.offsetWidth,\n\t                    height: container.style.pixelHeight || container.offsetHeight\n\t                };\n\t            } else {\n\t                return {\n\t                    container: container,\n\t                    width: y,\n\t                    height: w\n\t                };\n\t            }\n\t        }\n\t        return {\n\t            container: 1,\n\t            x: x,\n\t            y: y,\n\t            width: w,\n\t            height: h\n\t        };\n\t    };\n\t    /*\\\n\t     * Raphael.pathToRelative\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Converts path to relative form\n\t     > Parameters\n\t     - pathString (string|array) path string or array of segments\n\t     = (array) array of segments.\n\t    \\*/\n\t    R.pathToRelative = pathToRelative;\n\t    R._engine = {};\n\t    /*\\\n\t     * Raphael.path2curve\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Converts path to a new path where all segments are cubic bezier curves.\n\t     > Parameters\n\t     - pathString (string|array) path string or array of segments\n\t     = (array) array of segments.\n\t    \\*/\n\t    R.path2curve = path2curve;\n\t    /*\\\n\t     * Raphael.matrix\n\t     [ method ]\n\t     **\n\t     * Utility method\n\t     **\n\t     * Returns matrix based on given parameters.\n\t     > Parameters\n\t     - a (number)\n\t     - b (number)\n\t     - c (number)\n\t     - d (number)\n\t     - e (number)\n\t     - f (number)\n\t     = (object) @Matrix\n\t    \\*/\n\t    R.matrix = function (a, b, c, d, e, f) {\n\t        return new Matrix(a, b, c, d, e, f);\n\t    };\n\t    function Matrix(a, b, c, d, e, f) {\n\t        if (a != null) {\n\t            this.a = +a;\n\t            this.b = +b;\n\t            this.c = +c;\n\t            this.d = +d;\n\t            this.e = +e;\n\t            this.f = +f;\n\t        } else {\n\t            this.a = 1;\n\t            this.b = 0;\n\t            this.c = 0;\n\t            this.d = 1;\n\t            this.e = 0;\n\t            this.f = 0;\n\t        }\n\t    }\n\t    (function (matrixproto) {\n\t        /*\\\n\t         * Matrix.add\n\t         [ method ]\n\t         **\n\t         * Adds given matrix to existing one.\n\t         > Parameters\n\t         - a (number)\n\t         - b (number)\n\t         - c (number)\n\t         - d (number)\n\t         - e (number)\n\t         - f (number)\n\t         or\n\t         - matrix (object) @Matrix\n\t        \\*/\n\t        matrixproto.add = function (a, b, c, d, e, f) {\n\t            var out = [[], [], []],\n\t                m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],\n\t                matrix = [[a, c, e], [b, d, f], [0, 0, 1]],\n\t                x, y, z, res;\n\n\t            if (a && a instanceof Matrix) {\n\t                matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];\n\t            }\n\n\t            for (x = 0; x < 3; x++) {\n\t                for (y = 0; y < 3; y++) {\n\t                    res = 0;\n\t                    for (z = 0; z < 3; z++) {\n\t                        res += m[x][z] * matrix[z][y];\n\t                    }\n\t                    out[x][y] = res;\n\t                }\n\t            }\n\t            this.a = out[0][0];\n\t            this.b = out[1][0];\n\t            this.c = out[0][1];\n\t            this.d = out[1][1];\n\t            this.e = out[0][2];\n\t            this.f = out[1][2];\n\t        };\n\t        /*\\\n\t         * Matrix.invert\n\t         [ method ]\n\t         **\n\t         * Returns inverted version of the matrix\n\t         = (object) @Matrix\n\t        \\*/\n\t        matrixproto.invert = function () {\n\t            var me = this,\n\t                x = me.a * me.d - me.b * me.c;\n\t            return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n\t        };\n\t        /*\\\n\t         * Matrix.clone\n\t         [ method ]\n\t         **\n\t         * Returns copy of the matrix\n\t         = (object) @Matrix\n\t        \\*/\n\t        matrixproto.clone = function () {\n\t            return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n\t        };\n\t        /*\\\n\t         * Matrix.translate\n\t         [ method ]\n\t         **\n\t         * Translate the matrix\n\t         > Parameters\n\t         - x (number)\n\t         - y (number)\n\t        \\*/\n\t        matrixproto.translate = function (x, y) {\n\t            this.add(1, 0, 0, 1, x, y);\n\t        };\n\t        /*\\\n\t         * Matrix.scale\n\t         [ method ]\n\t         **\n\t         * Scales the matrix\n\t         > Parameters\n\t         - x (number)\n\t         - y (number) #optional\n\t         - cx (number) #optional\n\t         - cy (number) #optional\n\t        \\*/\n\t        matrixproto.scale = function (x, y, cx, cy) {\n\t            y == null && (y = x);\n\t            (cx || cy) && this.add(1, 0, 0, 1, cx, cy);\n\t            this.add(x, 0, 0, y, 0, 0);\n\t            (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);\n\t        };\n\t        /*\\\n\t         * Matrix.rotate\n\t         [ method ]\n\t         **\n\t         * Rotates the matrix\n\t         > Parameters\n\t         - a (number)\n\t         - x (number)\n\t         - y (number)\n\t        \\*/\n\t        matrixproto.rotate = function (a, x, y) {\n\t            a = R.rad(a);\n\t            x = x || 0;\n\t            y = y || 0;\n\t            var cos = +math.cos(a).toFixed(9),\n\t                sin = +math.sin(a).toFixed(9);\n\t            this.add(cos, sin, -sin, cos, x, y);\n\t            this.add(1, 0, 0, 1, -x, -y);\n\t        };\n\t        /*\\\n\t         * Matrix.x\n\t         [ method ]\n\t         **\n\t         * Return x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n\t         > Parameters\n\t         - x (number)\n\t         - y (number)\n\t         = (number) x\n\t        \\*/\n\t        matrixproto.x = function (x, y) {\n\t            return x * this.a + y * this.c + this.e;\n\t        };\n\t        /*\\\n\t         * Matrix.y\n\t         [ method ]\n\t         **\n\t         * Return y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n\t         > Parameters\n\t         - x (number)\n\t         - y (number)\n\t         = (number) y\n\t        \\*/\n\t        matrixproto.y = function (x, y) {\n\t            return x * this.b + y * this.d + this.f;\n\t        };\n\t        matrixproto.get = function (i) {\n\t            return +this[Str.fromCharCode(97 + i)].toFixed(4);\n\t        };\n\t        matrixproto.toString = function () {\n\t            return R.svg ?\n\t                \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\" :\n\t                [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join();\n\t        };\n\t        matrixproto.toFilter = function () {\n\t            return \"progid:DXImageTransform.Microsoft.Matrix(M11=\" + this.get(0) +\n\t                \", M12=\" + this.get(2) + \", M21=\" + this.get(1) + \", M22=\" + this.get(3) +\n\t                \", Dx=\" + this.get(4) + \", Dy=\" + this.get(5) + \", sizingmethod='auto expand')\";\n\t        };\n\t        matrixproto.offset = function () {\n\t            return [this.e.toFixed(4), this.f.toFixed(4)];\n\t        };\n\t        function norm(a) {\n\t            return a[0] * a[0] + a[1] * a[1];\n\t        }\n\t        function normalize(a) {\n\t            var mag = math.sqrt(norm(a));\n\t            a[0] && (a[0] /= mag);\n\t            a[1] && (a[1] /= mag);\n\t        }\n\t        /*\\\n\t         * Matrix.split\n\t         [ method ]\n\t         **\n\t         * Splits matrix into primitive transformations\n\t         = (object) in format:\n\t         o dx (number) translation by x\n\t         o dy (number) translation by y\n\t         o scalex (number) scale by x\n\t         o scaley (number) scale by y\n\t         o shear (number) shear\n\t         o rotate (number) rotation in deg\n\t         o isSimple (boolean) could it be represented via simple transformations\n\t        \\*/\n\t        matrixproto.split = function () {\n\t            var out = {};\n\t            // translation\n\t            out.dx = this.e;\n\t            out.dy = this.f;\n\n\t            // scale and shear\n\t            var row = [[this.a, this.c], [this.b, this.d]];\n\t            out.scalex = math.sqrt(norm(row[0]));\n\t            normalize(row[0]);\n\n\t            out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n\t            row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n\t            out.scaley = math.sqrt(norm(row[1]));\n\t            normalize(row[1]);\n\t            out.shear /= out.scaley;\n\n\t            // rotation\n\t            var sin = -row[0][1],\n\t                cos = row[1][1];\n\t            if (cos < 0) {\n\t                out.rotate = R.deg(math.acos(cos));\n\t                if (sin < 0) {\n\t                    out.rotate = 360 - out.rotate;\n\t                }\n\t            } else {\n\t                out.rotate = R.deg(math.asin(sin));\n\t            }\n\n\t            out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n\t            out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n\t            out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n\t            return out;\n\t        };\n\t        /*\\\n\t         * Matrix.toTransformString\n\t         [ method ]\n\t         **\n\t         * Return transform string that represents given matrix\n\t         = (string) transform string\n\t        \\*/\n\t        matrixproto.toTransformString = function (shorter) {\n\t            var s = shorter || this[split]();\n\t            if (s.isSimple) {\n\t                s.scalex = +s.scalex.toFixed(4);\n\t                s.scaley = +s.scaley.toFixed(4);\n\t                s.rotate = +s.rotate.toFixed(4);\n\t                return  (s.dx || s.dy ? \"t\" + [s.dx, s.dy] : E) +\n\t                        (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E) +\n\t                        (s.rotate ? \"r\" + [s.rotate, 0, 0] : E);\n\t            } else {\n\t                return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n\t            }\n\t        };\n\t    })(Matrix.prototype);\n\n\t    var preventDefault = function () {\n\t        this.returnValue = false;\n\t    },\n\t    preventTouch = function () {\n\t        return this.originalEvent.preventDefault();\n\t    },\n\t    stopPropagation = function () {\n\t        this.cancelBubble = true;\n\t    },\n\t    stopTouch = function () {\n\t        return this.originalEvent.stopPropagation();\n\t    },\n\t    getEventPosition = function (e) {\n\t        var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\n\t            scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;\n\n\t        return {\n\t            x: e.clientX + scrollX,\n\t            y: e.clientY + scrollY\n\t        };\n\t    },\n\t    addEvent = (function () {\n\t        if (g.doc.addEventListener) {\n\t            return function (obj, type, fn, element) {\n\t                var f = function (e) {\n\t                    var pos = getEventPosition(e);\n\t                    return fn.call(element, e, pos.x, pos.y);\n\t                };\n\t                obj.addEventListener(type, f, false);\n\n\t                if (supportsTouch && touchMap[type]) {\n\t                    var _f = function (e) {\n\t                        var pos = getEventPosition(e),\n\t                            olde = e;\n\n\t                        for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\n\t                            if (e.targetTouches[i].target == obj) {\n\t                                e = e.targetTouches[i];\n\t                                e.originalEvent = olde;\n\t                                e.preventDefault = preventTouch;\n\t                                e.stopPropagation = stopTouch;\n\t                                break;\n\t                            }\n\t                        }\n\n\t                        return fn.call(element, e, pos.x, pos.y);\n\t                    };\n\t                    obj.addEventListener(touchMap[type], _f, false);\n\t                }\n\n\t                return function () {\n\t                    obj.removeEventListener(type, f, false);\n\n\t                    if (supportsTouch && touchMap[type])\n\t                        obj.removeEventListener(touchMap[type], _f, false);\n\n\t                    return true;\n\t                };\n\t            };\n\t        } else if (g.doc.attachEvent) {\n\t            return function (obj, type, fn, element) {\n\t                var f = function (e) {\n\t                    e = e || g.win.event;\n\t                    var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\n\t                        scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,\n\t                        x = e.clientX + scrollX,\n\t                        y = e.clientY + scrollY;\n\t                    e.preventDefault = e.preventDefault || preventDefault;\n\t                    e.stopPropagation = e.stopPropagation || stopPropagation;\n\t                    return fn.call(element, e, x, y);\n\t                };\n\t                obj.attachEvent(\"on\" + type, f);\n\t                var detacher = function () {\n\t                    obj.detachEvent(\"on\" + type, f);\n\t                    return true;\n\t                };\n\t                return detacher;\n\t            };\n\t        }\n\t    })(),\n\t    drag = [],\n\t    dragMove = function (e) {\n\t        var x = e.clientX,\n\t            y = e.clientY,\n\t            scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\n\t            scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,\n\t            dragi,\n\t            j = drag.length;\n\t        while (j--) {\n\t            dragi = drag[j];\n\t            if (supportsTouch && e.touches) {\n\t                var i = e.touches.length,\n\t                    touch;\n\t                while (i--) {\n\t                    touch = e.touches[i];\n\t                    if (touch.identifier == dragi.el._drag.id) {\n\t                        x = touch.clientX;\n\t                        y = touch.clientY;\n\t                        (e.originalEvent ? e.originalEvent : e).preventDefault();\n\t                        break;\n\t                    }\n\t                }\n\t            } else {\n\t                e.preventDefault();\n\t            }\n\t            var node = dragi.el.node,\n\t                o,\n\t                next = node.nextSibling,\n\t                parent = node.parentNode,\n\t                display = node.style.display;\n\t            g.win.opera && parent.removeChild(node);\n\t            node.style.display = \"none\";\n\t            o = dragi.el.paper.getElementByPoint(x, y);\n\t            node.style.display = display;\n\t            g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n\t            o && eve(\"raphael.drag.over.\" + dragi.el.id, dragi.el, o);\n\t            x += scrollX;\n\t            y += scrollY;\n\t            eve(\"raphael.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n\t        }\n\t    },\n\t    dragUp = function (e) {\n\t        R.unmousemove(dragMove).unmouseup(dragUp);\n\t        var i = drag.length,\n\t            dragi;\n\t        while (i--) {\n\t            dragi = drag[i];\n\t            dragi.el._drag = {};\n\t            eve(\"raphael.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n\t        }\n\t        drag = [];\n\t    },\n\t    /*\\\n\t     * Raphael.el\n\t     [ property (object) ]\n\t     **\n\t     * You can add your own method to elements. This is useful when you want to hack default functionality or\n\t     * want to wrap some common transformation or attributes in one method. In difference to canvas methods,\n\t     * you can redefine element method at any time. Expending element methods wouldn’t affect set.\n\t     > Usage\n\t     | Raphael.el.red = function () {\n\t     |     this.attr({fill: \"#f00\"});\n\t     | };\n\t     | // then use it\n\t     | paper.circle(100, 100, 20).red();\n\t    \\*/\n\t    elproto = R.el = {};\n\t    /*\\\n\t     * Element.click\n\t     [ method ]\n\t     **\n\t     * Adds event handler for click for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.unclick\n\t     [ method ]\n\t     **\n\t     * Removes event handler for click for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.dblclick\n\t     [ method ]\n\t     **\n\t     * Adds event handler for double click for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.undblclick\n\t     [ method ]\n\t     **\n\t     * Removes event handler for double click for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.mousedown\n\t     [ method ]\n\t     **\n\t     * Adds event handler for mousedown for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.unmousedown\n\t     [ method ]\n\t     **\n\t     * Removes event handler for mousedown for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.mousemove\n\t     [ method ]\n\t     **\n\t     * Adds event handler for mousemove for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.unmousemove\n\t     [ method ]\n\t     **\n\t     * Removes event handler for mousemove for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.mouseout\n\t     [ method ]\n\t     **\n\t     * Adds event handler for mouseout for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.unmouseout\n\t     [ method ]\n\t     **\n\t     * Removes event handler for mouseout for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.mouseover\n\t     [ method ]\n\t     **\n\t     * Adds event handler for mouseover for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.unmouseover\n\t     [ method ]\n\t     **\n\t     * Removes event handler for mouseover for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.mouseup\n\t     [ method ]\n\t     **\n\t     * Adds event handler for mouseup for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.unmouseup\n\t     [ method ]\n\t     **\n\t     * Removes event handler for mouseup for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.touchstart\n\t     [ method ]\n\t     **\n\t     * Adds event handler for touchstart for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.untouchstart\n\t     [ method ]\n\t     **\n\t     * Removes event handler for touchstart for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.touchmove\n\t     [ method ]\n\t     **\n\t     * Adds event handler for touchmove for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.untouchmove\n\t     [ method ]\n\t     **\n\t     * Removes event handler for touchmove for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.touchend\n\t     [ method ]\n\t     **\n\t     * Adds event handler for touchend for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.untouchend\n\t     [ method ]\n\t     **\n\t     * Removes event handler for touchend for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\n\t    /*\\\n\t     * Element.touchcancel\n\t     [ method ]\n\t     **\n\t     * Adds event handler for touchcancel for the element.\n\t     > Parameters\n\t     - handler (function) handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    /*\\\n\t     * Element.untouchcancel\n\t     [ method ]\n\t     **\n\t     * Removes event handler for touchcancel for the element.\n\t     > Parameters\n\t     - handler (function) #optional handler for the event\n\t     = (object) @Element\n\t    \\*/\n\t    for (var i = events.length; i--;) {\n\t        (function (eventName) {\n\t            R[eventName] = elproto[eventName] = function (fn, scope) {\n\t                if (R.is(fn, \"function\")) {\n\t                    this.events = this.events || [];\n\t                    this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)});\n\t                }\n\t                return this;\n\t            };\n\t            R[\"un\" + eventName] = elproto[\"un\" + eventName] = function (fn) {\n\t                var events = this.events || [],\n\t                    l = events.length;\n\t                while (l--){\n\t                    if (events[l].name == eventName && (R.is(fn, \"undefined\") || events[l].f == fn)) {\n\t                        events[l].unbind();\n\t                        events.splice(l, 1);\n\t                        !events.length && delete this.events;\n\t                    }\n\t                }\n\t                return this;\n\t            };\n\t        })(events[i]);\n\t    }\n\n\t    /*\\\n\t     * Element.data\n\t     [ method ]\n\t     **\n\t     * Adds or retrieves given value associated with given key.\n\t     **\n\t     * See also @Element.removeData\n\t     > Parameters\n\t     - key (string) key to store data\n\t     - value (any) #optional value to store\n\t     = (object) @Element\n\t     * or, if value is not specified:\n\t     = (any) value\n\t     * or, if key and value are not specified:\n\t     = (object) Key/value pairs for all the data associated with the element.\n\t     > Usage\n\t     | for (var i = 0, i < 5, i++) {\n\t     |     paper.circle(10 + 15 * i, 10, 10)\n\t     |          .attr({fill: \"#000\"})\n\t     |          .data(\"i\", i)\n\t     |          .click(function () {\n\t     |             alert(this.data(\"i\"));\n\t     |          });\n\t     | }\n\t    \\*/\n\t    elproto.data = function (key, value) {\n\t        var data = eldata[this.id] = eldata[this.id] || {};\n\t        if (arguments.length == 0) {\n\t            return data;\n\t        }\n\t        if (arguments.length == 1) {\n\t            if (R.is(key, \"object\")) {\n\t                for (var i in key) if (key[has](i)) {\n\t                    this.data(i, key[i]);\n\t                }\n\t                return this;\n\t            }\n\t            eve(\"raphael.data.get.\" + this.id, this, data[key], key);\n\t            return data[key];\n\t        }\n\t        data[key] = value;\n\t        eve(\"raphael.data.set.\" + this.id, this, value, key);\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.removeData\n\t     [ method ]\n\t     **\n\t     * Removes value associated with an element by given key.\n\t     * If key is not provided, removes all the data of the element.\n\t     > Parameters\n\t     - key (string) #optional key\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.removeData = function (key) {\n\t        if (key == null) {\n\t            eldata[this.id] = {};\n\t        } else {\n\t            eldata[this.id] && delete eldata[this.id][key];\n\t        }\n\t        return this;\n\t    };\n\t     /*\\\n\t     * Element.getData\n\t     [ method ]\n\t     **\n\t     * Retrieves the element data\n\t     = (object) data\n\t    \\*/\n\t    elproto.getData = function () {\n\t        return clone(eldata[this.id] || {});\n\t    };\n\t    /*\\\n\t     * Element.hover\n\t     [ method ]\n\t     **\n\t     * Adds event handlers for hover for the element.\n\t     > Parameters\n\t     - f_in (function) handler for hover in\n\t     - f_out (function) handler for hover out\n\t     - icontext (object) #optional context for hover in handler\n\t     - ocontext (object) #optional context for hover out handler\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n\t        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n\t    };\n\t    /*\\\n\t     * Element.unhover\n\t     [ method ]\n\t     **\n\t     * Removes event handlers for hover for the element.\n\t     > Parameters\n\t     - f_in (function) handler for hover in\n\t     - f_out (function) handler for hover out\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.unhover = function (f_in, f_out) {\n\t        return this.unmouseover(f_in).unmouseout(f_out);\n\t    };\n\t    var draggable = [];\n\t    /*\\\n\t     * Element.drag\n\t     [ method ]\n\t     **\n\t     * Adds event handlers for drag of the element.\n\t     > Parameters\n\t     - onmove (function) handler for moving\n\t     - onstart (function) handler for drag start\n\t     - onend (function) handler for drag end\n\t     - mcontext (object) #optional context for moving handler\n\t     - scontext (object) #optional context for drag start handler\n\t     - econtext (object) #optional context for drag end handler\n\t     * Additionally following `drag` events will be triggered: `drag.start.<id>` on start,\n\t     * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element will be dragged over another element\n\t     * `drag.over.<id>` will be fired as well.\n\t     *\n\t     * Start event and start handler will be called in specified context or in context of the element with following parameters:\n\t     o x (number) x position of the mouse\n\t     o y (number) y position of the mouse\n\t     o event (object) DOM event object\n\t     * Move event and move handler will be called in specified context or in context of the element with following parameters:\n\t     o dx (number) shift by x from the start point\n\t     o dy (number) shift by y from the start point\n\t     o x (number) x position of the mouse\n\t     o y (number) y position of the mouse\n\t     o event (object) DOM event object\n\t     * End event and end handler will be called in specified context or in context of the element with following parameters:\n\t     o event (object) DOM event object\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n\t        function start(e) {\n\t            (e.originalEvent || e).preventDefault();\n\t            var x = e.clientX,\n\t                y = e.clientY,\n\t                scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\n\t                scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;\n\t            this._drag.id = e.identifier;\n\t            if (supportsTouch && e.touches) {\n\t                var i = e.touches.length, touch;\n\t                while (i--) {\n\t                    touch = e.touches[i];\n\t                    this._drag.id = touch.identifier;\n\t                    if (touch.identifier == this._drag.id) {\n\t                        x = touch.clientX;\n\t                        y = touch.clientY;\n\t                        break;\n\t                    }\n\t                }\n\t            }\n\t            this._drag.x = x + scrollX;\n\t            this._drag.y = y + scrollY;\n\t            !drag.length && R.mousemove(dragMove).mouseup(dragUp);\n\t            drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n\t            onstart && eve.on(\"raphael.drag.start.\" + this.id, onstart);\n\t            onmove && eve.on(\"raphael.drag.move.\" + this.id, onmove);\n\t            onend && eve.on(\"raphael.drag.end.\" + this.id, onend);\n\t            eve(\"raphael.drag.start.\" + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e);\n\t        }\n\t        this._drag = {};\n\t        draggable.push({el: this, start: start});\n\t        this.mousedown(start);\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.onDragOver\n\t     [ method ]\n\t     **\n\t     * Shortcut for assigning event handler for `drag.over.<id>` event, where id is id of the element (see @Element.id).\n\t     > Parameters\n\t     - f (function) handler for event, first argument would be the element you are dragging over\n\t    \\*/\n\t    elproto.onDragOver = function (f) {\n\t        f ? eve.on(\"raphael.drag.over.\" + this.id, f) : eve.unbind(\"raphael.drag.over.\" + this.id);\n\t    };\n\t    /*\\\n\t     * Element.undrag\n\t     [ method ]\n\t     **\n\t     * Removes all drag event handlers from given element.\n\t    \\*/\n\t    elproto.undrag = function () {\n\t        var i = draggable.length;\n\t        while (i--) if (draggable[i].el == this) {\n\t            this.unmousedown(draggable[i].start);\n\t            draggable.splice(i, 1);\n\t            eve.unbind(\"raphael.drag.*.\" + this.id);\n\t        }\n\t        !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp);\n\t        drag = [];\n\t    };\n\t    /*\\\n\t     * Paper.circle\n\t     [ method ]\n\t     **\n\t     * Draws a circle.\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) x coordinate of the centre\n\t     - y (number) y coordinate of the centre\n\t     - r (number) radius\n\t     = (object) Raphaël element object with type “circle”\n\t     **\n\t     > Usage\n\t     | var c = paper.circle(50, 50, 40);\n\t    \\*/\n\t    paperproto.circle = function (x, y, r) {\n\t        var out = R._engine.circle(this, x || 0, y || 0, r || 0);\n\t        this.__set__ && this.__set__.push(out);\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Paper.rect\n\t     [ method ]\n\t     *\n\t     * Draws a rectangle.\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) x coordinate of the top left corner\n\t     - y (number) y coordinate of the top left corner\n\t     - width (number) width\n\t     - height (number) height\n\t     - r (number) #optional radius for rounded corners, default is 0\n\t     = (object) Raphaël element object with type “rect”\n\t     **\n\t     > Usage\n\t     | // regular rectangle\n\t     | var c = paper.rect(10, 10, 50, 50);\n\t     | // rectangle with rounded corners\n\t     | var c = paper.rect(40, 40, 50, 50, 10);\n\t    \\*/\n\t    paperproto.rect = function (x, y, w, h, r) {\n\t        var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0);\n\t        this.__set__ && this.__set__.push(out);\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Paper.ellipse\n\t     [ method ]\n\t     **\n\t     * Draws an ellipse.\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) x coordinate of the centre\n\t     - y (number) y coordinate of the centre\n\t     - rx (number) horizontal radius\n\t     - ry (number) vertical radius\n\t     = (object) Raphaël element object with type “ellipse”\n\t     **\n\t     > Usage\n\t     | var c = paper.ellipse(50, 50, 40, 20);\n\t    \\*/\n\t    paperproto.ellipse = function (x, y, rx, ry) {\n\t        var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0);\n\t        this.__set__ && this.__set__.push(out);\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Paper.path\n\t     [ method ]\n\t     **\n\t     * Creates a path element by given path data string.\n\t     > Parameters\n\t     - pathString (string) #optional path string in SVG format.\n\t     * Path string consists of one-letter commands, followed by comma seprarated arguments in numercal form. Example:\n\t     | \"M10,20L30,40\"\n\t     * Here we can see two commands: “M”, with arguments `(10, 20)` and “L” with arguments `(30, 40)`. Upper case letter mean command is absolute, lower case—relative.\n\t     *\n\t     # <p>Here is short list of commands available, for more details see <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a>.</p>\n\t     # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\n\t     # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\n\t     # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\n\t     # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\n\t     # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\n\t     # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\n\t     # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\n\t     # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\n\t     # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr>\n\t     # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr>\n\t     # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\n\t     # <tr><td>R</td><td><a href=\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\n\t     * * “Catmull-Rom curveto” is a not standard SVG command and added in 2.0 to make life easier.\n\t     * Note: there is a special case when path consist of just three commands: “M10,10R…z”. In this case path will smoothly connects to its beginning.\n\t     > Usage\n\t     | var c = paper.path(\"M10 10L90 90\");\n\t     | // draw a diagonal line:\n\t     | // move to 10,10, line to 90,90\n\t     * For example of path strings, check out these icons: http://raphaeljs.com/icons/\n\t    \\*/\n\t    paperproto.path = function (pathString) {\n\t        pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E);\n\t        var out = R._engine.path(R.format[apply](R, arguments), this);\n\t        this.__set__ && this.__set__.push(out);\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Paper.image\n\t     [ method ]\n\t     **\n\t     * Embeds an image into the surface.\n\t     **\n\t     > Parameters\n\t     **\n\t     - src (string) URI of the source image\n\t     - x (number) x coordinate position\n\t     - y (number) y coordinate position\n\t     - width (number) width of the image\n\t     - height (number) height of the image\n\t     = (object) Raphaël element object with type “image”\n\t     **\n\t     > Usage\n\t     | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n\t    \\*/\n\t    paperproto.image = function (src, x, y, w, h) {\n\t        var out = R._engine.image(this, src || \"about:blank\", x || 0, y || 0, w || 0, h || 0);\n\t        this.__set__ && this.__set__.push(out);\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Paper.text\n\t     [ method ]\n\t     **\n\t     * Draws a text string. If you need line breaks, put “\\n” in the string.\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) x coordinate position\n\t     - y (number) y coordinate position\n\t     - text (string) The text string to draw\n\t     = (object) Raphaël element object with type “text”\n\t     **\n\t     > Usage\n\t     | var t = paper.text(50, 50, \"Raphaël\\nkicks\\nbutt!\");\n\t    \\*/\n\t    paperproto.text = function (x, y, text) {\n\t        var out = R._engine.text(this, x || 0, y || 0, Str(text));\n\t        this.__set__ && this.__set__.push(out);\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Paper.set\n\t     [ method ]\n\t     **\n\t     * Creates array-like object to keep and operate several elements at once.\n\t     * Warning: it doesn’t create any elements for itself in the page, it just groups existing elements.\n\t     * Sets act as pseudo elements — all methods available to an element can be used on a set.\n\t     = (object) array-like object that represents set of elements\n\t     **\n\t     > Usage\n\t     | var st = paper.set();\n\t     | st.push(\n\t     |     paper.circle(10, 10, 5),\n\t     |     paper.circle(30, 10, 5)\n\t     | );\n\t     | st.attr({fill: \"red\"}); // changes the fill of both circles\n\t    \\*/\n\t    paperproto.set = function (itemsArray) {\n\t        !R.is(itemsArray, \"array\") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length));\n\t        var out = new Set(itemsArray);\n\t        this.__set__ && this.__set__.push(out);\n\t        out[\"paper\"] = this;\n\t        out[\"type\"] = \"set\";\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Paper.setStart\n\t     [ method ]\n\t     **\n\t     * Creates @Paper.set. All elements that will be created after calling this method and before calling\n\t     * @Paper.setFinish will be added to the set.\n\t     **\n\t     > Usage\n\t     | paper.setStart();\n\t     | paper.circle(10, 10, 5),\n\t     | paper.circle(30, 10, 5)\n\t     | var st = paper.setFinish();\n\t     | st.attr({fill: \"red\"}); // changes the fill of both circles\n\t    \\*/\n\t    paperproto.setStart = function (set) {\n\t        this.__set__ = set || this.set();\n\t    };\n\t    /*\\\n\t     * Paper.setFinish\n\t     [ method ]\n\t     **\n\t     * See @Paper.setStart. This method finishes catching and returns resulting set.\n\t     **\n\t     = (object) set\n\t    \\*/\n\t    paperproto.setFinish = function (set) {\n\t        var out = this.__set__;\n\t        delete this.__set__;\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Paper.getSize\n\t     [ method ]\n\t     **\n\t     * Obtains current paper actual size.\n\t     **\n\t     = (object)\n\t     \\*/\n\t    paperproto.getSize = function () {\n\t        var container = this.canvas.parentNode;\n\t        return {\n\t            width: container.offsetWidth,\n\t            height: container.offsetHeight\n\t                };\n\t        };\n\t    /*\\\n\t     * Paper.setSize\n\t     [ method ]\n\t     **\n\t     * If you need to change dimensions of the canvas call this method\n\t     **\n\t     > Parameters\n\t     **\n\t     - width (number) new width of the canvas\n\t     - height (number) new height of the canvas\n\t    \\*/\n\t    paperproto.setSize = function (width, height) {\n\t        return R._engine.setSize.call(this, width, height);\n\t    };\n\t    /*\\\n\t     * Paper.setViewBox\n\t     [ method ]\n\t     **\n\t     * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by\n\t     * specifying new boundaries.\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) new x position, default is `0`\n\t     - y (number) new y position, default is `0`\n\t     - w (number) new width of the canvas\n\t     - h (number) new height of the canvas\n\t     - fit (boolean) `true` if you want graphics to fit into new boundary box\n\t    \\*/\n\t    paperproto.setViewBox = function (x, y, w, h, fit) {\n\t        return R._engine.setViewBox.call(this, x, y, w, h, fit);\n\t    };\n\t    /*\\\n\t     * Paper.top\n\t     [ property ]\n\t     **\n\t     * Points to the topmost element on the paper\n\t    \\*/\n\t    /*\\\n\t     * Paper.bottom\n\t     [ property ]\n\t     **\n\t     * Points to the bottom element on the paper\n\t    \\*/\n\t    paperproto.top = paperproto.bottom = null;\n\t    /*\\\n\t     * Paper.raphael\n\t     [ property ]\n\t     **\n\t     * Points to the @Raphael object/function\n\t    \\*/\n\t    paperproto.raphael = R;\n\t    var getOffset = function (elem) {\n\t        var box = elem.getBoundingClientRect(),\n\t            doc = elem.ownerDocument,\n\t            body = doc.body,\n\t            docElem = doc.documentElement,\n\t            clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n\t            top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n\t            left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n\t        return {\n\t            y: top,\n\t            x: left\n\t        };\n\t    };\n\t    /*\\\n\t     * Paper.getElementByPoint\n\t     [ method ]\n\t     **\n\t     * Returns you topmost element under given point.\n\t     **\n\t     = (object) Raphaël element object\n\t     > Parameters\n\t     **\n\t     - x (number) x coordinate from the top left corner of the window\n\t     - y (number) y coordinate from the top left corner of the window\n\t     > Usage\n\t     | paper.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n\t    \\*/\n\t    paperproto.getElementByPoint = function (x, y) {\n\t        var paper = this,\n\t            svg = paper.canvas,\n\t            target = g.doc.elementFromPoint(x, y);\n\t        if (g.win.opera && target.tagName == \"svg\") {\n\t            var so = getOffset(svg),\n\t                sr = svg.createSVGRect();\n\t            sr.x = x - so.x;\n\t            sr.y = y - so.y;\n\t            sr.width = sr.height = 1;\n\t            var hits = svg.getIntersectionList(sr, null);\n\t            if (hits.length) {\n\t                target = hits[hits.length - 1];\n\t            }\n\t        }\n\t        if (!target) {\n\t            return null;\n\t        }\n\t        while (target.parentNode && target != svg.parentNode && !target.raphael) {\n\t            target = target.parentNode;\n\t        }\n\t        target == paper.canvas.parentNode && (target = svg);\n\t        target = target && target.raphael ? paper.getById(target.raphaelid) : null;\n\t        return target;\n\t    };\n\n\t    /*\\\n\t     * Paper.getElementsByBBox\n\t     [ method ]\n\t     **\n\t     * Returns set of elements that have an intersecting bounding box\n\t     **\n\t     > Parameters\n\t     **\n\t     - bbox (object) bbox to check with\n\t     = (object) @Set\n\t     \\*/\n\t    paperproto.getElementsByBBox = function (bbox) {\n\t        var set = this.set();\n\t        this.forEach(function (el) {\n\t            if (R.isBBoxIntersect(el.getBBox(), bbox)) {\n\t                set.push(el);\n\t            }\n\t        });\n\t        return set;\n\t    };\n\n\t    /*\\\n\t     * Paper.getById\n\t     [ method ]\n\t     **\n\t     * Returns you element by its internal ID.\n\t     **\n\t     > Parameters\n\t     **\n\t     - id (number) id\n\t     = (object) Raphaël element object\n\t    \\*/\n\t    paperproto.getById = function (id) {\n\t        var bot = this.bottom;\n\t        while (bot) {\n\t            if (bot.id == id) {\n\t                return bot;\n\t            }\n\t            bot = bot.next;\n\t        }\n\t        return null;\n\t    };\n\t    /*\\\n\t     * Paper.forEach\n\t     [ method ]\n\t     **\n\t     * Executes given function for each element on the paper\n\t     *\n\t     * If callback function returns `false` it will stop loop running.\n\t     **\n\t     > Parameters\n\t     **\n\t     - callback (function) function to run\n\t     - thisArg (object) context object for the callback\n\t     = (object) Paper object\n\t     > Usage\n\t     | paper.forEach(function (el) {\n\t     |     el.attr({ stroke: \"blue\" });\n\t     | });\n\t    \\*/\n\t    paperproto.forEach = function (callback, thisArg) {\n\t        var bot = this.bottom;\n\t        while (bot) {\n\t            if (callback.call(thisArg, bot) === false) {\n\t                return this;\n\t            }\n\t            bot = bot.next;\n\t        }\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Paper.getElementsByPoint\n\t     [ method ]\n\t     **\n\t     * Returns set of elements that have common point inside\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) x coordinate of the point\n\t     - y (number) y coordinate of the point\n\t     = (object) @Set\n\t    \\*/\n\t    paperproto.getElementsByPoint = function (x, y) {\n\t        var set = this.set();\n\t        this.forEach(function (el) {\n\t            if (el.isPointInside(x, y)) {\n\t                set.push(el);\n\t            }\n\t        });\n\t        return set;\n\t    };\n\t    function x_y() {\n\t        return this.x + S + this.y;\n\t    }\n\t    function x_y_w_h() {\n\t        return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n\t    }\n\t    /*\\\n\t     * Element.isPointInside\n\t     [ method ]\n\t     **\n\t     * Determine if given point is inside this element’s shape\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) x coordinate of the point\n\t     - y (number) y coordinate of the point\n\t     = (boolean) `true` if point inside the shape\n\t    \\*/\n\t    elproto.isPointInside = function (x, y) {\n\t        var rp = this.realPath = getPath[this.type](this);\n\t        if (this.attr('transform') && this.attr('transform').length) {\n\t            rp = R.transformPath(rp, this.attr('transform'));\n\t        }\n\t        return R.isPointInsidePath(rp, x, y);\n\t    };\n\t    /*\\\n\t     * Element.getBBox\n\t     [ method ]\n\t     **\n\t     * Return bounding box for a given element\n\t     **\n\t     > Parameters\n\t     **\n\t     - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`.\n\t     = (object) Bounding box object:\n\t     o {\n\t     o     x: (number) top left corner x\n\t     o     y: (number) top left corner y\n\t     o     x2: (number) bottom right corner x\n\t     o     y2: (number) bottom right corner y\n\t     o     width: (number) width\n\t     o     height: (number) height\n\t     o }\n\t    \\*/\n\t    elproto.getBBox = function (isWithoutTransform) {\n\t        if (this.removed) {\n\t            return {};\n\t        }\n\t        var _ = this._;\n\t        if (isWithoutTransform) {\n\t            if (_.dirty || !_.bboxwt) {\n\t                this.realPath = getPath[this.type](this);\n\t                _.bboxwt = pathDimensions(this.realPath);\n\t                _.bboxwt.toString = x_y_w_h;\n\t                _.dirty = 0;\n\t            }\n\t            return _.bboxwt;\n\t        }\n\t        if (_.dirty || _.dirtyT || !_.bbox) {\n\t            if (_.dirty || !this.realPath) {\n\t                _.bboxwt = 0;\n\t                this.realPath = getPath[this.type](this);\n\t            }\n\t            _.bbox = pathDimensions(mapPath(this.realPath, this.matrix));\n\t            _.bbox.toString = x_y_w_h;\n\t            _.dirty = _.dirtyT = 0;\n\t        }\n\t        return _.bbox;\n\t    };\n\t    /*\\\n\t     * Element.clone\n\t     [ method ]\n\t     **\n\t     = (object) clone of a given element\n\t     **\n\t    \\*/\n\t    elproto.clone = function () {\n\t        if (this.removed) {\n\t            return null;\n\t        }\n\t        var out = this.paper[this.type]().attr(this.attr());\n\t        this.__set__ && this.__set__.push(out);\n\t        return out;\n\t    };\n\t    /*\\\n\t     * Element.glow\n\t     [ method ]\n\t     **\n\t     * Return set of elements that create glow-like effect around given element. See @Paper.set.\n\t     *\n\t     * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.\n\t     **\n\t     > Parameters\n\t     **\n\t     - glow (object) #optional parameters object with all properties optional:\n\t     o {\n\t     o     width (number) size of the glow, default is `10`\n\t     o     fill (boolean) will it be filled, default is `false`\n\t     o     opacity (number) opacity, default is `0.5`\n\t     o     offsetx (number) horizontal offset, default is `0`\n\t     o     offsety (number) vertical offset, default is `0`\n\t     o     color (string) glow colour, default is `black`\n\t     o }\n\t     = (object) @Paper.set of elements that represents glow\n\t    \\*/\n\t    elproto.glow = function (glow) {\n\t        if (this.type == \"text\") {\n\t            return null;\n\t        }\n\t        glow = glow || {};\n\t        var s = {\n\t            width: (glow.width || 10) + (+this.attr(\"stroke-width\") || 1),\n\t            fill: glow.fill || false,\n\t            opacity: glow.opacity == null ? .5 : glow.opacity,\n\t            offsetx: glow.offsetx || 0,\n\t            offsety: glow.offsety || 0,\n\t            color: glow.color || \"#000\"\n\t        },\n\t            c = s.width / 2,\n\t            r = this.paper,\n\t            out = r.set(),\n\t            path = this.realPath || getPath[this.type](this);\n\t        path = this.matrix ? mapPath(path, this.matrix) : path;\n\t        for (var i = 1; i < c + 1; i++) {\n\t            out.push(r.path(path).attr({\n\t                stroke: s.color,\n\t                fill: s.fill ? s.color : \"none\",\n\t                \"stroke-linejoin\": \"round\",\n\t                \"stroke-linecap\": \"round\",\n\t                \"stroke-width\": +(s.width / c * i).toFixed(3),\n\t                opacity: +(s.opacity / c).toFixed(3)\n\t            }));\n\t        }\n\t        return out.insertBefore(this).translate(s.offsetx, s.offsety);\n\t    };\n\t    var curveslengths = {},\n\t    getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n\t        if (length == null) {\n\t            return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n\t        } else {\n\t            return R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, getTatLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n\t        }\n\t    },\n\t    getLengthFactory = function (istotal, subpath) {\n\t        return function (path, length, onlystart) {\n\t            path = path2curve(path);\n\t            var x, y, p, l, sp = \"\", subpaths = {}, point,\n\t                len = 0;\n\t            for (var i = 0, ii = path.length; i < ii; i++) {\n\t                p = path[i];\n\t                if (p[0] == \"M\") {\n\t                    x = +p[1];\n\t                    y = +p[2];\n\t                } else {\n\t                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n\t                    if (len + l > length) {\n\t                        if (subpath && !subpaths.start) {\n\t                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n\t                            sp += [\"C\" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];\n\t                            if (onlystart) {return sp;}\n\t                            subpaths.start = sp;\n\t                            sp = [\"M\" + point.x, point.y + \"C\" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join();\n\t                            len += l;\n\t                            x = +p[5];\n\t                            y = +p[6];\n\t                            continue;\n\t                        }\n\t                        if (!istotal && !subpath) {\n\t                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n\t                            return {x: point.x, y: point.y, alpha: point.alpha};\n\t                        }\n\t                    }\n\t                    len += l;\n\t                    x = +p[5];\n\t                    y = +p[6];\n\t                }\n\t                sp += p.shift() + p;\n\t            }\n\t            subpaths.end = sp;\n\t            point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n\t            point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha});\n\t            return point;\n\t        };\n\t    };\n\t    var getTotalLength = getLengthFactory(1),\n\t        getPointAtLength = getLengthFactory(),\n\t        getSubpathsAtLength = getLengthFactory(0, 1);\n\t    /*\\\n\t     * Raphael.getTotalLength\n\t     [ method ]\n\t     **\n\t     * Returns length of the given path in pixels.\n\t     **\n\t     > Parameters\n\t     **\n\t     - path (string) SVG path string.\n\t     **\n\t     = (number) length.\n\t    \\*/\n\t    R.getTotalLength = getTotalLength;\n\t    /*\\\n\t     * Raphael.getPointAtLength\n\t     [ method ]\n\t     **\n\t     * Return coordinates of the point located at the given length on the given path.\n\t     **\n\t     > Parameters\n\t     **\n\t     - path (string) SVG path string\n\t     - length (number)\n\t     **\n\t     = (object) representation of the point:\n\t     o {\n\t     o     x: (number) x coordinate\n\t     o     y: (number) y coordinate\n\t     o     alpha: (number) angle of derivative\n\t     o }\n\t    \\*/\n\t    R.getPointAtLength = getPointAtLength;\n\t    /*\\\n\t     * Raphael.getSubpath\n\t     [ method ]\n\t     **\n\t     * Return subpath of a given path from given length to given length.\n\t     **\n\t     > Parameters\n\t     **\n\t     - path (string) SVG path string\n\t     - from (number) position of the start of the segment\n\t     - to (number) position of the end of the segment\n\t     **\n\t     = (string) pathstring for the segment\n\t    \\*/\n\t    R.getSubpath = function (path, from, to) {\n\t        if (this.getTotalLength(path) - to < 1e-6) {\n\t            return getSubpathsAtLength(path, from).end;\n\t        }\n\t        var a = getSubpathsAtLength(path, to, 1);\n\t        return from ? getSubpathsAtLength(a, from).end : a;\n\t    };\n\t    /*\\\n\t     * Element.getTotalLength\n\t     [ method ]\n\t     **\n\t     * Returns length of the path in pixels. Only works for element of “path” type.\n\t     = (number) length.\n\t    \\*/\n\t    elproto.getTotalLength = function () {\n\t        var path = this.getPath();\n\t        if (!path) {\n\t            return;\n\t        }\n\n\t        if (this.node.getTotalLength) {\n\t            return this.node.getTotalLength();\n\t        }\n\n\t        return getTotalLength(path);\n\t    };\n\t    /*\\\n\t     * Element.getPointAtLength\n\t     [ method ]\n\t     **\n\t     * Return coordinates of the point located at the given length on the given path. Only works for element of “path” type.\n\t     **\n\t     > Parameters\n\t     **\n\t     - length (number)\n\t     **\n\t     = (object) representation of the point:\n\t     o {\n\t     o     x: (number) x coordinate\n\t     o     y: (number) y coordinate\n\t     o     alpha: (number) angle of derivative\n\t     o }\n\t    \\*/\n\t    elproto.getPointAtLength = function (length) {\n\t        var path = this.getPath();\n\t        if (!path) {\n\t            return;\n\t        }\n\n\t        return getPointAtLength(path, length);\n\t    };\n\t    /*\\\n\t     * Element.getPath\n\t     [ method ]\n\t     **\n\t     * Returns path of the element. Only works for elements of “path” type and simple elements like circle.\n\t     = (object) path\n\t     **\n\t    \\*/\n\t    elproto.getPath = function () {\n\t        var path,\n\t            getPath = R._getPath[this.type];\n\n\t        if (this.type == \"text\" || this.type == \"set\") {\n\t            return;\n\t        }\n\n\t        if (getPath) {\n\t            path = getPath(this);\n\t        }\n\n\t        return path;\n\t    };\n\t    /*\\\n\t     * Element.getSubpath\n\t     [ method ]\n\t     **\n\t     * Return subpath of a given element from given length to given length. Only works for element of “path” type.\n\t     **\n\t     > Parameters\n\t     **\n\t     - from (number) position of the start of the segment\n\t     - to (number) position of the end of the segment\n\t     **\n\t     = (string) pathstring for the segment\n\t    \\*/\n\t    elproto.getSubpath = function (from, to) {\n\t        var path = this.getPath();\n\t        if (!path) {\n\t            return;\n\t        }\n\n\t        return R.getSubpath(path, from, to);\n\t    };\n\t    /*\\\n\t     * Raphael.easing_formulas\n\t     [ property ]\n\t     **\n\t     * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing:\n\t     # <ul>\n\t     #     <li>“linear”</li>\n\t     #     <li>“&lt;” or “easeIn” or “ease-in”</li>\n\t     #     <li>“>” or “easeOut” or “ease-out”</li>\n\t     #     <li>“&lt;>” or “easeInOut” or “ease-in-out”</li>\n\t     #     <li>“backIn” or “back-in”</li>\n\t     #     <li>“backOut” or “back-out”</li>\n\t     #     <li>“elastic”</li>\n\t     #     <li>“bounce”</li>\n\t     # </ul>\n\t     # <p>See also <a href=\"http://raphaeljs.com/easing.html\">Easing demo</a>.</p>\n\t    \\*/\n\t    var ef = R.easing_formulas = {\n\t        linear: function (n) {\n\t            return n;\n\t        },\n\t        \"<\": function (n) {\n\t            return pow(n, 1.7);\n\t        },\n\t        \">\": function (n) {\n\t            return pow(n, .48);\n\t        },\n\t        \"<>\": function (n) {\n\t            var q = .48 - n / 1.04,\n\t                Q = math.sqrt(.1734 + q * q),\n\t                x = Q - q,\n\t                X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n\t                y = -Q - q,\n\t                Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n\t                t = X + Y + .5;\n\t            return (1 - t) * 3 * t * t + t * t * t;\n\t        },\n\t        backIn: function (n) {\n\t            var s = 1.70158;\n\t            return n * n * ((s + 1) * n - s);\n\t        },\n\t        backOut: function (n) {\n\t            n = n - 1;\n\t            var s = 1.70158;\n\t            return n * n * ((s + 1) * n + s) + 1;\n\t        },\n\t        elastic: function (n) {\n\t            if (n == !!n) {\n\t                return n;\n\t            }\n\t            return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1;\n\t        },\n\t        bounce: function (n) {\n\t            var s = 7.5625,\n\t                p = 2.75,\n\t                l;\n\t            if (n < (1 / p)) {\n\t                l = s * n * n;\n\t            } else {\n\t                if (n < (2 / p)) {\n\t                    n -= (1.5 / p);\n\t                    l = s * n * n + .75;\n\t                } else {\n\t                    if (n < (2.5 / p)) {\n\t                        n -= (2.25 / p);\n\t                        l = s * n * n + .9375;\n\t                    } else {\n\t                        n -= (2.625 / p);\n\t                        l = s * n * n + .984375;\n\t                    }\n\t                }\n\t            }\n\t            return l;\n\t        }\n\t    };\n\t    ef.easeIn = ef[\"ease-in\"] = ef[\"<\"];\n\t    ef.easeOut = ef[\"ease-out\"] = ef[\">\"];\n\t    ef.easeInOut = ef[\"ease-in-out\"] = ef[\"<>\"];\n\t    ef[\"back-in\"] = ef.backIn;\n\t    ef[\"back-out\"] = ef.backOut;\n\n\t    var animationElements = [],\n\t        requestAnimFrame = window.requestAnimationFrame       ||\n\t                           window.webkitRequestAnimationFrame ||\n\t                           window.mozRequestAnimationFrame    ||\n\t                           window.oRequestAnimationFrame      ||\n\t                           window.msRequestAnimationFrame     ||\n\t                           function (callback) {\n\t                               setTimeout(callback, 16);\n\t                           },\n\t        animation = function () {\n\t            var Now = +new Date,\n\t                l = 0;\n\t            for (; l < animationElements.length; l++) {\n\t                var e = animationElements[l];\n\t                if (e.el.removed || e.paused) {\n\t                    continue;\n\t                }\n\t                var time = Now - e.start,\n\t                    ms = e.ms,\n\t                    easing = e.easing,\n\t                    from = e.from,\n\t                    diff = e.diff,\n\t                    to = e.to,\n\t                    t = e.t,\n\t                    that = e.el,\n\t                    set = {},\n\t                    now,\n\t                    init = {},\n\t                    key;\n\t                if (e.initstatus) {\n\t                    time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms;\n\t                    e.status = e.initstatus;\n\t                    delete e.initstatus;\n\t                    e.stop && animationElements.splice(l--, 1);\n\t                } else {\n\t                    e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top;\n\t                }\n\t                if (time < 0) {\n\t                    continue;\n\t                }\n\t                if (time < ms) {\n\t                    var pos = easing(time / ms);\n\t                    for (var attr in from) if (from[has](attr)) {\n\t                        switch (availableAnimAttrs[attr]) {\n\t                            case nu:\n\t                                now = +from[attr] + pos * ms * diff[attr];\n\t                                break;\n\t                            case \"colour\":\n\t                                now = \"rgb(\" + [\n\t                                    upto255(round(from[attr].r + pos * ms * diff[attr].r)),\n\t                                    upto255(round(from[attr].g + pos * ms * diff[attr].g)),\n\t                                    upto255(round(from[attr].b + pos * ms * diff[attr].b))\n\t                                ].join(\",\") + \")\";\n\t                                break;\n\t                            case \"path\":\n\t                                now = [];\n\t                                for (var i = 0, ii = from[attr].length; i < ii; i++) {\n\t                                    now[i] = [from[attr][i][0]];\n\t                                    for (var j = 1, jj = from[attr][i].length; j < jj; j++) {\n\t                                        now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];\n\t                                    }\n\t                                    now[i] = now[i].join(S);\n\t                                }\n\t                                now = now.join(S);\n\t                                break;\n\t                            case \"transform\":\n\t                                if (diff[attr].real) {\n\t                                    now = [];\n\t                                    for (i = 0, ii = from[attr].length; i < ii; i++) {\n\t                                        now[i] = [from[attr][i][0]];\n\t                                        for (j = 1, jj = from[attr][i].length; j < jj; j++) {\n\t                                            now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j];\n\t                                        }\n\t                                    }\n\t                                } else {\n\t                                    var get = function (i) {\n\t                                        return +from[attr][i] + pos * ms * diff[attr][i];\n\t                                    };\n\t                                    // now = [[\"r\", get(2), 0, 0], [\"t\", get(3), get(4)], [\"s\", get(0), get(1), 0, 0]];\n\t                                    now = [[\"m\", get(0), get(1), get(2), get(3), get(4), get(5)]];\n\t                                }\n\t                                break;\n\t                            case \"csv\":\n\t                                if (attr == \"clip-rect\") {\n\t                                    now = [];\n\t                                    i = 4;\n\t                                    while (i--) {\n\t                                        now[i] = +from[attr][i] + pos * ms * diff[attr][i];\n\t                                    }\n\t                                }\n\t                                break;\n\t                            default:\n\t                                var from2 = [][concat](from[attr]);\n\t                                now = [];\n\t                                i = that.paper.customAttributes[attr].length;\n\t                                while (i--) {\n\t                                    now[i] = +from2[i] + pos * ms * diff[attr][i];\n\t                                }\n\t                                break;\n\t                        }\n\t                        set[attr] = now;\n\t                    }\n\t                    that.attr(set);\n\t                    (function (id, that, anim) {\n\t                        setTimeout(function () {\n\t                            eve(\"raphael.anim.frame.\" + id, that, anim);\n\t                        });\n\t                    })(that.id, that, e.anim);\n\t                } else {\n\t                    (function(f, el, a) {\n\t                        setTimeout(function() {\n\t                            eve(\"raphael.anim.frame.\" + el.id, el, a);\n\t                            eve(\"raphael.anim.finish.\" + el.id, el, a);\n\t                            R.is(f, \"function\") && f.call(el);\n\t                        });\n\t                    })(e.callback, that, e.anim);\n\t                    that.attr(to);\n\t                    animationElements.splice(l--, 1);\n\t                    if (e.repeat > 1 && !e.next) {\n\t                        for (key in to) if (to[has](key)) {\n\t                            init[key] = e.totalOrigin[key];\n\t                        }\n\t                        e.el.attr(init);\n\t                        runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1);\n\t                    }\n\t                    if (e.next && !e.stop) {\n\t                        runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat);\n\t                    }\n\t                }\n\t            }\n\t            animationElements.length && requestAnimFrame(animation);\n\t        },\n\t        upto255 = function (color) {\n\t            return color > 255 ? 255 : color < 0 ? 0 : color;\n\t        };\n\t    /*\\\n\t     * Element.animateWith\n\t     [ method ]\n\t     **\n\t     * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element.\n\t     **\n\t     > Parameters\n\t     **\n\t     - el (object) element to sync with\n\t     - anim (object) animation to sync with\n\t     - params (object) #optional final attributes for the element, see also @Element.attr\n\t     - ms (number) #optional number of milliseconds for animation to run\n\t     - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#160;XX,&#160;XX,&#160;XX)`\n\t     - callback (function) #optional callback function. Will be called at the end of animation.\n\t     * or\n\t     - element (object) element to sync with\n\t     - anim (object) animation to sync with\n\t     - animation (object) #optional animation object, see @Raphael.animation\n\t     **\n\t     = (object) original element\n\t    \\*/\n\t    elproto.animateWith = function (el, anim, params, ms, easing, callback) {\n\t        var element = this;\n\t        if (element.removed) {\n\t            callback && callback.call(element);\n\t            return element;\n\t        }\n\t        var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback),\n\t            x, y;\n\t        runAnimation(a, element, a.percents[0], null, element.attr());\n\t        for (var i = 0, ii = animationElements.length; i < ii; i++) {\n\t            if (animationElements[i].anim == anim && animationElements[i].el == el) {\n\t                animationElements[ii - 1].start = animationElements[i].start;\n\t                break;\n\t            }\n\t        }\n\t        return element;\n\t        //\n\t        //\n\t        // var a = params ? R.animation(params, ms, easing, callback) : anim,\n\t        //     status = element.status(anim);\n\t        // return this.animate(a).status(a, status * anim.ms / a.ms);\n\t    };\n\t    function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {\n\t        var cx = 3 * p1x,\n\t            bx = 3 * (p2x - p1x) - cx,\n\t            ax = 1 - cx - bx,\n\t            cy = 3 * p1y,\n\t            by = 3 * (p2y - p1y) - cy,\n\t            ay = 1 - cy - by;\n\t        function sampleCurveX(t) {\n\t            return ((ax * t + bx) * t + cx) * t;\n\t        }\n\t        function solve(x, epsilon) {\n\t            var t = solveCurveX(x, epsilon);\n\t            return ((ay * t + by) * t + cy) * t;\n\t        }\n\t        function solveCurveX(x, epsilon) {\n\t            var t0, t1, t2, x2, d2, i;\n\t            for(t2 = x, i = 0; i < 8; i++) {\n\t                x2 = sampleCurveX(t2) - x;\n\t                if (abs(x2) < epsilon) {\n\t                    return t2;\n\t                }\n\t                d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;\n\t                if (abs(d2) < 1e-6) {\n\t                    break;\n\t                }\n\t                t2 = t2 - x2 / d2;\n\t            }\n\t            t0 = 0;\n\t            t1 = 1;\n\t            t2 = x;\n\t            if (t2 < t0) {\n\t                return t0;\n\t            }\n\t            if (t2 > t1) {\n\t                return t1;\n\t            }\n\t            while (t0 < t1) {\n\t                x2 = sampleCurveX(t2);\n\t                if (abs(x2 - x) < epsilon) {\n\t                    return t2;\n\t                }\n\t                if (x > x2) {\n\t                    t0 = t2;\n\t                } else {\n\t                    t1 = t2;\n\t                }\n\t                t2 = (t1 - t0) / 2 + t0;\n\t            }\n\t            return t2;\n\t        }\n\t        return solve(t, 1 / (200 * duration));\n\t    }\n\t    elproto.onAnimation = function (f) {\n\t        f ? eve.on(\"raphael.anim.frame.\" + this.id, f) : eve.unbind(\"raphael.anim.frame.\" + this.id);\n\t        return this;\n\t    };\n\t    function Animation(anim, ms) {\n\t        var percents = [],\n\t            newAnim = {};\n\t        this.ms = ms;\n\t        this.times = 1;\n\t        if (anim) {\n\t            for (var attr in anim) if (anim[has](attr)) {\n\t                newAnim[toFloat(attr)] = anim[attr];\n\t                percents.push(toFloat(attr));\n\t            }\n\t            percents.sort(sortByNumber);\n\t        }\n\t        this.anim = newAnim;\n\t        this.top = percents[percents.length - 1];\n\t        this.percents = percents;\n\t    }\n\t    /*\\\n\t     * Animation.delay\n\t     [ method ]\n\t     **\n\t     * Creates a copy of existing animation object with given delay.\n\t     **\n\t     > Parameters\n\t     **\n\t     - delay (number) number of ms to pass between animation start and actual animation\n\t     **\n\t     = (object) new altered Animation object\n\t     | var anim = Raphael.animation({cx: 10, cy: 20}, 2e3);\n\t     | circle1.animate(anim); // run the given animation immediately\n\t     | circle2.animate(anim.delay(500)); // run the given animation after 500 ms\n\t    \\*/\n\t    Animation.prototype.delay = function (delay) {\n\t        var a = new Animation(this.anim, this.ms);\n\t        a.times = this.times;\n\t        a.del = +delay || 0;\n\t        return a;\n\t    };\n\t    /*\\\n\t     * Animation.repeat\n\t     [ method ]\n\t     **\n\t     * Creates a copy of existing animation object with given repetition.\n\t     **\n\t     > Parameters\n\t     **\n\t     - repeat (number) number iterations of animation. For infinite animation pass `Infinity`\n\t     **\n\t     = (object) new altered Animation object\n\t    \\*/\n\t    Animation.prototype.repeat = function (times) {\n\t        var a = new Animation(this.anim, this.ms);\n\t        a.del = this.del;\n\t        a.times = math.floor(mmax(times, 0)) || 1;\n\t        return a;\n\t    };\n\t    function runAnimation(anim, element, percent, status, totalOrigin, times) {\n\t        percent = toFloat(percent);\n\t        var params,\n\t            isInAnim,\n\t            isInAnimSet,\n\t            percents = [],\n\t            next,\n\t            prev,\n\t            timestamp,\n\t            ms = anim.ms,\n\t            from = {},\n\t            to = {},\n\t            diff = {};\n\t        if (status) {\n\t            for (i = 0, ii = animationElements.length; i < ii; i++) {\n\t                var e = animationElements[i];\n\t                if (e.el.id == element.id && e.anim == anim) {\n\t                    if (e.percent != percent) {\n\t                        animationElements.splice(i, 1);\n\t                        isInAnimSet = 1;\n\t                    } else {\n\t                        isInAnim = e;\n\t                    }\n\t                    element.attr(e.totalOrigin);\n\t                    break;\n\t                }\n\t            }\n\t        } else {\n\t            status = +to; // NaN\n\t        }\n\t        for (var i = 0, ii = anim.percents.length; i < ii; i++) {\n\t            if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) {\n\t                percent = anim.percents[i];\n\t                prev = anim.percents[i - 1] || 0;\n\t                ms = ms / anim.top * (percent - prev);\n\t                next = anim.percents[i + 1];\n\t                params = anim.anim[percent];\n\t                break;\n\t            } else if (status) {\n\t                element.attr(anim.anim[anim.percents[i]]);\n\t            }\n\t        }\n\t        if (!params) {\n\t            return;\n\t        }\n\t        if (!isInAnim) {\n\t            for (var attr in params) if (params[has](attr)) {\n\t                if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) {\n\t                    from[attr] = element.attr(attr);\n\t                    (from[attr] == null) && (from[attr] = availableAttrs[attr]);\n\t                    to[attr] = params[attr];\n\t                    switch (availableAnimAttrs[attr]) {\n\t                        case nu:\n\t                            diff[attr] = (to[attr] - from[attr]) / ms;\n\t                            break;\n\t                        case \"colour\":\n\t                            from[attr] = R.getRGB(from[attr]);\n\t                            var toColour = R.getRGB(to[attr]);\n\t                            diff[attr] = {\n\t                                r: (toColour.r - from[attr].r) / ms,\n\t                                g: (toColour.g - from[attr].g) / ms,\n\t                                b: (toColour.b - from[attr].b) / ms\n\t                            };\n\t                            break;\n\t                        case \"path\":\n\t                            var pathes = path2curve(from[attr], to[attr]),\n\t                                toPath = pathes[1];\n\t                            from[attr] = pathes[0];\n\t                            diff[attr] = [];\n\t                            for (i = 0, ii = from[attr].length; i < ii; i++) {\n\t                                diff[attr][i] = [0];\n\t                                for (var j = 1, jj = from[attr][i].length; j < jj; j++) {\n\t                                    diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms;\n\t                                }\n\t                            }\n\t                            break;\n\t                        case \"transform\":\n\t                            var _ = element._,\n\t                                eq = equaliseTransform(_[attr], to[attr]);\n\t                            if (eq) {\n\t                                from[attr] = eq.from;\n\t                                to[attr] = eq.to;\n\t                                diff[attr] = [];\n\t                                diff[attr].real = true;\n\t                                for (i = 0, ii = from[attr].length; i < ii; i++) {\n\t                                    diff[attr][i] = [from[attr][i][0]];\n\t                                    for (j = 1, jj = from[attr][i].length; j < jj; j++) {\n\t                                        diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;\n\t                                    }\n\t                                }\n\t                            } else {\n\t                                var m = (element.matrix || new Matrix),\n\t                                    to2 = {\n\t                                        _: {transform: _.transform},\n\t                                        getBBox: function () {\n\t                                            return element.getBBox(1);\n\t                                        }\n\t                                    };\n\t                                from[attr] = [\n\t                                    m.a,\n\t                                    m.b,\n\t                                    m.c,\n\t                                    m.d,\n\t                                    m.e,\n\t                                    m.f\n\t                                ];\n\t                                extractTransform(to2, to[attr]);\n\t                                to[attr] = to2._.transform;\n\t                                diff[attr] = [\n\t                                    (to2.matrix.a - m.a) / ms,\n\t                                    (to2.matrix.b - m.b) / ms,\n\t                                    (to2.matrix.c - m.c) / ms,\n\t                                    (to2.matrix.d - m.d) / ms,\n\t                                    (to2.matrix.e - m.e) / ms,\n\t                                    (to2.matrix.f - m.f) / ms\n\t                                ];\n\t                                // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy];\n\t                                // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }};\n\t                                // extractTransform(to2, to[attr]);\n\t                                // diff[attr] = [\n\t                                //     (to2._.sx - _.sx) / ms,\n\t                                //     (to2._.sy - _.sy) / ms,\n\t                                //     (to2._.deg - _.deg) / ms,\n\t                                //     (to2._.dx - _.dx) / ms,\n\t                                //     (to2._.dy - _.dy) / ms\n\t                                // ];\n\t                            }\n\t                            break;\n\t                        case \"csv\":\n\t                            var values = Str(params[attr])[split](separator),\n\t                                from2 = Str(from[attr])[split](separator);\n\t                            if (attr == \"clip-rect\") {\n\t                                from[attr] = from2;\n\t                                diff[attr] = [];\n\t                                i = from2.length;\n\t                                while (i--) {\n\t                                    diff[attr][i] = (values[i] - from[attr][i]) / ms;\n\t                                }\n\t                            }\n\t                            to[attr] = values;\n\t                            break;\n\t                        default:\n\t                            values = [][concat](params[attr]);\n\t                            from2 = [][concat](from[attr]);\n\t                            diff[attr] = [];\n\t                            i = element.paper.customAttributes[attr].length;\n\t                            while (i--) {\n\t                                diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms;\n\t                            }\n\t                            break;\n\t                    }\n\t                }\n\t            }\n\t            var easing = params.easing,\n\t                easyeasy = R.easing_formulas[easing];\n\t            if (!easyeasy) {\n\t                easyeasy = Str(easing).match(bezierrg);\n\t                if (easyeasy && easyeasy.length == 5) {\n\t                    var curve = easyeasy;\n\t                    easyeasy = function (t) {\n\t                        return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms);\n\t                    };\n\t                } else {\n\t                    easyeasy = pipe;\n\t                }\n\t            }\n\t            timestamp = params.start || anim.start || +new Date;\n\t            e = {\n\t                anim: anim,\n\t                percent: percent,\n\t                timestamp: timestamp,\n\t                start: timestamp + (anim.del || 0),\n\t                status: 0,\n\t                initstatus: status || 0,\n\t                stop: false,\n\t                ms: ms,\n\t                easing: easyeasy,\n\t                from: from,\n\t                diff: diff,\n\t                to: to,\n\t                el: element,\n\t                callback: params.callback,\n\t                prev: prev,\n\t                next: next,\n\t                repeat: times || anim.times,\n\t                origin: element.attr(),\n\t                totalOrigin: totalOrigin\n\t            };\n\t            animationElements.push(e);\n\t            if (status && !isInAnim && !isInAnimSet) {\n\t                e.stop = true;\n\t                e.start = new Date - ms * status;\n\t                if (animationElements.length == 1) {\n\t                    return animation();\n\t                }\n\t            }\n\t            if (isInAnimSet) {\n\t                e.start = new Date - e.ms * status;\n\t            }\n\t            animationElements.length == 1 && requestAnimFrame(animation);\n\t        } else {\n\t            isInAnim.initstatus = status;\n\t            isInAnim.start = new Date - isInAnim.ms * status;\n\t        }\n\t        eve(\"raphael.anim.start.\" + element.id, element, anim);\n\t    }\n\t    /*\\\n\t     * Raphael.animation\n\t     [ method ]\n\t     **\n\t     * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods.\n\t     * See also @Animation.delay and @Animation.repeat methods.\n\t     **\n\t     > Parameters\n\t     **\n\t     - params (object) final attributes for the element, see also @Element.attr\n\t     - ms (number) number of milliseconds for animation to run\n\t     - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#160;XX,&#160;XX,&#160;XX)`\n\t     - callback (function) #optional callback function. Will be called at the end of animation.\n\t     **\n\t     = (object) @Animation\n\t    \\*/\n\t    R.animation = function (params, ms, easing, callback) {\n\t        if (params instanceof Animation) {\n\t            return params;\n\t        }\n\t        if (R.is(easing, \"function\") || !easing) {\n\t            callback = callback || easing || null;\n\t            easing = null;\n\t        }\n\t        params = Object(params);\n\t        ms = +ms || 0;\n\t        var p = {},\n\t            json,\n\t            attr;\n\t        for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + \"%\" != attr) {\n\t            json = true;\n\t            p[attr] = params[attr];\n\t        }\n\t        if (!json) {\n\t            // if percent-like syntax is used and end-of-all animation callback used\n\t            if(callback){\n\t                // find the last one\n\t                var lastKey = 0;\n\t                for(var i in params){\n\t                    var percent = toInt(i);\n\t                    if(params[has](i) && percent > lastKey){\n\t                        lastKey = percent;\n\t                    }\n\t                }\n\t                lastKey += '%';\n\t                // if already defined callback in the last keyframe, skip\n\t                !params[lastKey].callback && (params[lastKey].callback = callback);\n\t            }\n\t          return new Animation(params, ms);\n\t        } else {\n\t            easing && (p.easing = easing);\n\t            callback && (p.callback = callback);\n\t            return new Animation({100: p}, ms);\n\t        }\n\t    };\n\t    /*\\\n\t     * Element.animate\n\t     [ method ]\n\t     **\n\t     * Creates and starts animation for given element.\n\t     **\n\t     > Parameters\n\t     **\n\t     - params (object) final attributes for the element, see also @Element.attr\n\t     - ms (number) number of milliseconds for animation to run\n\t     - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#160;XX,&#160;XX,&#160;XX)`\n\t     - callback (function) #optional callback function. Will be called at the end of animation.\n\t     * or\n\t     - animation (object) animation object, see @Raphael.animation\n\t     **\n\t     = (object) original element\n\t    \\*/\n\t    elproto.animate = function (params, ms, easing, callback) {\n\t        var element = this;\n\t        if (element.removed) {\n\t            callback && callback.call(element);\n\t            return element;\n\t        }\n\t        var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback);\n\t        runAnimation(anim, element, anim.percents[0], null, element.attr());\n\t        return element;\n\t    };\n\t    /*\\\n\t     * Element.setTime\n\t     [ method ]\n\t     **\n\t     * Sets the status of animation of the element in milliseconds. Similar to @Element.status method.\n\t     **\n\t     > Parameters\n\t     **\n\t     - anim (object) animation object\n\t     - value (number) number of milliseconds from the beginning of the animation\n\t     **\n\t     = (object) original element if `value` is specified\n\t     * Note, that during animation following events are triggered:\n\t     *\n\t     * On each animation frame event `anim.frame.<id>`, on start `anim.start.<id>` and on end `anim.finish.<id>`.\n\t    \\*/\n\t    elproto.setTime = function (anim, value) {\n\t        if (anim && value != null) {\n\t            this.status(anim, mmin(value, anim.ms) / anim.ms);\n\t        }\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.status\n\t     [ method ]\n\t     **\n\t     * Gets or sets the status of animation of the element.\n\t     **\n\t     > Parameters\n\t     **\n\t     - anim (object) #optional animation object\n\t     - value (number) #optional 0 – 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position.\n\t     **\n\t     = (number) status\n\t     * or\n\t     = (array) status if `anim` is not specified. Array of objects in format:\n\t     o {\n\t     o     anim: (object) animation object\n\t     o     status: (number) status\n\t     o }\n\t     * or\n\t     = (object) original element if `value` is specified\n\t    \\*/\n\t    elproto.status = function (anim, value) {\n\t        var out = [],\n\t            i = 0,\n\t            len,\n\t            e;\n\t        if (value != null) {\n\t            runAnimation(anim, this, -1, mmin(value, 1));\n\t            return this;\n\t        } else {\n\t            len = animationElements.length;\n\t            for (; i < len; i++) {\n\t                e = animationElements[i];\n\t                if (e.el.id == this.id && (!anim || e.anim == anim)) {\n\t                    if (anim) {\n\t                        return e.status;\n\t                    }\n\t                    out.push({\n\t                        anim: e.anim,\n\t                        status: e.status\n\t                    });\n\t                }\n\t            }\n\t            if (anim) {\n\t                return 0;\n\t            }\n\t            return out;\n\t        }\n\t    };\n\t    /*\\\n\t     * Element.pause\n\t     [ method ]\n\t     **\n\t     * Stops animation of the element with ability to resume it later on.\n\t     **\n\t     > Parameters\n\t     **\n\t     - anim (object) #optional animation object\n\t     **\n\t     = (object) original element\n\t    \\*/\n\t    elproto.pause = function (anim) {\n\t        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\n\t            if (eve(\"raphael.anim.pause.\" + this.id, this, animationElements[i].anim) !== false) {\n\t                animationElements[i].paused = true;\n\t            }\n\t        }\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.resume\n\t     [ method ]\n\t     **\n\t     * Resumes animation if it was paused with @Element.pause method.\n\t     **\n\t     > Parameters\n\t     **\n\t     - anim (object) #optional animation object\n\t     **\n\t     = (object) original element\n\t    \\*/\n\t    elproto.resume = function (anim) {\n\t        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\n\t            var e = animationElements[i];\n\t            if (eve(\"raphael.anim.resume.\" + this.id, this, e.anim) !== false) {\n\t                delete e.paused;\n\t                this.status(e.anim, e.status);\n\t            }\n\t        }\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.stop\n\t     [ method ]\n\t     **\n\t     * Stops animation of the element.\n\t     **\n\t     > Parameters\n\t     **\n\t     - anim (object) #optional animation object\n\t     **\n\t     = (object) original element\n\t    \\*/\n\t    elproto.stop = function (anim) {\n\t        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\n\t            if (eve(\"raphael.anim.stop.\" + this.id, this, animationElements[i].anim) !== false) {\n\t                animationElements.splice(i--, 1);\n\t            }\n\t        }\n\t        return this;\n\t    };\n\t    function stopAnimation(paper) {\n\t        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.paper == paper) {\n\t            animationElements.splice(i--, 1);\n\t        }\n\t    }\n\t    eve.on(\"raphael.remove\", stopAnimation);\n\t    eve.on(\"raphael.clear\", stopAnimation);\n\t    elproto.toString = function () {\n\t        return \"Rapha\\xebl\\u2019s object\";\n\t    };\n\n\t    // Set\n\t    var Set = function (items) {\n\t        this.items = [];\n\t        this.length = 0;\n\t        this.type = \"set\";\n\t        if (items) {\n\t            for (var i = 0, ii = items.length; i < ii; i++) {\n\t                if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) {\n\t                    this[this.items.length] = this.items[this.items.length] = items[i];\n\t                    this.length++;\n\t                }\n\t            }\n\t        }\n\t    },\n\t    setproto = Set.prototype;\n\t    /*\\\n\t     * Set.push\n\t     [ method ]\n\t     **\n\t     * Adds each argument to the current set.\n\t     = (object) original element\n\t    \\*/\n\t    setproto.push = function () {\n\t        var item,\n\t            len;\n\t        for (var i = 0, ii = arguments.length; i < ii; i++) {\n\t            item = arguments[i];\n\t            if (item && (item.constructor == elproto.constructor || item.constructor == Set)) {\n\t                len = this.items.length;\n\t                this[len] = this.items[len] = item;\n\t                this.length++;\n\t            }\n\t        }\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Set.pop\n\t     [ method ]\n\t     **\n\t     * Removes last element and returns it.\n\t     = (object) element\n\t    \\*/\n\t    setproto.pop = function () {\n\t        this.length && delete this[this.length--];\n\t        return this.items.pop();\n\t    };\n\t    /*\\\n\t     * Set.forEach\n\t     [ method ]\n\t     **\n\t     * Executes given function for each element in the set.\n\t     *\n\t     * If function returns `false` it will stop loop running.\n\t     **\n\t     > Parameters\n\t     **\n\t     - callback (function) function to run\n\t     - thisArg (object) context object for the callback\n\t     = (object) Set object\n\t    \\*/\n\t    setproto.forEach = function (callback, thisArg) {\n\t        for (var i = 0, ii = this.items.length; i < ii; i++) {\n\t            if (callback.call(thisArg, this.items[i], i) === false) {\n\t                return this;\n\t            }\n\t        }\n\t        return this;\n\t    };\n\t    for (var method in elproto) if (elproto[has](method)) {\n\t        setproto[method] = (function (methodname) {\n\t            return function () {\n\t                var arg = arguments;\n\t                return this.forEach(function (el) {\n\t                    el[methodname][apply](el, arg);\n\t                });\n\t            };\n\t        })(method);\n\t    }\n\t    setproto.attr = function (name, value) {\n\t        if (name && R.is(name, array) && R.is(name[0], \"object\")) {\n\t            for (var j = 0, jj = name.length; j < jj; j++) {\n\t                this.items[j].attr(name[j]);\n\t            }\n\t        } else {\n\t            for (var i = 0, ii = this.items.length; i < ii; i++) {\n\t                this.items[i].attr(name, value);\n\t            }\n\t        }\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Set.clear\n\t     [ method ]\n\t     **\n\t     * Removes all elements from the set\n\t    \\*/\n\t    setproto.clear = function () {\n\t        while (this.length) {\n\t            this.pop();\n\t        }\n\t    };\n\t    /*\\\n\t     * Set.splice\n\t     [ method ]\n\t     **\n\t     * Removes given element from the set\n\t     **\n\t     > Parameters\n\t     **\n\t     - index (number) position of the deletion\n\t     - count (number) number of element to remove\n\t     - insertion… (object) #optional elements to insert\n\t     = (object) set elements that were deleted\n\t    \\*/\n\t    setproto.splice = function (index, count, insertion) {\n\t        index = index < 0 ? mmax(this.length + index, 0) : index;\n\t        count = mmax(0, mmin(this.length - index, count));\n\t        var tail = [],\n\t            todel = [],\n\t            args = [],\n\t            i;\n\t        for (i = 2; i < arguments.length; i++) {\n\t            args.push(arguments[i]);\n\t        }\n\t        for (i = 0; i < count; i++) {\n\t            todel.push(this[index + i]);\n\t        }\n\t        for (; i < this.length - index; i++) {\n\t            tail.push(this[index + i]);\n\t        }\n\t        var arglen = args.length;\n\t        for (i = 0; i < arglen + tail.length; i++) {\n\t            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n\t        }\n\t        i = this.items.length = this.length -= count - arglen;\n\t        while (this[i]) {\n\t            delete this[i++];\n\t        }\n\t        return new Set(todel);\n\t    };\n\t    /*\\\n\t     * Set.exclude\n\t     [ method ]\n\t     **\n\t     * Removes given element from the set\n\t     **\n\t     > Parameters\n\t     **\n\t     - element (object) element to remove\n\t     = (boolean) `true` if object was found & removed from the set\n\t    \\*/\n\t    setproto.exclude = function (el) {\n\t        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n\t            this.splice(i, 1);\n\t            return true;\n\t        }\n\t    };\n\t    setproto.animate = function (params, ms, easing, callback) {\n\t        (R.is(easing, \"function\") || !easing) && (callback = easing || null);\n\t        var len = this.items.length,\n\t            i = len,\n\t            item,\n\t            set = this,\n\t            collector;\n\t        if (!len) {\n\t            return this;\n\t        }\n\t        callback && (collector = function () {\n\t            !--len && callback.call(set);\n\t        });\n\t        easing = R.is(easing, string) ? easing : collector;\n\t        var anim = R.animation(params, ms, easing, collector);\n\t        item = this.items[--i].animate(anim);\n\t        while (i--) {\n\t            this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim);\n\t            (this.items[i] && !this.items[i].removed) || len--;\n\t        }\n\t        return this;\n\t    };\n\t    setproto.insertAfter = function (el) {\n\t        var i = this.items.length;\n\t        while (i--) {\n\t            this.items[i].insertAfter(el);\n\t        }\n\t        return this;\n\t    };\n\t    setproto.getBBox = function () {\n\t        var x = [],\n\t            y = [],\n\t            x2 = [],\n\t            y2 = [];\n\t        for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n\t            var box = this.items[i].getBBox();\n\t            x.push(box.x);\n\t            y.push(box.y);\n\t            x2.push(box.x + box.width);\n\t            y2.push(box.y + box.height);\n\t        }\n\t        x = mmin[apply](0, x);\n\t        y = mmin[apply](0, y);\n\t        x2 = mmax[apply](0, x2);\n\t        y2 = mmax[apply](0, y2);\n\t        return {\n\t            x: x,\n\t            y: y,\n\t            x2: x2,\n\t            y2: y2,\n\t            width: x2 - x,\n\t            height: y2 - y\n\t        };\n\t    };\n\t    setproto.clone = function (s) {\n\t        s = this.paper.set();\n\t        for (var i = 0, ii = this.items.length; i < ii; i++) {\n\t            s.push(this.items[i].clone());\n\t        }\n\t        return s;\n\t    };\n\t    setproto.toString = function () {\n\t        return \"Rapha\\xebl\\u2018s set\";\n\t    };\n\n\t    setproto.glow = function(glowConfig) {\n\t        var ret = this.paper.set();\n\t        this.forEach(function(shape, index){\n\t            var g = shape.glow(glowConfig);\n\t            if(g != null){\n\t                g.forEach(function(shape2, index2){\n\t                    ret.push(shape2);\n\t                });\n\t            }\n\t        });\n\t        return ret;\n\t    };\n\n\n\t    /*\\\n\t     * Set.isPointInside\n\t     [ method ]\n\t     **\n\t     * Determine if given point is inside this set’s elements\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) x coordinate of the point\n\t     - y (number) y coordinate of the point\n\t     = (boolean) `true` if point is inside any of the set's elements\n\t     \\*/\n\t    setproto.isPointInside = function (x, y) {\n\t        var isPointInside = false;\n\t        this.forEach(function (el) {\n\t            if (el.isPointInside(x, y)) {\n\t                isPointInside = true;\n\t                return false; // stop loop\n\t            }\n\t        });\n\t        return isPointInside;\n\t    };\n\n\t    /*\\\n\t     * Raphael.registerFont\n\t     [ method ]\n\t     **\n\t     * Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file.\n\t     * Returns original parameter, so it could be used with chaining.\n\t     # <a href=\"http://wiki.github.com/sorccu/cufon/about\">More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file.</a>\n\t     **\n\t     > Parameters\n\t     **\n\t     - font (object) the font to register\n\t     = (object) the font you passed in\n\t     > Usage\n\t     | Cufon.registerFont(Raphael.registerFont({…}));\n\t    \\*/\n\t    R.registerFont = function (font) {\n\t        if (!font.face) {\n\t            return font;\n\t        }\n\t        this.fonts = this.fonts || {};\n\t        var fontcopy = {\n\t                w: font.w,\n\t                face: {},\n\t                glyphs: {}\n\t            },\n\t            family = font.face[\"font-family\"];\n\t        for (var prop in font.face) if (font.face[has](prop)) {\n\t            fontcopy.face[prop] = font.face[prop];\n\t        }\n\t        if (this.fonts[family]) {\n\t            this.fonts[family].push(fontcopy);\n\t        } else {\n\t            this.fonts[family] = [fontcopy];\n\t        }\n\t        if (!font.svg) {\n\t            fontcopy.face[\"units-per-em\"] = toInt(font.face[\"units-per-em\"], 10);\n\t            for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) {\n\t                var path = font.glyphs[glyph];\n\t                fontcopy.glyphs[glyph] = {\n\t                    w: path.w,\n\t                    k: {},\n\t                    d: path.d && \"M\" + path.d.replace(/[mlcxtrv]/g, function (command) {\n\t                            return {l: \"L\", c: \"C\", x: \"z\", t: \"m\", r: \"l\", v: \"c\"}[command] || \"M\";\n\t                        }) + \"z\"\n\t                };\n\t                if (path.k) {\n\t                    for (var k in path.k) if (path[has](k)) {\n\t                        fontcopy.glyphs[glyph].k[k] = path.k[k];\n\t                    }\n\t                }\n\t            }\n\t        }\n\t        return font;\n\t    };\n\t    /*\\\n\t     * Paper.getFont\n\t     [ method ]\n\t     **\n\t     * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”.\n\t     **\n\t     > Parameters\n\t     **\n\t     - family (string) font family name or any word from it\n\t     - weight (string) #optional font weight\n\t     - style (string) #optional font style\n\t     - stretch (string) #optional font stretch\n\t     = (object) the font object\n\t     > Usage\n\t     | paper.print(100, 100, \"Test string\", paper.getFont(\"Times\", 800), 30);\n\t    \\*/\n\t    paperproto.getFont = function (family, weight, style, stretch) {\n\t        stretch = stretch || \"normal\";\n\t        style = style || \"normal\";\n\t        weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400;\n\t        if (!R.fonts) {\n\t            return;\n\t        }\n\t        var font = R.fonts[family];\n\t        if (!font) {\n\t            var name = new RegExp(\"(^|\\\\s)\" + family.replace(/[^\\w\\d\\s+!~.:_-]/g, E) + \"(\\\\s|$)\", \"i\");\n\t            for (var fontName in R.fonts) if (R.fonts[has](fontName)) {\n\t                if (name.test(fontName)) {\n\t                    font = R.fonts[fontName];\n\t                    break;\n\t                }\n\t            }\n\t        }\n\t        var thefont;\n\t        if (font) {\n\t            for (var i = 0, ii = font.length; i < ii; i++) {\n\t                thefont = font[i];\n\t                if (thefont.face[\"font-weight\"] == weight && (thefont.face[\"font-style\"] == style || !thefont.face[\"font-style\"]) && thefont.face[\"font-stretch\"] == stretch) {\n\t                    break;\n\t                }\n\t            }\n\t        }\n\t        return thefont;\n\t    };\n\t    /*\\\n\t     * Paper.print\n\t     [ method ]\n\t     **\n\t     * Creates path that represent given text written using given font at given position with given size.\n\t     * Result of the method is path element that contains whole text as a separate path.\n\t     **\n\t     > Parameters\n\t     **\n\t     - x (number) x position of the text\n\t     - y (number) y position of the text\n\t     - string (string) text to print\n\t     - font (object) font object, see @Paper.getFont\n\t     - size (number) #optional size of the font, default is `16`\n\t     - origin (string) #optional could be `\"baseline\"` or `\"middle\"`, default is `\"middle\"`\n\t     - letter_spacing (number) #optional number in range `-1..1`, default is `0`\n\t     - line_spacing (number) #optional number in range `1..3`, default is `1`\n\t     = (object) resulting path element, which consist of all letters\n\t     > Usage\n\t     | var txt = r.print(10, 50, \"print\", r.getFont(\"Museo\"), 30).attr({fill: \"#fff\"});\n\t    \\*/\n\t    paperproto.print = function (x, y, string, font, size, origin, letter_spacing, line_spacing) {\n\t        origin = origin || \"middle\"; // baseline|middle\n\t        letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1);\n\t        line_spacing = mmax(mmin(line_spacing || 1, 3), 1);\n\t        var letters = Str(string)[split](E),\n\t            shift = 0,\n\t            notfirst = 0,\n\t            path = E,\n\t            scale;\n\t        R.is(font, \"string\") && (font = this.getFont(font));\n\t        if (font) {\n\t            scale = (size || 16) / font.face[\"units-per-em\"];\n\t            var bb = font.face.bbox[split](separator),\n\t                top = +bb[0],\n\t                lineHeight = bb[3] - bb[1],\n\t                shifty = 0,\n\t                height = +bb[1] + (origin == \"baseline\" ? lineHeight + (+font.face.descent) : lineHeight / 2);\n\t            for (var i = 0, ii = letters.length; i < ii; i++) {\n\t                if (letters[i] == \"\\n\") {\n\t                    shift = 0;\n\t                    curr = 0;\n\t                    notfirst = 0;\n\t                    shifty += lineHeight * line_spacing;\n\t                } else {\n\t                    var prev = notfirst && font.glyphs[letters[i - 1]] || {},\n\t                        curr = font.glyphs[letters[i]];\n\t                    shift += notfirst ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0;\n\t                    notfirst = 1;\n\t                }\n\t                if (curr && curr.d) {\n\t                    path += R.transformPath(curr.d, [\"t\", shift * scale, shifty * scale, \"s\", scale, scale, top, height, \"t\", (x - top) / scale, (y - height) / scale]);\n\t                }\n\t            }\n\t        }\n\t        return this.path(path).attr({\n\t            fill: \"#000\",\n\t            stroke: \"none\"\n\t        });\n\t    };\n\n\t    /*\\\n\t     * Paper.add\n\t     [ method ]\n\t     **\n\t     * Imports elements in JSON array in format `{type: type, <attributes>}`\n\t     **\n\t     > Parameters\n\t     **\n\t     - json (array)\n\t     = (object) resulting set of imported elements\n\t     > Usage\n\t     | paper.add([\n\t     |     {\n\t     |         type: \"circle\",\n\t     |         cx: 10,\n\t     |         cy: 10,\n\t     |         r: 5\n\t     |     },\n\t     |     {\n\t     |         type: \"rect\",\n\t     |         x: 10,\n\t     |         y: 10,\n\t     |         width: 10,\n\t     |         height: 10,\n\t     |         fill: \"#fc0\"\n\t     |     }\n\t     | ]);\n\t    \\*/\n\t    paperproto.add = function (json) {\n\t        if (R.is(json, \"array\")) {\n\t            var res = this.set(),\n\t                i = 0,\n\t                ii = json.length,\n\t                j;\n\t            for (; i < ii; i++) {\n\t                j = json[i] || {};\n\t                elements[has](j.type) && res.push(this[j.type]().attr(j));\n\t            }\n\t        }\n\t        return res;\n\t    };\n\n\t    /*\\\n\t     * Raphael.format\n\t     [ method ]\n\t     **\n\t     * Simple format function. Replaces construction of type “`{<number>}`” to the corresponding argument.\n\t     **\n\t     > Parameters\n\t     **\n\t     - token (string) string to format\n\t     - … (string) rest of arguments will be treated as parameters for replacement\n\t     = (string) formated string\n\t     > Usage\n\t     | var x = 10,\n\t     |     y = 20,\n\t     |     width = 40,\n\t     |     height = 50;\n\t     | // this will draw a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n\t     | paper.path(Raphael.format(\"M{0},{1}h{2}v{3}h{4}z\", x, y, width, height, -width));\n\t    \\*/\n\t    R.format = function (token, params) {\n\t        var args = R.is(params, array) ? [0][concat](params) : arguments;\n\t        token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) {\n\t            return args[++i] == null ? E : args[i];\n\t        }));\n\t        return token || E;\n\t    };\n\t    /*\\\n\t     * Raphael.fullfill\n\t     [ method ]\n\t     **\n\t     * A little bit more advanced format function than @Raphael.format. Replaces construction of type “`{<name>}`” to the corresponding argument.\n\t     **\n\t     > Parameters\n\t     **\n\t     - token (string) string to format\n\t     - json (object) object which properties will be used as a replacement\n\t     = (string) formated string\n\t     > Usage\n\t     | // this will draw a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n\t     | paper.path(Raphael.fullfill(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n\t     |     x: 10,\n\t     |     y: 20,\n\t     |     dim: {\n\t     |         width: 40,\n\t     |         height: 50,\n\t     |         \"negative width\": -40\n\t     |     }\n\t     | }));\n\t    \\*/\n\t    R.fullfill = (function () {\n\t        var tokenRegex = /\\{([^\\}]+)\\}/g,\n\t            objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n\t            replacer = function (all, key, obj) {\n\t                var res = obj;\n\t                key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n\t                    name = name || quotedName;\n\t                    if (res) {\n\t                        if (name in res) {\n\t                            res = res[name];\n\t                        }\n\t                        typeof res == \"function\" && isFunc && (res = res());\n\t                    }\n\t                });\n\t                res = (res == null || res == obj ? all : res) + \"\";\n\t                return res;\n\t            };\n\t        return function (str, obj) {\n\t            return String(str).replace(tokenRegex, function (all, key) {\n\t                return replacer(all, key, obj);\n\t            });\n\t        };\n\t    })();\n\t    /*\\\n\t     * Raphael.ninja\n\t     [ method ]\n\t     **\n\t     * If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable `Raphael`, but anyway.) You can use `ninja` method.\n\t     * Beware, that in this case plugins could stop working, because they are depending on global variable existence.\n\t     **\n\t     = (object) Raphael object\n\t     > Usage\n\t     | (function (local_raphael) {\n\t     |     var paper = local_raphael(10, 10, 320, 200);\n\t     |     …\n\t     | })(Raphael.ninja());\n\t    \\*/\n\t    R.ninja = function () {\n\t        if (oldRaphael.was) {\n\t            g.win.Raphael = oldRaphael.is;\n\t        } else {\n\t            // IE8 raises an error when deleting window property\n\t            window.Raphael = undefined;\n\t            try {\n\t                delete window.Raphael;\n\t            } catch(e) {}\n\t        }\n\t        return R;\n\t    };\n\t    /*\\\n\t     * Raphael.st\n\t     [ property (object) ]\n\t     **\n\t     * You can add your own method to elements and sets. It is wise to add a set method for each element method\n\t     * you added, so you will be able to call the same method on sets too.\n\t     **\n\t     * See also @Raphael.el.\n\t     > Usage\n\t     | Raphael.el.red = function () {\n\t     |     this.attr({fill: \"#f00\"});\n\t     | };\n\t     | Raphael.st.red = function () {\n\t     |     this.forEach(function (el) {\n\t     |         el.red();\n\t     |     });\n\t     | };\n\t     | // then use it\n\t     | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red();\n\t    \\*/\n\t    R.st = setproto;\n\n\t    eve.on(\"raphael.DOMload\", function () {\n\t        loaded = true;\n\t    });\n\n\t    // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html\n\t    (function (doc, loaded, f) {\n\t        if (doc.readyState == null && doc.addEventListener){\n\t            doc.addEventListener(loaded, f = function () {\n\t                doc.removeEventListener(loaded, f, false);\n\t                doc.readyState = \"complete\";\n\t            }, false);\n\t            doc.readyState = \"loading\";\n\t        }\n\t        function isLoaded() {\n\t            (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve(\"raphael.DOMload\");\n\t        }\n\t        isLoaded();\n\t    })(document, \"DOMContentLoaded\");\n\n\t    return R;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n\t// \n\t// Licensed under the Apache License, Version 2.0 (the \"License\");\n\t// you may not use this file except in compliance with the License.\n\t// You may obtain a copy of the License at\n\t// \n\t// http://www.apache.org/licenses/LICENSE-2.0\n\t// \n\t// Unless required by applicable law or agreed to in writing, software\n\t// distributed under the License is distributed on an \"AS IS\" BASIS,\n\t// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t// See the License for the specific language governing permissions and\n\t// limitations under the License.\n\t// ┌────────────────────────────────────────────────────────────┐ \\\\\n\t// │ Eve 0.5.0 - JavaScript Events Library                      │ \\\\\n\t// ├────────────────────────────────────────────────────────────┤ \\\\\n\t// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n\t// └────────────────────────────────────────────────────────────┘ \\\\\n\n\t(function (glob) {\n\t    var version = \"0.5.0\",\n\t        has = \"hasOwnProperty\",\n\t        separator = /[\\.\\/]/,\n\t        comaseparator = /\\s*,\\s*/,\n\t        wildcard = \"*\",\n\t        fun = function () {},\n\t        numsort = function (a, b) {\n\t            return a - b;\n\t        },\n\t        current_event,\n\t        stop,\n\t        events = {n: {}},\n\t        firstDefined = function () {\n\t            for (var i = 0, ii = this.length; i < ii; i++) {\n\t                if (typeof this[i] != \"undefined\") {\n\t                    return this[i];\n\t                }\n\t            }\n\t        },\n\t        lastDefined = function () {\n\t            var i = this.length;\n\t            while (--i) {\n\t                if (typeof this[i] != \"undefined\") {\n\t                    return this[i];\n\t                }\n\t            }\n\t        },\n\t        objtos = Object.prototype.toString,\n\t        Str = String,\n\t        isArray = Array.isArray || function (ar) {\n\t            return ar instanceof Array || objtos.call(ar) == \"[object Array]\";\n\t        };\n\t    /*\\\n\t     * eve\n\t     [ method ]\n\n\t     * Fires event with given `name`, given scope and other parameters.\n\n\t     > Arguments\n\n\t     - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n\t     - scope (object) context for the event handlers\n\t     - varargs (...) the rest of arguments will be sent to event handlers\n\n\t     = (object) array of returned values from the listeners. Array has two methods `.firstDefined()` and `.lastDefined()` to get first or last not `undefined` value.\n\t    \\*/\n\t        eve = function (name, scope) {\n\t            var e = events,\n\t                oldstop = stop,\n\t                args = Array.prototype.slice.call(arguments, 2),\n\t                listeners = eve.listeners(name),\n\t                z = 0,\n\t                f = false,\n\t                l,\n\t                indexed = [],\n\t                queue = {},\n\t                out = [],\n\t                ce = current_event,\n\t                errors = [];\n\t            out.firstDefined = firstDefined;\n\t            out.lastDefined = lastDefined;\n\t            current_event = name;\n\t            stop = 0;\n\t            for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n\t                indexed.push(listeners[i].zIndex);\n\t                if (listeners[i].zIndex < 0) {\n\t                    queue[listeners[i].zIndex] = listeners[i];\n\t                }\n\t            }\n\t            indexed.sort(numsort);\n\t            while (indexed[z] < 0) {\n\t                l = queue[indexed[z++]];\n\t                out.push(l.apply(scope, args));\n\t                if (stop) {\n\t                    stop = oldstop;\n\t                    return out;\n\t                }\n\t            }\n\t            for (i = 0; i < ii; i++) {\n\t                l = listeners[i];\n\t                if (\"zIndex\" in l) {\n\t                    if (l.zIndex == indexed[z]) {\n\t                        out.push(l.apply(scope, args));\n\t                        if (stop) {\n\t                            break;\n\t                        }\n\t                        do {\n\t                            z++;\n\t                            l = queue[indexed[z]];\n\t                            l && out.push(l.apply(scope, args));\n\t                            if (stop) {\n\t                                break;\n\t                            }\n\t                        } while (l)\n\t                    } else {\n\t                        queue[l.zIndex] = l;\n\t                    }\n\t                } else {\n\t                    out.push(l.apply(scope, args));\n\t                    if (stop) {\n\t                        break;\n\t                    }\n\t                }\n\t            }\n\t            stop = oldstop;\n\t            current_event = ce;\n\t            return out;\n\t        };\n\t        // Undocumented. Debug only.\n\t        eve._events = events;\n\t    /*\\\n\t     * eve.listeners\n\t     [ method ]\n\n\t     * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n\t     > Arguments\n\n\t     - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n\t     = (array) array of event handlers\n\t    \\*/\n\t    eve.listeners = function (name) {\n\t        var names = isArray(name) ? name : name.split(separator),\n\t            e = events,\n\t            item,\n\t            items,\n\t            k,\n\t            i,\n\t            ii,\n\t            j,\n\t            jj,\n\t            nes,\n\t            es = [e],\n\t            out = [];\n\t        for (i = 0, ii = names.length; i < ii; i++) {\n\t            nes = [];\n\t            for (j = 0, jj = es.length; j < jj; j++) {\n\t                e = es[j].n;\n\t                items = [e[names[i]], e[wildcard]];\n\t                k = 2;\n\t                while (k--) {\n\t                    item = items[k];\n\t                    if (item) {\n\t                        nes.push(item);\n\t                        out = out.concat(item.f || []);\n\t                    }\n\t                }\n\t            }\n\t            es = nes;\n\t        }\n\t        return out;\n\t    };\n\t    /*\\\n\t     * eve.separator\n\t     [ method ]\n\n\t     * If for some reasons you don’t like default separators (`.` or `/`) you can specify yours\n\t     * here. Be aware that if you pass a string longer than one character it will be treated as\n\t     * a list of characters.\n\n\t     - separator (string) new separator. Empty string resets to default: `.` or `/`.\n\t    \\*/\n\t    eve.separator = function (sep) {\n\t        if (sep) {\n\t            sep = Str(sep).replace(/(?=[\\.\\^\\]\\[\\-])/g, \"\\\\\");\n\t            sep = \"[\" + sep + \"]\";\n\t            separator = new RegExp(sep);\n\t        } else {\n\t            separator = /[\\.\\/]/;\n\t        }\n\t    };\n\t    /*\\\n\t     * eve.on\n\t     [ method ]\n\t     **\n\t     * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n\t     | eve.on(\"*.under.*\", f);\n\t     | eve(\"mouse.under.floor\"); // triggers f\n\t     * Use @eve to trigger the listener.\n\t     **\n\t     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n\t     - f (function) event handler function\n\t     **\n\t     - name (array) if you don’t want to use separators, you can use array of strings\n\t     - f (function) event handler function\n\t     **\n\t     = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \n\t     > Example:\n\t     | eve.on(\"mouse\", eatIt)(2);\n\t     | eve.on(\"mouse\", scream);\n\t     | eve.on(\"mouse\", catchIt)(1);\n\t     * This will ensure that `catchIt` function will be called before `eatIt`.\n\t     *\n\t     * If you want to put your handler before non-indexed handlers, specify a negative value.\n\t     * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n\t    \\*/\n\t    eve.on = function (name, f) {\n\t        if (typeof f != \"function\") {\n\t            return function () {};\n\t        }\n\t        var names = isArray(name) ? (isArray(name[0]) ? name : [name]) : Str(name).split(comaseparator);\n\t        for (var i = 0, ii = names.length; i < ii; i++) {\n\t            (function (name) {\n\t                var names = isArray(name) ? name : Str(name).split(separator),\n\t                    e = events,\n\t                    exist;\n\t                for (var i = 0, ii = names.length; i < ii; i++) {\n\t                    e = e.n;\n\t                    e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n\t                }\n\t                e.f = e.f || [];\n\t                for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n\t                    exist = true;\n\t                    break;\n\t                }\n\t                !exist && e.f.push(f);\n\t            }(names[i]));\n\t        }\n\t        return function (zIndex) {\n\t            if (+zIndex == +zIndex) {\n\t                f.zIndex = +zIndex;\n\t            }\n\t        };\n\t    };\n\t    /*\\\n\t     * eve.f\n\t     [ method ]\n\t     **\n\t     * Returns function that will fire given event with optional arguments.\n\t     * Arguments that will be passed to the result function will be also\n\t     * concated to the list of final arguments.\n\t     | el.onclick = eve.f(\"click\", 1, 2);\n\t     | eve.on(\"click\", function (a, b, c) {\n\t     |     console.log(a, b, c); // 1, 2, [event object]\n\t     | });\n\t     > Arguments\n\t     - event (string) event name\n\t     - varargs (…) and any other arguments\n\t     = (function) possible event handler function\n\t    \\*/\n\t    eve.f = function (event) {\n\t        var attrs = [].slice.call(arguments, 1);\n\t        return function () {\n\t            eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n\t        };\n\t    };\n\t    /*\\\n\t     * eve.stop\n\t     [ method ]\n\t     **\n\t     * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n\t    \\*/\n\t    eve.stop = function () {\n\t        stop = 1;\n\t    };\n\t    /*\\\n\t     * eve.nt\n\t     [ method ]\n\t     **\n\t     * Could be used inside event handler to figure out actual name of the event.\n\t     **\n\t     > Arguments\n\t     **\n\t     - subname (string) #optional subname of the event\n\t     **\n\t     = (string) name of the event, if `subname` is not specified\n\t     * or\n\t     = (boolean) `true`, if current event’s name contains `subname`\n\t    \\*/\n\t    eve.nt = function (subname) {\n\t        var cur = isArray(current_event) ? current_event.join(\".\") : current_event;\n\t        if (subname) {\n\t            return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(cur);\n\t        }\n\t        return cur;\n\t    };\n\t    /*\\\n\t     * eve.nts\n\t     [ method ]\n\t     **\n\t     * Could be used inside event handler to figure out actual name of the event.\n\t     **\n\t     **\n\t     = (array) names of the event\n\t    \\*/\n\t    eve.nts = function () {\n\t        return isArray(current_event) ? current_event : current_event.split(separator);\n\t    };\n\t    /*\\\n\t     * eve.off\n\t     [ method ]\n\t     **\n\t     * Removes given function from the list of event listeners assigned to given name.\n\t     * If no arguments specified all the events will be cleared.\n\t     **\n\t     > Arguments\n\t     **\n\t     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n\t     - f (function) event handler function\n\t    \\*/\n\t    /*\\\n\t     * eve.unbind\n\t     [ method ]\n\t     **\n\t     * See @eve.off\n\t    \\*/\n\t    eve.off = eve.unbind = function (name, f) {\n\t        if (!name) {\n\t            eve._events = events = {n: {}};\n\t            return;\n\t        }\n\t        var names = isArray(name) ? (isArray(name[0]) ? name : [name]) : Str(name).split(comaseparator);\n\t        if (names.length > 1) {\n\t            for (var i = 0, ii = names.length; i < ii; i++) {\n\t                eve.off(names[i], f);\n\t            }\n\t            return;\n\t        }\n\t        names = isArray(name) ? name : Str(name).split(separator);\n\t        var e,\n\t            key,\n\t            splice,\n\t            i, ii, j, jj,\n\t            cur = [events];\n\t        for (i = 0, ii = names.length; i < ii; i++) {\n\t            for (j = 0; j < cur.length; j += splice.length - 2) {\n\t                splice = [j, 1];\n\t                e = cur[j].n;\n\t                if (names[i] != wildcard) {\n\t                    if (e[names[i]]) {\n\t                        splice.push(e[names[i]]);\n\t                    }\n\t                } else {\n\t                    for (key in e) if (e[has](key)) {\n\t                        splice.push(e[key]);\n\t                    }\n\t                }\n\t                cur.splice.apply(cur, splice);\n\t            }\n\t        }\n\t        for (i = 0, ii = cur.length; i < ii; i++) {\n\t            e = cur[i];\n\t            while (e.n) {\n\t                if (f) {\n\t                    if (e.f) {\n\t                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n\t                            e.f.splice(j, 1);\n\t                            break;\n\t                        }\n\t                        !e.f.length && delete e.f;\n\t                    }\n\t                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n\t                        var funcs = e.n[key].f;\n\t                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n\t                            funcs.splice(j, 1);\n\t                            break;\n\t                        }\n\t                        !funcs.length && delete e.n[key].f;\n\t                    }\n\t                } else {\n\t                    delete e.f;\n\t                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n\t                        delete e.n[key].f;\n\t                    }\n\t                }\n\t                e = e.n;\n\t            }\n\t        }\n\t    };\n\t    /*\\\n\t     * eve.once\n\t     [ method ]\n\t     **\n\t     * Binds given event handler with a given name to only run once then unbind itself.\n\t     | eve.once(\"login\", f);\n\t     | eve(\"login\"); // triggers f\n\t     | eve(\"login\"); // no listeners\n\t     * Use @eve to trigger the listener.\n\t     **\n\t     > Arguments\n\t     **\n\t     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n\t     - f (function) event handler function\n\t     **\n\t     = (function) same return function as @eve.on\n\t    \\*/\n\t    eve.once = function (name, f) {\n\t        var f2 = function () {\n\t            eve.off(name, f2);\n\t            return f.apply(this, arguments);\n\t        };\n\t        return eve.on(name, f2);\n\t    };\n\t    /*\\\n\t     * eve.version\n\t     [ property (string) ]\n\t     **\n\t     * Current version of the library.\n\t    \\*/\n\t    eve.version = version;\n\t    eve.toString = function () {\n\t        return \"You are running Eve \" + version;\n\t    };\n\t    (typeof module != \"undefined\" && module.exports) ? (module.exports = eve) : ( true ? (!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { return eve; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))) : (glob.eve = eve));\n\t})(this);\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\n\t    if (R && !R.svg) {\n\t        return;\n\t    }\n\n\t    var has = \"hasOwnProperty\",\n\t        Str = String,\n\t        toFloat = parseFloat,\n\t        toInt = parseInt,\n\t        math = Math,\n\t        mmax = math.max,\n\t        abs = math.abs,\n\t        pow = math.pow,\n\t        separator = /[, ]+/,\n\t        eve = R.eve,\n\t        E = \"\",\n\t        S = \" \";\n\t    var xlink = \"http://www.w3.org/1999/xlink\",\n\t        markers = {\n\t            block: \"M5,0 0,2.5 5,5z\",\n\t            classic: \"M5,0 0,2.5 5,5 3.5,3 3.5,2z\",\n\t            diamond: \"M2.5,0 5,2.5 2.5,5 0,2.5z\",\n\t            open: \"M6,1 1,3.5 6,6\",\n\t            oval: \"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z\"\n\t        },\n\t        markerCounter = {};\n\t    R.toString = function () {\n\t        return  \"Your browser supports SVG.\\nYou are running Rapha\\xebl \" + this.version;\n\t    };\n\t    var $ = function (el, attr) {\n\t        if (attr) {\n\t            if (typeof el == \"string\") {\n\t                el = $(el);\n\t            }\n\t            for (var key in attr) if (attr[has](key)) {\n\t                if (key.substring(0, 6) == \"xlink:\") {\n\t                    el.setAttributeNS(xlink, key.substring(6), Str(attr[key]));\n\t                } else {\n\t                    el.setAttribute(key, Str(attr[key]));\n\t                }\n\t            }\n\t        } else {\n\t            el = R._g.doc.createElementNS(\"http://www.w3.org/2000/svg\", el);\n\t            el.style && (el.style.webkitTapHighlightColor = \"rgba(0,0,0,0)\");\n\t        }\n\t        return el;\n\t    },\n\t    addGradientFill = function (element, gradient) {\n\t        var type = \"linear\",\n\t            id = element.id + gradient,\n\t            fx = .5, fy = .5,\n\t            o = element.node,\n\t            SVG = element.paper,\n\t            s = o.style,\n\t            el = R._g.doc.getElementById(id);\n\t        if (!el) {\n\t            gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) {\n\t                type = \"radial\";\n\t                if (_fx && _fy) {\n\t                    fx = toFloat(_fx);\n\t                    fy = toFloat(_fy);\n\t                    var dir = ((fy > .5) * 2 - 1);\n\t                    pow(fx - .5, 2) + pow(fy - .5, 2) > .25 &&\n\t                        (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) &&\n\t                        fy != .5 &&\n\t                        (fy = fy.toFixed(5) - 1e-5 * dir);\n\t                }\n\t                return E;\n\t            });\n\t            gradient = gradient.split(/\\s*\\-\\s*/);\n\t            if (type == \"linear\") {\n\t                var angle = gradient.shift();\n\t                angle = -toFloat(angle);\n\t                if (isNaN(angle)) {\n\t                    return null;\n\t                }\n\t                var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))],\n\t                    max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1);\n\t                vector[2] *= max;\n\t                vector[3] *= max;\n\t                if (vector[2] < 0) {\n\t                    vector[0] = -vector[2];\n\t                    vector[2] = 0;\n\t                }\n\t                if (vector[3] < 0) {\n\t                    vector[1] = -vector[3];\n\t                    vector[3] = 0;\n\t                }\n\t            }\n\t            var dots = R._parseDots(gradient);\n\t            if (!dots) {\n\t                return null;\n\t            }\n\t            id = id.replace(/[\\(\\)\\s,\\xb0#]/g, \"_\");\n\n\t            if (element.gradient && id != element.gradient.id) {\n\t                SVG.defs.removeChild(element.gradient);\n\t                delete element.gradient;\n\t            }\n\n\t            if (!element.gradient) {\n\t                el = $(type + \"Gradient\", {id: id});\n\t                element.gradient = el;\n\t                $(el, type == \"radial\" ? {\n\t                    fx: fx,\n\t                    fy: fy\n\t                } : {\n\t                    x1: vector[0],\n\t                    y1: vector[1],\n\t                    x2: vector[2],\n\t                    y2: vector[3],\n\t                    gradientTransform: element.matrix.invert()\n\t                });\n\t                SVG.defs.appendChild(el);\n\t                for (var i = 0, ii = dots.length; i < ii; i++) {\n\t                    el.appendChild($(\"stop\", {\n\t                        offset: dots[i].offset ? dots[i].offset : i ? \"100%\" : \"0%\",\n\t                        \"stop-color\": dots[i].color || \"#fff\",\n\t                        \"stop-opacity\": isFinite(dots[i].opacity) ? dots[i].opacity : 1\n\t                    }));\n\t                }\n\t            }\n\t        }\n\t        $(o, {\n\t            fill: fillurl(id),\n\t            opacity: 1,\n\t            \"fill-opacity\": 1\n\t        });\n\t        s.fill = E;\n\t        s.opacity = 1;\n\t        s.fillOpacity = 1;\n\t        return 1;\n\t    },\n\t    isIE9or10 = function () {\n\t      var mode = document.documentMode;\n\t      return mode && (mode === 9 || mode === 10);\n\t    },\n\t    fillurl = function (id) {\n\t      if (isIE9or10()) {\n\t          return \"url('#\" + id + \"')\";\n\t      }\n\t      var location = document.location;\n\t      var locationString = (\n\t          location.protocol + '//' +\n\t          location.host +\n\t          location.pathname +\n\t          location.search\n\t      );\n\t      return \"url('\" + locationString + \"#\" + id + \"')\";\n\t    },\n\t    updatePosition = function (o) {\n\t        var bbox = o.getBBox(1);\n\t        $(o.pattern, {patternTransform: o.matrix.invert() + \" translate(\" + bbox.x + \",\" + bbox.y + \")\"});\n\t    },\n\t    addArrow = function (o, value, isEnd) {\n\t        if (o.type == \"path\") {\n\t            var values = Str(value).toLowerCase().split(\"-\"),\n\t                p = o.paper,\n\t                se = isEnd ? \"end\" : \"start\",\n\t                node = o.node,\n\t                attrs = o.attrs,\n\t                stroke = attrs[\"stroke-width\"],\n\t                i = values.length,\n\t                type = \"classic\",\n\t                from,\n\t                to,\n\t                dx,\n\t                refX,\n\t                attr,\n\t                w = 3,\n\t                h = 3,\n\t                t = 5;\n\t            while (i--) {\n\t                switch (values[i]) {\n\t                    case \"block\":\n\t                    case \"classic\":\n\t                    case \"oval\":\n\t                    case \"diamond\":\n\t                    case \"open\":\n\t                    case \"none\":\n\t                        type = values[i];\n\t                        break;\n\t                    case \"wide\": h = 5; break;\n\t                    case \"narrow\": h = 2; break;\n\t                    case \"long\": w = 5; break;\n\t                    case \"short\": w = 2; break;\n\t                }\n\t            }\n\t            if (type == \"open\") {\n\t                w += 2;\n\t                h += 2;\n\t                t += 2;\n\t                dx = 1;\n\t                refX = isEnd ? 4 : 1;\n\t                attr = {\n\t                    fill: \"none\",\n\t                    stroke: attrs.stroke\n\t                };\n\t            } else {\n\t                refX = dx = w / 2;\n\t                attr = {\n\t                    fill: attrs.stroke,\n\t                    stroke: \"none\"\n\t                };\n\t            }\n\t            if (o._.arrows) {\n\t                if (isEnd) {\n\t                    o._.arrows.endPath && markerCounter[o._.arrows.endPath]--;\n\t                    o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--;\n\t                } else {\n\t                    o._.arrows.startPath && markerCounter[o._.arrows.startPath]--;\n\t                    o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--;\n\t                }\n\t            } else {\n\t                o._.arrows = {};\n\t            }\n\t            if (type != \"none\") {\n\t                var pathId = \"raphael-marker-\" + type,\n\t                    markerId = \"raphael-marker-\" + se + type + w + h + \"-obj\" + o.id;\n\t                if (!R._g.doc.getElementById(pathId)) {\n\t                    p.defs.appendChild($($(\"path\"), {\n\t                        \"stroke-linecap\": \"round\",\n\t                        d: markers[type],\n\t                        id: pathId\n\t                    }));\n\t                    markerCounter[pathId] = 1;\n\t                } else {\n\t                    markerCounter[pathId]++;\n\t                }\n\t                var marker = R._g.doc.getElementById(markerId),\n\t                    use;\n\t                if (!marker) {\n\t                    marker = $($(\"marker\"), {\n\t                        id: markerId,\n\t                        markerHeight: h,\n\t                        markerWidth: w,\n\t                        orient: \"auto\",\n\t                        refX: refX,\n\t                        refY: h / 2\n\t                    });\n\t                    use = $($(\"use\"), {\n\t                        \"xlink:href\": \"#\" + pathId,\n\t                        transform: (isEnd ? \"rotate(180 \" + w / 2 + \" \" + h / 2 + \") \" : E) + \"scale(\" + w / t + \",\" + h / t + \")\",\n\t                        \"stroke-width\": (1 / ((w / t + h / t) / 2)).toFixed(4)\n\t                    });\n\t                    marker.appendChild(use);\n\t                    p.defs.appendChild(marker);\n\t                    markerCounter[markerId] = 1;\n\t                } else {\n\t                    markerCounter[markerId]++;\n\t                    use = marker.getElementsByTagName(\"use\")[0];\n\t                }\n\t                $(use, attr);\n\t                var delta = dx * (type != \"diamond\" && type != \"oval\");\n\t                if (isEnd) {\n\t                    from = o._.arrows.startdx * stroke || 0;\n\t                    to = R.getTotalLength(attrs.path) - delta * stroke;\n\t                } else {\n\t                    from = delta * stroke;\n\t                    to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);\n\t                }\n\t                attr = {};\n\t                attr[\"marker-\" + se] = \"url(#\" + markerId + \")\";\n\t                if (to || from) {\n\t                    attr.d = R.getSubpath(attrs.path, from, to);\n\t                }\n\t                $(node, attr);\n\t                o._.arrows[se + \"Path\"] = pathId;\n\t                o._.arrows[se + \"Marker\"] = markerId;\n\t                o._.arrows[se + \"dx\"] = delta;\n\t                o._.arrows[se + \"Type\"] = type;\n\t                o._.arrows[se + \"String\"] = value;\n\t            } else {\n\t                if (isEnd) {\n\t                    from = o._.arrows.startdx * stroke || 0;\n\t                    to = R.getTotalLength(attrs.path) - from;\n\t                } else {\n\t                    from = 0;\n\t                    to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);\n\t                }\n\t                o._.arrows[se + \"Path\"] && $(node, {d: R.getSubpath(attrs.path, from, to)});\n\t                delete o._.arrows[se + \"Path\"];\n\t                delete o._.arrows[se + \"Marker\"];\n\t                delete o._.arrows[se + \"dx\"];\n\t                delete o._.arrows[se + \"Type\"];\n\t                delete o._.arrows[se + \"String\"];\n\t            }\n\t            for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) {\n\t                var item = R._g.doc.getElementById(attr);\n\t                item && item.parentNode.removeChild(item);\n\t            }\n\t        }\n\t    },\n\t    dasharray = {\n\t        \"-\": [3, 1],\n\t        \".\": [1, 1],\n\t        \"-.\": [3, 1, 1, 1],\n\t        \"-..\": [3, 1, 1, 1, 1, 1],\n\t        \". \": [1, 3],\n\t        \"- \": [4, 3],\n\t        \"--\": [8, 3],\n\t        \"- .\": [4, 3, 1, 3],\n\t        \"--.\": [8, 3, 1, 3],\n\t        \"--..\": [8, 3, 1, 3, 1, 3]\n\t    },\n\t    addDashes = function (o, value, params) {\n\t        value = dasharray[Str(value).toLowerCase()];\n\t        if (value) {\n\t            var width = o.attrs[\"stroke-width\"] || \"1\",\n\t                butt = {round: width, square: width, butt: 0}[o.attrs[\"stroke-linecap\"] || params[\"stroke-linecap\"]] || 0,\n\t                dashes = [],\n\t                i = value.length;\n\t            while (i--) {\n\t                dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;\n\t            }\n\t            $(o.node, {\"stroke-dasharray\": dashes.join(\",\")});\n\t        }\n\t        else {\n\t          $(o.node, {\"stroke-dasharray\": \"none\"});\n\t        }\n\t    },\n\t    setFillAndStroke = function (o, params) {\n\t        var node = o.node,\n\t            attrs = o.attrs,\n\t            vis = node.style.visibility;\n\t        node.style.visibility = \"hidden\";\n\t        for (var att in params) {\n\t            if (params[has](att)) {\n\t                if (!R._availableAttrs[has](att)) {\n\t                    continue;\n\t                }\n\t                var value = params[att];\n\t                attrs[att] = value;\n\t                switch (att) {\n\t                    case \"blur\":\n\t                        o.blur(value);\n\t                        break;\n\t                    case \"title\":\n\t                        var title = node.getElementsByTagName(\"title\");\n\n\t                        // Use the existing <title>.\n\t                        if (title.length && (title = title[0])) {\n\t                          title.firstChild.nodeValue = value;\n\t                        } else {\n\t                          title = $(\"title\");\n\t                          var val = R._g.doc.createTextNode(value);\n\t                          title.appendChild(val);\n\t                          node.appendChild(title);\n\t                        }\n\t                        break;\n\t                    case \"href\":\n\t                    case \"target\":\n\t                        var pn = node.parentNode;\n\t                        if (pn.tagName.toLowerCase() != \"a\") {\n\t                            var hl = $(\"a\");\n\t                            pn.insertBefore(hl, node);\n\t                            hl.appendChild(node);\n\t                            pn = hl;\n\t                        }\n\t                        if (att == \"target\") {\n\t                            pn.setAttributeNS(xlink, \"show\", value == \"blank\" ? \"new\" : value);\n\t                        } else {\n\t                            pn.setAttributeNS(xlink, att, value);\n\t                        }\n\t                        break;\n\t                    case \"cursor\":\n\t                        node.style.cursor = value;\n\t                        break;\n\t                    case \"transform\":\n\t                        o.transform(value);\n\t                        break;\n\t                    case \"arrow-start\":\n\t                        addArrow(o, value);\n\t                        break;\n\t                    case \"arrow-end\":\n\t                        addArrow(o, value, 1);\n\t                        break;\n\t                    case \"clip-rect\":\n\t                        var rect = Str(value).split(separator);\n\t                        if (rect.length == 4) {\n\t                            o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);\n\t                            var el = $(\"clipPath\"),\n\t                                rc = $(\"rect\");\n\t                            el.id = R.createUUID();\n\t                            $(rc, {\n\t                                x: rect[0],\n\t                                y: rect[1],\n\t                                width: rect[2],\n\t                                height: rect[3]\n\t                            });\n\t                            el.appendChild(rc);\n\t                            o.paper.defs.appendChild(el);\n\t                            $(node, {\"clip-path\": \"url(#\" + el.id + \")\"});\n\t                            o.clip = rc;\n\t                        }\n\t                        if (!value) {\n\t                            var path = node.getAttribute(\"clip-path\");\n\t                            if (path) {\n\t                                var clip = R._g.doc.getElementById(path.replace(/(^url\\(#|\\)$)/g, E));\n\t                                clip && clip.parentNode.removeChild(clip);\n\t                                $(node, {\"clip-path\": E});\n\t                                delete o.clip;\n\t                            }\n\t                        }\n\t                    break;\n\t                    case \"path\":\n\t                        if (o.type == \"path\") {\n\t                            $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : \"M0,0\"});\n\t                            o._.dirty = 1;\n\t                            if (o._.arrows) {\n\t                                \"startString\" in o._.arrows && addArrow(o, o._.arrows.startString);\n\t                                \"endString\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\n\t                            }\n\t                        }\n\t                        break;\n\t                    case \"width\":\n\t                        node.setAttribute(att, value);\n\t                        o._.dirty = 1;\n\t                        if (attrs.fx) {\n\t                            att = \"x\";\n\t                            value = attrs.x;\n\t                        } else {\n\t                            break;\n\t                        }\n\t                    case \"x\":\n\t                        if (attrs.fx) {\n\t                            value = -attrs.x - (attrs.width || 0);\n\t                        }\n\t                    case \"rx\":\n\t                        if (att == \"rx\" && o.type == \"rect\") {\n\t                            break;\n\t                        }\n\t                    case \"cx\":\n\t                        node.setAttribute(att, value);\n\t                        o.pattern && updatePosition(o);\n\t                        o._.dirty = 1;\n\t                        break;\n\t                    case \"height\":\n\t                        node.setAttribute(att, value);\n\t                        o._.dirty = 1;\n\t                        if (attrs.fy) {\n\t                            att = \"y\";\n\t                            value = attrs.y;\n\t                        } else {\n\t                            break;\n\t                        }\n\t                    case \"y\":\n\t                        if (attrs.fy) {\n\t                            value = -attrs.y - (attrs.height || 0);\n\t                        }\n\t                    case \"ry\":\n\t                        if (att == \"ry\" && o.type == \"rect\") {\n\t                            break;\n\t                        }\n\t                    case \"cy\":\n\t                        node.setAttribute(att, value);\n\t                        o.pattern && updatePosition(o);\n\t                        o._.dirty = 1;\n\t                        break;\n\t                    case \"r\":\n\t                        if (o.type == \"rect\") {\n\t                            $(node, {rx: value, ry: value});\n\t                        } else {\n\t                            node.setAttribute(att, value);\n\t                        }\n\t                        o._.dirty = 1;\n\t                        break;\n\t                    case \"src\":\n\t                        if (o.type == \"image\") {\n\t                            node.setAttributeNS(xlink, \"href\", value);\n\t                        }\n\t                        break;\n\t                    case \"stroke-width\":\n\t                        if (o._.sx != 1 || o._.sy != 1) {\n\t                            value /= mmax(abs(o._.sx), abs(o._.sy)) || 1;\n\t                        }\n\t                        node.setAttribute(att, value);\n\t                        if (attrs[\"stroke-dasharray\"]) {\n\t                            addDashes(o, attrs[\"stroke-dasharray\"], params);\n\t                        }\n\t                        if (o._.arrows) {\n\t                            \"startString\" in o._.arrows && addArrow(o, o._.arrows.startString);\n\t                            \"endString\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\n\t                        }\n\t                        break;\n\t                    case \"stroke-dasharray\":\n\t                        addDashes(o, value, params);\n\t                        break;\n\t                    case \"fill\":\n\t                        var isURL = Str(value).match(R._ISURL);\n\t                        if (isURL) {\n\t                            el = $(\"pattern\");\n\t                            var ig = $(\"image\");\n\t                            el.id = R.createUUID();\n\t                            $(el, {x: 0, y: 0, patternUnits: \"userSpaceOnUse\", height: 1, width: 1});\n\t                            $(ig, {x: 0, y: 0, \"xlink:href\": isURL[1]});\n\t                            el.appendChild(ig);\n\n\t                            (function (el) {\n\t                                R._preload(isURL[1], function () {\n\t                                    var w = this.offsetWidth,\n\t                                        h = this.offsetHeight;\n\t                                    $(el, {width: w, height: h});\n\t                                    $(ig, {width: w, height: h});\n\t                                });\n\t                            })(el);\n\t                            o.paper.defs.appendChild(el);\n\t                            $(node, {fill: \"url(#\" + el.id + \")\"});\n\t                            o.pattern = el;\n\t                            o.pattern && updatePosition(o);\n\t                            break;\n\t                        }\n\t                        var clr = R.getRGB(value);\n\t                        if (!clr.error) {\n\t                            delete params.gradient;\n\t                            delete attrs.gradient;\n\t                            !R.is(attrs.opacity, \"undefined\") &&\n\t                                R.is(params.opacity, \"undefined\") &&\n\t                                $(node, {opacity: attrs.opacity});\n\t                            !R.is(attrs[\"fill-opacity\"], \"undefined\") &&\n\t                                R.is(params[\"fill-opacity\"], \"undefined\") &&\n\t                                $(node, {\"fill-opacity\": attrs[\"fill-opacity\"]});\n\t                        } else if ((o.type == \"circle\" || o.type == \"ellipse\" || Str(value).charAt() != \"r\") && addGradientFill(o, value)) {\n\t                            if (\"opacity\" in attrs || \"fill-opacity\" in attrs) {\n\t                                var gradient = R._g.doc.getElementById(node.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g, E));\n\t                                if (gradient) {\n\t                                    var stops = gradient.getElementsByTagName(\"stop\");\n\t                                    $(stops[stops.length - 1], {\"stop-opacity\": (\"opacity\" in attrs ? attrs.opacity : 1) * (\"fill-opacity\" in attrs ? attrs[\"fill-opacity\"] : 1)});\n\t                                }\n\t                            }\n\t                            attrs.gradient = value;\n\t                            attrs.fill = \"none\";\n\t                            break;\n\t                        }\n\t                        clr[has](\"opacity\") && $(node, {\"fill-opacity\": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});\n\t                    case \"stroke\":\n\t                        clr = R.getRGB(value);\n\t                        node.setAttribute(att, clr.hex);\n\t                        att == \"stroke\" && clr[has](\"opacity\") && $(node, {\"stroke-opacity\": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});\n\t                        if (att == \"stroke\" && o._.arrows) {\n\t                            \"startString\" in o._.arrows && addArrow(o, o._.arrows.startString);\n\t                            \"endString\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\n\t                        }\n\t                        break;\n\t                    case \"gradient\":\n\t                        (o.type == \"circle\" || o.type == \"ellipse\" || Str(value).charAt() != \"r\") && addGradientFill(o, value);\n\t                        break;\n\t                    case \"opacity\":\n\t                        if (attrs.gradient && !attrs[has](\"stroke-opacity\")) {\n\t                            $(node, {\"stroke-opacity\": value > 1 ? value / 100 : value});\n\t                        }\n\t                        // fall\n\t                    case \"fill-opacity\":\n\t                        if (attrs.gradient) {\n\t                            gradient = R._g.doc.getElementById(node.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g, E));\n\t                            if (gradient) {\n\t                                stops = gradient.getElementsByTagName(\"stop\");\n\t                                $(stops[stops.length - 1], {\"stop-opacity\": value});\n\t                            }\n\t                            break;\n\t                        }\n\t                    default:\n\t                        att == \"font-size\" && (value = toInt(value, 10) + \"px\");\n\t                        var cssrule = att.replace(/(\\-.)/g, function (w) {\n\t                            return w.substring(1).toUpperCase();\n\t                        });\n\t                        node.style[cssrule] = value;\n\t                        o._.dirty = 1;\n\t                        node.setAttribute(att, value);\n\t                        break;\n\t                }\n\t            }\n\t        }\n\n\t        tuneText(o, params);\n\t        node.style.visibility = vis;\n\t    },\n\t    leading = 1.2,\n\t    tuneText = function (el, params) {\n\t        if (el.type != \"text\" || !(params[has](\"text\") || params[has](\"font\") || params[has](\"font-size\") || params[has](\"x\") || params[has](\"y\"))) {\n\t            return;\n\t        }\n\t        var a = el.attrs,\n\t            node = el.node,\n\t            fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue(\"font-size\"), 10) : 10;\n\n\t        if (params[has](\"text\")) {\n\t            a.text = params.text;\n\t            while (node.firstChild) {\n\t                node.removeChild(node.firstChild);\n\t            }\n\t            var texts = Str(params.text).split(\"\\n\"),\n\t                tspans = [],\n\t                tspan;\n\t            for (var i = 0, ii = texts.length; i < ii; i++) {\n\t                tspan = $(\"tspan\");\n\t                i && $(tspan, {dy: fontSize * leading, x: a.x});\n\t                tspan.appendChild(R._g.doc.createTextNode(texts[i]));\n\t                node.appendChild(tspan);\n\t                tspans[i] = tspan;\n\t            }\n\t        } else {\n\t            tspans = node.getElementsByTagName(\"tspan\");\n\t            for (i = 0, ii = tspans.length; i < ii; i++) if (i) {\n\t                $(tspans[i], {dy: fontSize * leading, x: a.x});\n\t            } else {\n\t                $(tspans[0], {dy: 0});\n\t            }\n\t        }\n\t        $(node, {x: a.x, y: a.y});\n\t        el._.dirty = 1;\n\t        var bb = el._getBBox(),\n\t            dif = a.y - (bb.y + bb.height / 2);\n\t        dif && R.is(dif, \"finite\") && $(tspans[0], {dy: dif});\n\t    },\n\t    getRealNode = function (node) {\n\t        if (node.parentNode && node.parentNode.tagName.toLowerCase() === \"a\") {\n\t            return node.parentNode;\n\t        } else {\n\t            return node;\n\t        }\n\t    },\n\t    Element = function (node, svg) {\n\t        var X = 0,\n\t            Y = 0;\n\t        /*\\\n\t         * Element.node\n\t         [ property (object) ]\n\t         **\n\t         * Gives you a reference to the DOM object, so you can assign event handlers or just mess around.\n\t         **\n\t         * Note: Don’t mess with it.\n\t         > Usage\n\t         | // draw a circle at coordinate 10,10 with radius of 10\n\t         | var c = paper.circle(10, 10, 10);\n\t         | c.node.onclick = function () {\n\t         |     c.attr(\"fill\", \"red\");\n\t         | };\n\t        \\*/\n\t        this[0] = this.node = node;\n\t        /*\\\n\t         * Element.raphael\n\t         [ property (object) ]\n\t         **\n\t         * Internal reference to @Raphael object. In case it is not available.\n\t         > Usage\n\t         | Raphael.el.red = function () {\n\t         |     var hsb = this.paper.raphael.rgb2hsb(this.attr(\"fill\"));\n\t         |     hsb.h = 1;\n\t         |     this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex});\n\t         | }\n\t        \\*/\n\t        node.raphael = true;\n\t        /*\\\n\t         * Element.id\n\t         [ property (number) ]\n\t         **\n\t         * Unique id of the element. Especially useful when you want to listen to events of the element,\n\t         * because all events are fired in format `<module>.<action>.<id>`. Also useful for @Paper.getById method.\n\t        \\*/\n\t        this.id = guid();\n\t        node.raphaelid = this.id;\n\n\t        /**\n\t        * Method that returns a 5 letter/digit id, enough for 36^5 = 60466176 elements\n\t        * @returns {string} id\n\t        */\n\t        function guid() {\n\t            return (\"0000\" + (Math.random()*Math.pow(36,5) << 0).toString(36)).slice(-5);\n\t        }\n\n\t        this.matrix = R.matrix();\n\t        this.realPath = null;\n\t        /*\\\n\t         * Element.paper\n\t         [ property (object) ]\n\t         **\n\t         * Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions.\n\t         > Usage\n\t         | Raphael.el.cross = function () {\n\t         |     this.attr({fill: \"red\"});\n\t         |     this.paper.path(\"M10,10L50,50M50,10L10,50\")\n\t         |         .attr({stroke: \"red\"});\n\t         | }\n\t        \\*/\n\t        this.paper = svg;\n\t        this.attrs = this.attrs || {};\n\t        this._ = {\n\t            transform: [],\n\t            sx: 1,\n\t            sy: 1,\n\t            deg: 0,\n\t            dx: 0,\n\t            dy: 0,\n\t            dirty: 1\n\t        };\n\t        !svg.bottom && (svg.bottom = this);\n\t        /*\\\n\t         * Element.prev\n\t         [ property (object) ]\n\t         **\n\t         * Reference to the previous element in the hierarchy.\n\t        \\*/\n\t        this.prev = svg.top;\n\t        svg.top && (svg.top.next = this);\n\t        svg.top = this;\n\t        /*\\\n\t         * Element.next\n\t         [ property (object) ]\n\t         **\n\t         * Reference to the next element in the hierarchy.\n\t        \\*/\n\t        this.next = null;\n\t    },\n\t    elproto = R.el;\n\n\t    Element.prototype = elproto;\n\t    elproto.constructor = Element;\n\n\t    R._engine.path = function (pathString, SVG) {\n\t        var el = $(\"path\");\n\t        SVG.canvas && SVG.canvas.appendChild(el);\n\t        var p = new Element(el, SVG);\n\t        p.type = \"path\";\n\t        setFillAndStroke(p, {\n\t            fill: \"none\",\n\t            stroke: \"#000\",\n\t            path: pathString\n\t        });\n\t        return p;\n\t    };\n\t    /*\\\n\t     * Element.rotate\n\t     [ method ]\n\t     **\n\t     * Deprecated! Use @Element.transform instead.\n\t     * Adds rotation by given angle around given point to the list of\n\t     * transformations of the element.\n\t     > Parameters\n\t     - deg (number) angle in degrees\n\t     - cx (number) #optional x coordinate of the centre of rotation\n\t     - cy (number) #optional y coordinate of the centre of rotation\n\t     * If cx & cy aren’t specified centre of the shape is used as a point of rotation.\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.rotate = function (deg, cx, cy) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        deg = Str(deg).split(separator);\n\t        if (deg.length - 1) {\n\t            cx = toFloat(deg[1]);\n\t            cy = toFloat(deg[2]);\n\t        }\n\t        deg = toFloat(deg[0]);\n\t        (cy == null) && (cx = cy);\n\t        if (cx == null || cy == null) {\n\t            var bbox = this.getBBox(1);\n\t            cx = bbox.x + bbox.width / 2;\n\t            cy = bbox.y + bbox.height / 2;\n\t        }\n\t        this.transform(this._.transform.concat([[\"r\", deg, cx, cy]]));\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.scale\n\t     [ method ]\n\t     **\n\t     * Deprecated! Use @Element.transform instead.\n\t     * Adds scale by given amount relative to given point to the list of\n\t     * transformations of the element.\n\t     > Parameters\n\t     - sx (number) horisontal scale amount\n\t     - sy (number) vertical scale amount\n\t     - cx (number) #optional x coordinate of the centre of scale\n\t     - cy (number) #optional y coordinate of the centre of scale\n\t     * If cx & cy aren’t specified centre of the shape is used instead.\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.scale = function (sx, sy, cx, cy) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        sx = Str(sx).split(separator);\n\t        if (sx.length - 1) {\n\t            sy = toFloat(sx[1]);\n\t            cx = toFloat(sx[2]);\n\t            cy = toFloat(sx[3]);\n\t        }\n\t        sx = toFloat(sx[0]);\n\t        (sy == null) && (sy = sx);\n\t        (cy == null) && (cx = cy);\n\t        if (cx == null || cy == null) {\n\t            var bbox = this.getBBox(1);\n\t        }\n\t        cx = cx == null ? bbox.x + bbox.width / 2 : cx;\n\t        cy = cy == null ? bbox.y + bbox.height / 2 : cy;\n\t        this.transform(this._.transform.concat([[\"s\", sx, sy, cx, cy]]));\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.translate\n\t     [ method ]\n\t     **\n\t     * Deprecated! Use @Element.transform instead.\n\t     * Adds translation by given amount to the list of transformations of the element.\n\t     > Parameters\n\t     - dx (number) horisontal shift\n\t     - dy (number) vertical shift\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.translate = function (dx, dy) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        dx = Str(dx).split(separator);\n\t        if (dx.length - 1) {\n\t            dy = toFloat(dx[1]);\n\t        }\n\t        dx = toFloat(dx[0]) || 0;\n\t        dy = +dy || 0;\n\t        this.transform(this._.transform.concat([[\"t\", dx, dy]]));\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.transform\n\t     [ method ]\n\t     **\n\t     * Adds transformation to the element which is separate to other attributes,\n\t     * i.e. translation doesn’t change `x` or `y` of the rectange. The format\n\t     * of transformation string is similar to the path string syntax:\n\t     | \"t100,100r30,100,100s2,2,100,100r45s1.5\"\n\t     * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for\n\t     * scale and `m` is for matrix.\n\t     *\n\t     * There are also alternative “absolute” translation, rotation and scale: `T`, `R` and `S`. They will not take previous transformation into account. For example, `...T100,0` will always move element 100 px horisontally, while `...t100,0` could move it vertically if there is `r90` before. Just compare results of `r90t100,0` and `r90T100,0`.\n\t     *\n\t     * So, the example line above could be read like “translate by 100, 100; rotate 30° around 100, 100; scale twice around 100, 100;\n\t     * rotate 45° around centre; scale 1.5 times relative to centre”. As you can see rotate and scale commands have origin\n\t     * coordinates as optional parameters, the default is the centre point of the element.\n\t     * Matrix accepts six parameters.\n\t     > Usage\n\t     | var el = paper.rect(10, 20, 300, 200);\n\t     | // translate 100, 100, rotate 45°, translate -100, 0\n\t     | el.transform(\"t100,100r45t-100,0\");\n\t     | // if you want you can append or prepend transformations\n\t     | el.transform(\"...t50,50\");\n\t     | el.transform(\"s2...\");\n\t     | // or even wrap\n\t     | el.transform(\"t50,50...t-50-50\");\n\t     | // to reset transformation call method with empty string\n\t     | el.transform(\"\");\n\t     | // to get current value call it without parameters\n\t     | console.log(el.transform());\n\t     > Parameters\n\t     - tstr (string) #optional transformation string\n\t     * If tstr isn’t specified\n\t     = (string) current transformation string\n\t     * else\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.transform = function (tstr) {\n\t        var _ = this._;\n\t        if (tstr == null) {\n\t            return _.transform;\n\t        }\n\t        R._extractTransform(this, tstr);\n\n\t        this.clip && $(this.clip, {transform: this.matrix.invert()});\n\t        this.pattern && updatePosition(this);\n\t        this.node && $(this.node, {transform: this.matrix});\n\n\t        if (_.sx != 1 || _.sy != 1) {\n\t            var sw = this.attrs[has](\"stroke-width\") ? this.attrs[\"stroke-width\"] : 1;\n\t            this.attr({\"stroke-width\": sw});\n\t        }\n\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.hide\n\t     [ method ]\n\t     **\n\t     * Makes element invisible. See @Element.show.\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.hide = function () {\n\t        if(!this.removed) this.node.style.display = \"none\";\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.show\n\t     [ method ]\n\t     **\n\t     * Makes element visible. See @Element.hide.\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.show = function () {\n\t        if(!this.removed) this.node.style.display = \"\";\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.remove\n\t     [ method ]\n\t     **\n\t     * Removes element from the paper.\n\t    \\*/\n\t    elproto.remove = function () {\n\t        var node = getRealNode(this.node);\n\t        if (this.removed || !node.parentNode) {\n\t            return;\n\t        }\n\t        var paper = this.paper;\n\t        paper.__set__ && paper.__set__.exclude(this);\n\t        eve.unbind(\"raphael.*.*.\" + this.id);\n\t        if (this.gradient) {\n\t            paper.defs.removeChild(this.gradient);\n\t        }\n\t        R._tear(this, paper);\n\n\t        node.parentNode.removeChild(node);\n\n\t        // Remove custom data for element\n\t        this.removeData();\n\n\t        for (var i in this) {\n\t            this[i] = typeof this[i] == \"function\" ? R._removedFactory(i) : null;\n\t        }\n\t        this.removed = true;\n\t    };\n\t    elproto._getBBox = function () {\n\t        if (this.node.style.display == \"none\") {\n\t            this.show();\n\t            var hide = true;\n\t        }\n\t        var canvasHidden = false,\n\t            containerStyle;\n\t        if (this.paper.canvas.parentElement) {\n\t          containerStyle = this.paper.canvas.parentElement.style;\n\t        } //IE10+ can't find parentElement\n\t        else if (this.paper.canvas.parentNode) {\n\t          containerStyle = this.paper.canvas.parentNode.style;\n\t        }\n\n\t        if(containerStyle && containerStyle.display == \"none\") {\n\t          canvasHidden = true;\n\t          containerStyle.display = \"\";\n\t        }\n\t        var bbox = {};\n\t        try {\n\t            bbox = this.node.getBBox();\n\t        } catch(e) {\n\t            // Firefox 3.0.x, 25.0.1 (probably more versions affected) play badly here - possible fix\n\t            bbox = {\n\t                x: this.node.clientLeft,\n\t                y: this.node.clientTop,\n\t                width: this.node.clientWidth,\n\t                height: this.node.clientHeight\n\t            }\n\t        } finally {\n\t            bbox = bbox || {};\n\t            if(canvasHidden){\n\t              containerStyle.display = \"none\";\n\t            }\n\t        }\n\t        hide && this.hide();\n\t        return bbox;\n\t    };\n\t    /*\\\n\t     * Element.attr\n\t     [ method ]\n\t     **\n\t     * Sets the attributes of the element.\n\t     > Parameters\n\t     - attrName (string) attribute’s name\n\t     - value (string) value\n\t     * or\n\t     - params (object) object of name/value pairs\n\t     * or\n\t     - attrName (string) attribute’s name\n\t     * or\n\t     - attrNames (array) in this case method returns array of current values for given attribute names\n\t     = (object) @Element if attrsName & value or params are passed in.\n\t     = (...) value of the attribute if only attrsName is passed in.\n\t     = (array) array of values of the attribute if attrsNames is passed in.\n\t     = (object) object of attributes if nothing is passed in.\n\t     > Possible parameters\n\t     # <p>Please refer to the <a href=\"http://www.w3.org/TR/SVG/\" title=\"The W3C Recommendation for the SVG language describes these properties in detail.\">SVG specification</a> for an explanation of these parameters.</p>\n\t     o arrow-end (string) arrowhead on the end of the path. The format for string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `medium`, length: `long`, `short`, `midium`.\n\t     o clip-rect (string) comma or space separated values: x, y, width and height\n\t     o cursor (string) CSS type of the cursor\n\t     o cx (number) the x-axis coordinate of the center of the circle, or ellipse\n\t     o cy (number) the y-axis coordinate of the center of the circle, or ellipse\n\t     o fill (string) colour, gradient or image\n\t     o fill-opacity (number)\n\t     o font (string)\n\t     o font-family (string)\n\t     o font-size (number) font size in pixels\n\t     o font-weight (string)\n\t     o height (number)\n\t     o href (string) URL, if specified element behaves as hyperlink\n\t     o opacity (number)\n\t     o path (string) SVG path string format\n\t     o r (number) radius of the circle, ellipse or rounded corner on the rect\n\t     o rx (number) horisontal radius of the ellipse\n\t     o ry (number) vertical radius of the ellipse\n\t     o src (string) image URL, only works for @Element.image element\n\t     o stroke (string) stroke colour\n\t     o stroke-dasharray (string) [“”, “none”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”]\n\t     o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”]\n\t     o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”]\n\t     o stroke-miterlimit (number)\n\t     o stroke-opacity (number)\n\t     o stroke-width (number) stroke width in pixels, default is '1'\n\t     o target (string) used with href\n\t     o text (string) contents of the text element. Use `\\n` for multiline text\n\t     o text-anchor (string) [“`start`”, “`middle`”, “`end`”], default is “`middle`”\n\t     o title (string) will create tooltip with a given text\n\t     o transform (string) see @Element.transform\n\t     o width (number)\n\t     o x (number)\n\t     o y (number)\n\t     > Gradients\n\t     * Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`90-#fff-#000`” – 90°\n\t     * gradient from white to black or “`0-#fff-#f00:20-#000`” – 0° gradient from white via red (at 20%) to black.\n\t     *\n\t     * radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#000`” –\n\t     * gradient from white to black or “`r(0.25, 0.75)#fff-#000`” – gradient from white to black with focus point\n\t     * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses.\n\t     > Path String\n\t     # <p>Please refer to <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path’s data attribute’s format are described in the SVG specification.\">SVG documentation regarding path string</a>. Raphaël fully supports it.</p>\n\t     > Colour Parsing\n\t     # <ul>\n\t     #     <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li>\n\t     #     <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li>\n\t     #     <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li>\n\t     #     <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200,&nbsp;100,&nbsp;0)</code>”)</li>\n\t     #     <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>”)</li>\n\t     #     <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(200,&nbsp;100,&nbsp;0, .5)</code>”)</li>\n\t     #     <li>rgba(•••%, •••%, •••%, •••%) — same as above, but in %: (“<code>rgba(100%,&nbsp;175%,&nbsp;0%, 50%)</code>”)</li>\n\t     #     <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>”)</li>\n\t     #     <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\n\t     #     <li>hsba(•••, •••, •••, •••) — same as above, but with opacity</li>\n\t     #     <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href=\"http://en.wikipedia.org/wiki/HSL_and_HSV\" title=\"HSL and HSV - Wikipedia, the free encyclopedia\">Wikipedia page</a></li>\n\t     #     <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\n\t     #     <li>hsla(•••, •••, •••, •••) — same as above, but with opacity</li>\n\t     #     <li>Optionally for hsb and hsl you could specify hue as a degree: “<code>hsl(240deg,&nbsp;1,&nbsp;.5)</code>” or, if you want to go fancy, “<code>hsl(240°,&nbsp;1,&nbsp;.5)</code>”</li>\n\t     # </ul>\n\t    \\*/\n\t    elproto.attr = function (name, value) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        if (name == null) {\n\t            var res = {};\n\t            for (var a in this.attrs) if (this.attrs[has](a)) {\n\t                res[a] = this.attrs[a];\n\t            }\n\t            res.gradient && res.fill == \"none\" && (res.fill = res.gradient) && delete res.gradient;\n\t            res.transform = this._.transform;\n\t            return res;\n\t        }\n\t        if (value == null && R.is(name, \"string\")) {\n\t            if (name == \"fill\" && this.attrs.fill == \"none\" && this.attrs.gradient) {\n\t                return this.attrs.gradient;\n\t            }\n\t            if (name == \"transform\") {\n\t                return this._.transform;\n\t            }\n\t            var names = name.split(separator),\n\t                out = {};\n\t            for (var i = 0, ii = names.length; i < ii; i++) {\n\t                name = names[i];\n\t                if (name in this.attrs) {\n\t                    out[name] = this.attrs[name];\n\t                } else if (R.is(this.paper.customAttributes[name], \"function\")) {\n\t                    out[name] = this.paper.customAttributes[name].def;\n\t                } else {\n\t                    out[name] = R._availableAttrs[name];\n\t                }\n\t            }\n\t            return ii - 1 ? out : out[names[0]];\n\t        }\n\t        if (value == null && R.is(name, \"array\")) {\n\t            out = {};\n\t            for (i = 0, ii = name.length; i < ii; i++) {\n\t                out[name[i]] = this.attr(name[i]);\n\t            }\n\t            return out;\n\t        }\n\t        if (value != null) {\n\t            var params = {};\n\t            params[name] = value;\n\t        } else if (name != null && R.is(name, \"object\")) {\n\t            params = name;\n\t        }\n\t        for (var key in params) {\n\t            eve(\"raphael.attr.\" + key + \".\" + this.id, this, params[key]);\n\t        }\n\t        for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], \"function\")) {\n\t            var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));\n\t            this.attrs[key] = params[key];\n\t            for (var subkey in par) if (par[has](subkey)) {\n\t                params[subkey] = par[subkey];\n\t            }\n\t        }\n\t        setFillAndStroke(this, params);\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.toFront\n\t     [ method ]\n\t     **\n\t     * Moves the element so it is the closest to the viewer’s eyes, on top of other elements.\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.toFront = function () {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        var node = getRealNode(this.node);\n\t        node.parentNode.appendChild(node);\n\t        var svg = this.paper;\n\t        svg.top != this && R._tofront(this, svg);\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.toBack\n\t     [ method ]\n\t     **\n\t     * Moves the element so it is the furthest from the viewer’s eyes, behind other elements.\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.toBack = function () {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        var node = getRealNode(this.node);\n\t        var parentNode = node.parentNode;\n\t        parentNode.insertBefore(node, parentNode.firstChild);\n\t        R._toback(this, this.paper);\n\t        var svg = this.paper;\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.insertAfter\n\t     [ method ]\n\t     **\n\t     * Inserts current object after the given one.\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.insertAfter = function (element) {\n\t        if (this.removed || !element) {\n\t            return this;\n\t        }\n\n\t        var node = getRealNode(this.node);\n\t        var afterNode = getRealNode(element.node || element[element.length - 1].node);\n\t        if (afterNode.nextSibling) {\n\t            afterNode.parentNode.insertBefore(node, afterNode.nextSibling);\n\t        } else {\n\t            afterNode.parentNode.appendChild(node);\n\t        }\n\t        R._insertafter(this, element, this.paper);\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Element.insertBefore\n\t     [ method ]\n\t     **\n\t     * Inserts current object before the given one.\n\t     = (object) @Element\n\t    \\*/\n\t    elproto.insertBefore = function (element) {\n\t        if (this.removed || !element) {\n\t            return this;\n\t        }\n\n\t        var node = getRealNode(this.node);\n\t        var beforeNode = getRealNode(element.node || element[0].node);\n\t        beforeNode.parentNode.insertBefore(node, beforeNode);\n\t        R._insertbefore(this, element, this.paper);\n\t        return this;\n\t    };\n\t    elproto.blur = function (size) {\n\t        // Experimental. No Safari support. Use it on your own risk.\n\t        var t = this;\n\t        if (+size !== 0) {\n\t            var fltr = $(\"filter\"),\n\t                blur = $(\"feGaussianBlur\");\n\t            t.attrs.blur = size;\n\t            fltr.id = R.createUUID();\n\t            $(blur, {stdDeviation: +size || 1.5});\n\t            fltr.appendChild(blur);\n\t            t.paper.defs.appendChild(fltr);\n\t            t._blur = fltr;\n\t            $(t.node, {filter: \"url(#\" + fltr.id + \")\"});\n\t        } else {\n\t            if (t._blur) {\n\t                t._blur.parentNode.removeChild(t._blur);\n\t                delete t._blur;\n\t                delete t.attrs.blur;\n\t            }\n\t            t.node.removeAttribute(\"filter\");\n\t        }\n\t        return t;\n\t    };\n\t    R._engine.circle = function (svg, x, y, r) {\n\t        var el = $(\"circle\");\n\t        svg.canvas && svg.canvas.appendChild(el);\n\t        var res = new Element(el, svg);\n\t        res.attrs = {cx: x, cy: y, r: r, fill: \"none\", stroke: \"#000\"};\n\t        res.type = \"circle\";\n\t        $(el, res.attrs);\n\t        return res;\n\t    };\n\t    R._engine.rect = function (svg, x, y, w, h, r) {\n\t        var el = $(\"rect\");\n\t        svg.canvas && svg.canvas.appendChild(el);\n\t        var res = new Element(el, svg);\n\t        res.attrs = {x: x, y: y, width: w, height: h, rx: r || 0, ry: r || 0, fill: \"none\", stroke: \"#000\"};\n\t        res.type = \"rect\";\n\t        $(el, res.attrs);\n\t        return res;\n\t    };\n\t    R._engine.ellipse = function (svg, x, y, rx, ry) {\n\t        var el = $(\"ellipse\");\n\t        svg.canvas && svg.canvas.appendChild(el);\n\t        var res = new Element(el, svg);\n\t        res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: \"none\", stroke: \"#000\"};\n\t        res.type = \"ellipse\";\n\t        $(el, res.attrs);\n\t        return res;\n\t    };\n\t    R._engine.image = function (svg, src, x, y, w, h) {\n\t        var el = $(\"image\");\n\t        $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: \"none\"});\n\t        el.setAttributeNS(xlink, \"href\", src);\n\t        svg.canvas && svg.canvas.appendChild(el);\n\t        var res = new Element(el, svg);\n\t        res.attrs = {x: x, y: y, width: w, height: h, src: src};\n\t        res.type = \"image\";\n\t        return res;\n\t    };\n\t    R._engine.text = function (svg, x, y, text) {\n\t        var el = $(\"text\");\n\t        svg.canvas && svg.canvas.appendChild(el);\n\t        var res = new Element(el, svg);\n\t        res.attrs = {\n\t            x: x,\n\t            y: y,\n\t            \"text-anchor\": \"middle\",\n\t            text: text,\n\t            \"font-family\": R._availableAttrs[\"font-family\"],\n\t            \"font-size\": R._availableAttrs[\"font-size\"],\n\t            stroke: \"none\",\n\t            fill: \"#000\"\n\t        };\n\t        res.type = \"text\";\n\t        setFillAndStroke(res, res.attrs);\n\t        return res;\n\t    };\n\t    R._engine.setSize = function (width, height) {\n\t        this.width = width || this.width;\n\t        this.height = height || this.height;\n\t        this.canvas.setAttribute(\"width\", this.width);\n\t        this.canvas.setAttribute(\"height\", this.height);\n\t        if (this._viewBox) {\n\t            this.setViewBox.apply(this, this._viewBox);\n\t        }\n\t        return this;\n\t    };\n\t    R._engine.create = function () {\n\t        var con = R._getContainer.apply(0, arguments),\n\t            container = con && con.container,\n\t            x = con.x,\n\t            y = con.y,\n\t            width = con.width,\n\t            height = con.height;\n\t        if (!container) {\n\t            throw new Error(\"SVG container not found.\");\n\t        }\n\t        var cnvs = $(\"svg\"),\n\t            css = \"overflow:hidden;\",\n\t            isFloating;\n\t        x = x || 0;\n\t        y = y || 0;\n\t        width = width || 512;\n\t        height = height || 342;\n\t        $(cnvs, {\n\t            height: height,\n\t            version: 1.1,\n\t            width: width,\n\t            xmlns: \"http://www.w3.org/2000/svg\",\n\t            \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\"\n\t        });\n\t        if (container == 1) {\n\t            cnvs.style.cssText = css + \"position:absolute;left:\" + x + \"px;top:\" + y + \"px\";\n\t            R._g.doc.body.appendChild(cnvs);\n\t            isFloating = 1;\n\t        } else {\n\t            cnvs.style.cssText = css + \"position:relative\";\n\t            if (container.firstChild) {\n\t                container.insertBefore(cnvs, container.firstChild);\n\t            } else {\n\t                container.appendChild(cnvs);\n\t            }\n\t        }\n\t        container = new R._Paper;\n\t        container.width = width;\n\t        container.height = height;\n\t        container.canvas = cnvs;\n\t        container.clear();\n\t        container._left = container._top = 0;\n\t        isFloating && (container.renderfix = function () {});\n\t        container.renderfix();\n\t        return container;\n\t    };\n\t    R._engine.setViewBox = function (x, y, w, h, fit) {\n\t        eve(\"raphael.setViewBox\", this, this._viewBox, [x, y, w, h, fit]);\n\t        var paperSize = this.getSize(),\n\t            size = mmax(w / paperSize.width, h / paperSize.height),\n\t            top = this.top,\n\t            aspectRatio = fit ? \"xMidYMid meet\" : \"xMinYMin\",\n\t            vb,\n\t            sw;\n\t        if (x == null) {\n\t            if (this._vbSize) {\n\t                size = 1;\n\t            }\n\t            delete this._vbSize;\n\t            vb = \"0 0 \" + this.width + S + this.height;\n\t        } else {\n\t            this._vbSize = size;\n\t            vb = x + S + y + S + w + S + h;\n\t        }\n\t        $(this.canvas, {\n\t            viewBox: vb,\n\t            preserveAspectRatio: aspectRatio\n\t        });\n\t        while (size && top) {\n\t            sw = \"stroke-width\" in top.attrs ? top.attrs[\"stroke-width\"] : 1;\n\t            top.attr({\"stroke-width\": sw});\n\t            top._.dirty = 1;\n\t            top._.dirtyT = 1;\n\t            top = top.prev;\n\t        }\n\t        this._viewBox = [x, y, w, h, !!fit];\n\t        return this;\n\t    };\n\t    /*\\\n\t     * Paper.renderfix\n\t     [ method ]\n\t     **\n\t     * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependent\n\t     * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness.\n\t     * This method fixes the issue.\n\t     **\n\t       Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method.\n\t    \\*/\n\t    R.prototype.renderfix = function () {\n\t        var cnvs = this.canvas,\n\t            s = cnvs.style,\n\t            pos;\n\t        try {\n\t            pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix();\n\t        } catch (e) {\n\t            pos = cnvs.createSVGMatrix();\n\t        }\n\t        var left = -pos.e % 1,\n\t            top = -pos.f % 1;\n\t        if (left || top) {\n\t            if (left) {\n\t                this._left = (this._left + left) % 1;\n\t                s.left = this._left + \"px\";\n\t            }\n\t            if (top) {\n\t                this._top = (this._top + top) % 1;\n\t                s.top = this._top + \"px\";\n\t            }\n\t        }\n\t    };\n\t    /*\\\n\t     * Paper.clear\n\t     [ method ]\n\t     **\n\t     * Clears the paper, i.e. removes all the elements.\n\t    \\*/\n\t    R.prototype.clear = function () {\n\t        R.eve(\"raphael.clear\", this);\n\t        var c = this.canvas;\n\t        while (c.firstChild) {\n\t            c.removeChild(c.firstChild);\n\t        }\n\t        this.bottom = this.top = null;\n\t        (this.desc = $(\"desc\")).appendChild(R._g.doc.createTextNode(\"Created with Rapha\\xebl \" + R.version));\n\t        c.appendChild(this.desc);\n\t        c.appendChild(this.defs = $(\"defs\"));\n\t    };\n\t    /*\\\n\t     * Paper.remove\n\t     [ method ]\n\t     **\n\t     * Removes the paper from the DOM.\n\t    \\*/\n\t    R.prototype.remove = function () {\n\t        eve(\"raphael.remove\", this);\n\t        this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);\n\t        for (var i in this) {\n\t            this[i] = typeof this[i] == \"function\" ? R._removedFactory(i) : null;\n\t        }\n\t    };\n\t    var setproto = R.st;\n\t    for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {\n\t        setproto[method] = (function (methodname) {\n\t            return function () {\n\t                var arg = arguments;\n\t                return this.forEach(function (el) {\n\t                    el[methodname].apply(el, arg);\n\t                });\n\t            };\n\t        })(method);\n\t    }\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(1)], __WEBPACK_AMD_DEFINE_RESULT__ = function(R) {\n\t    if (R && !R.vml) {\n\t        return;\n\t    }\n\n\t    var has = \"hasOwnProperty\",\n\t        Str = String,\n\t        toFloat = parseFloat,\n\t        math = Math,\n\t        round = math.round,\n\t        mmax = math.max,\n\t        mmin = math.min,\n\t        abs = math.abs,\n\t        fillString = \"fill\",\n\t        separator = /[, ]+/,\n\t        eve = R.eve,\n\t        ms = \" progid:DXImageTransform.Microsoft\",\n\t        S = \" \",\n\t        E = \"\",\n\t        map = {M: \"m\", L: \"l\", C: \"c\", Z: \"x\", m: \"t\", l: \"r\", c: \"v\", z: \"x\"},\n\t        bites = /([clmz]),?([^clmz]*)/gi,\n\t        blurregexp = / progid:\\S+Blur\\([^\\)]+\\)/g,\n\t        val = /-?[^,\\s-]+/g,\n\t        cssDot = \"position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)\",\n\t        zoom = 21600,\n\t        pathTypes = {path: 1, rect: 1, image: 1},\n\t        ovalTypes = {circle: 1, ellipse: 1},\n\t        path2vml = function (path) {\n\t            var total =  /[ahqstv]/ig,\n\t                command = R._pathToAbsolute;\n\t            Str(path).match(total) && (command = R._path2curve);\n\t            total = /[clmz]/g;\n\t            if (command == R._pathToAbsolute && !Str(path).match(total)) {\n\t                var res = Str(path).replace(bites, function (all, command, args) {\n\t                    var vals = [],\n\t                        isMove = command.toLowerCase() == \"m\",\n\t                        res = map[command];\n\t                    args.replace(val, function (value) {\n\t                        if (isMove && vals.length == 2) {\n\t                            res += vals + map[command == \"m\" ? \"l\" : \"L\"];\n\t                            vals = [];\n\t                        }\n\t                        vals.push(round(value * zoom));\n\t                    });\n\t                    return res + vals;\n\t                });\n\t                return res;\n\t            }\n\t            var pa = command(path), p, r;\n\t            res = [];\n\t            for (var i = 0, ii = pa.length; i < ii; i++) {\n\t                p = pa[i];\n\t                r = pa[i][0].toLowerCase();\n\t                r == \"z\" && (r = \"x\");\n\t                for (var j = 1, jj = p.length; j < jj; j++) {\n\t                    r += round(p[j] * zoom) + (j != jj - 1 ? \",\" : E);\n\t                }\n\t                res.push(r);\n\t            }\n\t            return res.join(S);\n\t        },\n\t        compensation = function (deg, dx, dy) {\n\t            var m = R.matrix();\n\t            m.rotate(-deg, .5, .5);\n\t            return {\n\t                dx: m.x(dx, dy),\n\t                dy: m.y(dx, dy)\n\t            };\n\t        },\n\t        setCoords = function (p, sx, sy, dx, dy, deg) {\n\t            var _ = p._,\n\t                m = p.matrix,\n\t                fillpos = _.fillpos,\n\t                o = p.node,\n\t                s = o.style,\n\t                y = 1,\n\t                flip = \"\",\n\t                dxdy,\n\t                kx = zoom / sx,\n\t                ky = zoom / sy;\n\t            s.visibility = \"hidden\";\n\t            if (!sx || !sy) {\n\t                return;\n\t            }\n\t            o.coordsize = abs(kx) + S + abs(ky);\n\t            s.rotation = deg * (sx * sy < 0 ? -1 : 1);\n\t            if (deg) {\n\t                var c = compensation(deg, dx, dy);\n\t                dx = c.dx;\n\t                dy = c.dy;\n\t            }\n\t            sx < 0 && (flip += \"x\");\n\t            sy < 0 && (flip += \" y\") && (y = -1);\n\t            s.flip = flip;\n\t            o.coordorigin = (dx * -kx) + S + (dy * -ky);\n\t            if (fillpos || _.fillsize) {\n\t                var fill = o.getElementsByTagName(fillString);\n\t                fill = fill && fill[0];\n\t                o.removeChild(fill);\n\t                if (fillpos) {\n\t                    c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1]));\n\t                    fill.position = c.dx * y + S + c.dy * y;\n\t                }\n\t                if (_.fillsize) {\n\t                    fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy);\n\t                }\n\t                o.appendChild(fill);\n\t            }\n\t            s.visibility = \"visible\";\n\t        };\n\t    R.toString = function () {\n\t        return  \"Your browser doesn\\u2019t support SVG. Falling down to VML.\\nYou are running Rapha\\xebl \" + this.version;\n\t    };\n\t    var addArrow = function (o, value, isEnd) {\n\t        var values = Str(value).toLowerCase().split(\"-\"),\n\t            se = isEnd ? \"end\" : \"start\",\n\t            i = values.length,\n\t            type = \"classic\",\n\t            w = \"medium\",\n\t            h = \"medium\";\n\t        while (i--) {\n\t            switch (values[i]) {\n\t                case \"block\":\n\t                case \"classic\":\n\t                case \"oval\":\n\t                case \"diamond\":\n\t                case \"open\":\n\t                case \"none\":\n\t                    type = values[i];\n\t                    break;\n\t                case \"wide\":\n\t                case \"narrow\": h = values[i]; break;\n\t                case \"long\":\n\t                case \"short\": w = values[i]; break;\n\t            }\n\t        }\n\t        var stroke = o.node.getElementsByTagName(\"stroke\")[0];\n\t        stroke[se + \"arrow\"] = type;\n\t        stroke[se + \"arrowlength\"] = w;\n\t        stroke[se + \"arrowwidth\"] = h;\n\t    },\n\t    setFillAndStroke = function (o, params) {\n\t        // o.paper.canvas.style.display = \"none\";\n\t        o.attrs = o.attrs || {};\n\t        var node = o.node,\n\t            a = o.attrs,\n\t            s = node.style,\n\t            xy,\n\t            newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r),\n\t            isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry),\n\t            res = o;\n\n\n\t        for (var par in params) if (params[has](par)) {\n\t            a[par] = params[par];\n\t        }\n\t        if (newpath) {\n\t            a.path = R._getPath[o.type](o);\n\t            o._.dirty = 1;\n\t        }\n\t        params.href && (node.href = params.href);\n\t        params.title && (node.title = params.title);\n\t        params.target && (node.target = params.target);\n\t        params.cursor && (s.cursor = params.cursor);\n\t        \"blur\" in params && o.blur(params.blur);\n\t        if (params.path && o.type == \"path\" || newpath) {\n\t            node.path = path2vml(~Str(a.path).toLowerCase().indexOf(\"r\") ? R._pathToAbsolute(a.path) : a.path);\n\t            o._.dirty = 1;\n\t            if (o.type == \"image\") {\n\t                o._.fillpos = [a.x, a.y];\n\t                o._.fillsize = [a.width, a.height];\n\t                setCoords(o, 1, 1, 0, 0, 0);\n\t            }\n\t        }\n\t        \"transform\" in params && o.transform(params.transform);\n\t        if (isOval) {\n\t            var cx = +a.cx,\n\t                cy = +a.cy,\n\t                rx = +a.rx || +a.r || 0,\n\t                ry = +a.ry || +a.r || 0;\n\t            node.path = R.format(\"ar{0},{1},{2},{3},{4},{1},{4},{1}x\", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom));\n\t            o._.dirty = 1;\n\t        }\n\t        if (\"clip-rect\" in params) {\n\t            var rect = Str(params[\"clip-rect\"]).split(separator);\n\t            if (rect.length == 4) {\n\t                rect[2] = +rect[2] + (+rect[0]);\n\t                rect[3] = +rect[3] + (+rect[1]);\n\t                var div = node.clipRect || R._g.doc.createElement(\"div\"),\n\t                    dstyle = div.style;\n\t                dstyle.clip = R.format(\"rect({1}px {2}px {3}px {0}px)\", rect);\n\t                if (!node.clipRect) {\n\t                    dstyle.position = \"absolute\";\n\t                    dstyle.top = 0;\n\t                    dstyle.left = 0;\n\t                    dstyle.width = o.paper.width + \"px\";\n\t                    dstyle.height = o.paper.height + \"px\";\n\t                    node.parentNode.insertBefore(div, node);\n\t                    div.appendChild(node);\n\t                    node.clipRect = div;\n\t                }\n\t            }\n\t            if (!params[\"clip-rect\"]) {\n\t                node.clipRect && (node.clipRect.style.clip = \"auto\");\n\t            }\n\t        }\n\t        if (o.textpath) {\n\t            var textpathStyle = o.textpath.style;\n\t            params.font && (textpathStyle.font = params.font);\n\t            params[\"font-family\"] && (textpathStyle.fontFamily = '\"' + params[\"font-family\"].split(\",\")[0].replace(/^['\"]+|['\"]+$/g, E) + '\"');\n\t            params[\"font-size\"] && (textpathStyle.fontSize = params[\"font-size\"]);\n\t            params[\"font-weight\"] && (textpathStyle.fontWeight = params[\"font-weight\"]);\n\t            params[\"font-style\"] && (textpathStyle.fontStyle = params[\"font-style\"]);\n\t        }\n\t        if (\"arrow-start\" in params) {\n\t            addArrow(res, params[\"arrow-start\"]);\n\t        }\n\t        if (\"arrow-end\" in params) {\n\t            addArrow(res, params[\"arrow-end\"], 1);\n\t        }\n\t        if (params.opacity != null ||\n\t            params.fill != null ||\n\t            params.src != null ||\n\t            params.stroke != null ||\n\t            params[\"stroke-width\"] != null ||\n\t            params[\"stroke-opacity\"] != null ||\n\t            params[\"fill-opacity\"] != null ||\n\t            params[\"stroke-dasharray\"] != null ||\n\t            params[\"stroke-miterlimit\"] != null ||\n\t            params[\"stroke-linejoin\"] != null ||\n\t            params[\"stroke-linecap\"] != null) {\n\t            var fill = node.getElementsByTagName(fillString),\n\t                newfill = false;\n\t            fill = fill && fill[0];\n\t            !fill && (newfill = fill = createNode(fillString));\n\t            if (o.type == \"image\" && params.src) {\n\t                fill.src = params.src;\n\t            }\n\t            params.fill && (fill.on = true);\n\t            if (fill.on == null || params.fill == \"none\" || params.fill === null) {\n\t                fill.on = false;\n\t            }\n\t            if (fill.on && params.fill) {\n\t                var isURL = Str(params.fill).match(R._ISURL);\n\t                if (isURL) {\n\t                    fill.parentNode == node && node.removeChild(fill);\n\t                    fill.rotate = true;\n\t                    fill.src = isURL[1];\n\t                    fill.type = \"tile\";\n\t                    var bbox = o.getBBox(1);\n\t                    fill.position = bbox.x + S + bbox.y;\n\t                    o._.fillpos = [bbox.x, bbox.y];\n\n\t                    R._preload(isURL[1], function () {\n\t                        o._.fillsize = [this.offsetWidth, this.offsetHeight];\n\t                    });\n\t                } else {\n\t                    fill.color = R.getRGB(params.fill).hex;\n\t                    fill.src = E;\n\t                    fill.type = \"solid\";\n\t                    if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != \"r\") && addGradientFill(res, params.fill, fill)) {\n\t                        a.fill = \"none\";\n\t                        a.gradient = params.fill;\n\t                        fill.rotate = false;\n\t                    }\n\t                }\n\t            }\n\t            if (\"fill-opacity\" in params || \"opacity\" in params) {\n\t                var opacity = ((+a[\"fill-opacity\"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1);\n\t                opacity = mmin(mmax(opacity, 0), 1);\n\t                fill.opacity = opacity;\n\t                if (fill.src) {\n\t                    fill.color = \"none\";\n\t                }\n\t            }\n\t            node.appendChild(fill);\n\t            var stroke = (node.getElementsByTagName(\"stroke\") && node.getElementsByTagName(\"stroke\")[0]),\n\t            newstroke = false;\n\t            !stroke && (newstroke = stroke = createNode(\"stroke\"));\n\t            if ((params.stroke && params.stroke != \"none\") ||\n\t                params[\"stroke-width\"] ||\n\t                params[\"stroke-opacity\"] != null ||\n\t                params[\"stroke-dasharray\"] ||\n\t                params[\"stroke-miterlimit\"] ||\n\t                params[\"stroke-linejoin\"] ||\n\t                params[\"stroke-linecap\"]) {\n\t                stroke.on = true;\n\t            }\n\t            (params.stroke == \"none\" || params.stroke === null || stroke.on == null || params.stroke == 0 || params[\"stroke-width\"] == 0) && (stroke.on = false);\n\t            var strokeColor = R.getRGB(params.stroke);\n\t            stroke.on && params.stroke && (stroke.color = strokeColor.hex);\n\t            opacity = ((+a[\"stroke-opacity\"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1);\n\t            var width = (toFloat(params[\"stroke-width\"]) || 1) * .75;\n\t            opacity = mmin(mmax(opacity, 0), 1);\n\t            params[\"stroke-width\"] == null && (width = a[\"stroke-width\"]);\n\t            params[\"stroke-width\"] && (stroke.weight = width);\n\t            width && width < 1 && (opacity *= width) && (stroke.weight = 1);\n\t            stroke.opacity = opacity;\n\n\t            params[\"stroke-linejoin\"] && (stroke.joinstyle = params[\"stroke-linejoin\"] || \"miter\");\n\t            stroke.miterlimit = params[\"stroke-miterlimit\"] || 8;\n\t            params[\"stroke-linecap\"] && (stroke.endcap = params[\"stroke-linecap\"] == \"butt\" ? \"flat\" : params[\"stroke-linecap\"] == \"square\" ? \"square\" : \"round\");\n\t            if (\"stroke-dasharray\" in params) {\n\t                var dasharray = {\n\t                    \"-\": \"shortdash\",\n\t                    \".\": \"shortdot\",\n\t                    \"-.\": \"shortdashdot\",\n\t                    \"-..\": \"shortdashdotdot\",\n\t                    \". \": \"dot\",\n\t                    \"- \": \"dash\",\n\t                    \"--\": \"longdash\",\n\t                    \"- .\": \"dashdot\",\n\t                    \"--.\": \"longdashdot\",\n\t                    \"--..\": \"longdashdotdot\"\n\t                };\n\t                stroke.dashstyle = dasharray[has](params[\"stroke-dasharray\"]) ? dasharray[params[\"stroke-dasharray\"]] : E;\n\t            }\n\t            newstroke && node.appendChild(stroke);\n\t        }\n\t        if (res.type == \"text\") {\n\t            res.paper.canvas.style.display = E;\n\t            var span = res.paper.span,\n\t                m = 100,\n\t                fontSize = a.font && a.font.match(/\\d+(?:\\.\\d*)?(?=px)/);\n\t            s = span.style;\n\t            a.font && (s.font = a.font);\n\t            a[\"font-family\"] && (s.fontFamily = a[\"font-family\"]);\n\t            a[\"font-weight\"] && (s.fontWeight = a[\"font-weight\"]);\n\t            a[\"font-style\"] && (s.fontStyle = a[\"font-style\"]);\n\t            fontSize = toFloat(a[\"font-size\"] || fontSize && fontSize[0]) || 10;\n\t            s.fontSize = fontSize * m + \"px\";\n\t            res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, \"&#60;\").replace(/&/g, \"&#38;\").replace(/\\n/g, \"<br>\"));\n\t            var brect = span.getBoundingClientRect();\n\t            res.W = a.w = (brect.right - brect.left) / m;\n\t            res.H = a.h = (brect.bottom - brect.top) / m;\n\t            // res.paper.canvas.style.display = \"none\";\n\t            res.X = a.x;\n\t            res.Y = a.y + res.H / 2;\n\n\t            (\"x\" in params || \"y\" in params) && (res.path.v = R.format(\"m{0},{1}l{2},{1}\", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1));\n\t            var dirtyattrs = [\"x\", \"y\", \"text\", \"font\", \"font-family\", \"font-weight\", \"font-style\", \"font-size\"];\n\t            for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) {\n\t                res._.dirty = 1;\n\t                break;\n\t            }\n\n\t            // text-anchor emulation\n\t            switch (a[\"text-anchor\"]) {\n\t                case \"start\":\n\t                    res.textpath.style[\"v-text-align\"] = \"left\";\n\t                    res.bbx = res.W / 2;\n\t                break;\n\t                case \"end\":\n\t                    res.textpath.style[\"v-text-align\"] = \"right\";\n\t                    res.bbx = -res.W / 2;\n\t                break;\n\t                default:\n\t                    res.textpath.style[\"v-text-align\"] = \"center\";\n\t                    res.bbx = 0;\n\t                break;\n\t            }\n\t            res.textpath.style[\"v-text-kern\"] = true;\n\t        }\n\t        // res.paper.canvas.style.display = E;\n\t    },\n\t    addGradientFill = function (o, gradient, fill) {\n\t        o.attrs = o.attrs || {};\n\t        var attrs = o.attrs,\n\t            pow = Math.pow,\n\t            opacity,\n\t            oindex,\n\t            type = \"linear\",\n\t            fxfy = \".5 .5\";\n\t        o.attrs.gradient = gradient;\n\t        gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) {\n\t            type = \"radial\";\n\t            if (fx && fy) {\n\t                fx = toFloat(fx);\n\t                fy = toFloat(fy);\n\t                pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5);\n\t                fxfy = fx + S + fy;\n\t            }\n\t            return E;\n\t        });\n\t        gradient = gradient.split(/\\s*\\-\\s*/);\n\t        if (type == \"linear\") {\n\t            var angle = gradient.shift();\n\t            angle = -toFloat(angle);\n\t            if (isNaN(angle)) {\n\t                return null;\n\t            }\n\t        }\n\t        var dots = R._parseDots(gradient);\n\t        if (!dots) {\n\t            return null;\n\t        }\n\t        o = o.shape || o.node;\n\t        if (dots.length) {\n\t            o.removeChild(fill);\n\t            fill.on = true;\n\t            fill.method = \"none\";\n\t            fill.color = dots[0].color;\n\t            fill.color2 = dots[dots.length - 1].color;\n\t            var clrs = [];\n\t            for (var i = 0, ii = dots.length; i < ii; i++) {\n\t                dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color);\n\t            }\n\t            fill.colors = clrs.length ? clrs.join() : \"0% \" + fill.color;\n\t            if (type == \"radial\") {\n\t                fill.type = \"gradientTitle\";\n\t                fill.focus = \"100%\";\n\t                fill.focussize = \"0 0\";\n\t                fill.focusposition = fxfy;\n\t                fill.angle = 0;\n\t            } else {\n\t                // fill.rotate= true;\n\t                fill.type = \"gradient\";\n\t                fill.angle = (270 - angle) % 360;\n\t            }\n\t            o.appendChild(fill);\n\t        }\n\t        return 1;\n\t    },\n\t    Element = function (node, vml) {\n\t        this[0] = this.node = node;\n\t        node.raphael = true;\n\t        this.id = R._oid++;\n\t        node.raphaelid = this.id;\n\t        this.X = 0;\n\t        this.Y = 0;\n\t        this.attrs = {};\n\t        this.paper = vml;\n\t        this.matrix = R.matrix();\n\t        this._ = {\n\t            transform: [],\n\t            sx: 1,\n\t            sy: 1,\n\t            dx: 0,\n\t            dy: 0,\n\t            deg: 0,\n\t            dirty: 1,\n\t            dirtyT: 1\n\t        };\n\t        !vml.bottom && (vml.bottom = this);\n\t        this.prev = vml.top;\n\t        vml.top && (vml.top.next = this);\n\t        vml.top = this;\n\t        this.next = null;\n\t    };\n\t    var elproto = R.el;\n\n\t    Element.prototype = elproto;\n\t    elproto.constructor = Element;\n\t    elproto.transform = function (tstr) {\n\t        if (tstr == null) {\n\t            return this._.transform;\n\t        }\n\t        var vbs = this.paper._viewBoxShift,\n\t            vbt = vbs ? \"s\" + [vbs.scale, vbs.scale] + \"-1-1t\" + [vbs.dx, vbs.dy] : E,\n\t            oldt;\n\t        if (vbs) {\n\t            oldt = tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, this._.transform || E);\n\t        }\n\t        R._extractTransform(this, vbt + tstr);\n\t        var matrix = this.matrix.clone(),\n\t            skew = this.skew,\n\t            o = this.node,\n\t            split,\n\t            isGrad = ~Str(this.attrs.fill).indexOf(\"-\"),\n\t            isPatt = !Str(this.attrs.fill).indexOf(\"url(\");\n\t        matrix.translate(1, 1);\n\t        if (isPatt || isGrad || this.type == \"image\") {\n\t            skew.matrix = \"1 0 0 1\";\n\t            skew.offset = \"0 0\";\n\t            split = matrix.split();\n\t            if ((isGrad && split.noRotation) || !split.isSimple) {\n\t                o.style.filter = matrix.toFilter();\n\t                var bb = this.getBBox(),\n\t                    bbt = this.getBBox(1),\n\t                    dx = bb.x - bbt.x,\n\t                    dy = bb.y - bbt.y;\n\t                o.coordorigin = (dx * -zoom) + S + (dy * -zoom);\n\t                setCoords(this, 1, 1, dx, dy, 0);\n\t            } else {\n\t                o.style.filter = E;\n\t                setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate);\n\t            }\n\t        } else {\n\t            o.style.filter = E;\n\t            skew.matrix = Str(matrix);\n\t            skew.offset = matrix.offset();\n\t        }\n\t        if (oldt !== null) { // empty string value is true as well\n\t            this._.transform = oldt;\n\t            R._extractTransform(this, oldt);\n\t        }\n\t        return this;\n\t    };\n\t    elproto.rotate = function (deg, cx, cy) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        if (deg == null) {\n\t            return;\n\t        }\n\t        deg = Str(deg).split(separator);\n\t        if (deg.length - 1) {\n\t            cx = toFloat(deg[1]);\n\t            cy = toFloat(deg[2]);\n\t        }\n\t        deg = toFloat(deg[0]);\n\t        (cy == null) && (cx = cy);\n\t        if (cx == null || cy == null) {\n\t            var bbox = this.getBBox(1);\n\t            cx = bbox.x + bbox.width / 2;\n\t            cy = bbox.y + bbox.height / 2;\n\t        }\n\t        this._.dirtyT = 1;\n\t        this.transform(this._.transform.concat([[\"r\", deg, cx, cy]]));\n\t        return this;\n\t    };\n\t    elproto.translate = function (dx, dy) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        dx = Str(dx).split(separator);\n\t        if (dx.length - 1) {\n\t            dy = toFloat(dx[1]);\n\t        }\n\t        dx = toFloat(dx[0]) || 0;\n\t        dy = +dy || 0;\n\t        if (this._.bbox) {\n\t            this._.bbox.x += dx;\n\t            this._.bbox.y += dy;\n\t        }\n\t        this.transform(this._.transform.concat([[\"t\", dx, dy]]));\n\t        return this;\n\t    };\n\t    elproto.scale = function (sx, sy, cx, cy) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        sx = Str(sx).split(separator);\n\t        if (sx.length - 1) {\n\t            sy = toFloat(sx[1]);\n\t            cx = toFloat(sx[2]);\n\t            cy = toFloat(sx[3]);\n\t            isNaN(cx) && (cx = null);\n\t            isNaN(cy) && (cy = null);\n\t        }\n\t        sx = toFloat(sx[0]);\n\t        (sy == null) && (sy = sx);\n\t        (cy == null) && (cx = cy);\n\t        if (cx == null || cy == null) {\n\t            var bbox = this.getBBox(1);\n\t        }\n\t        cx = cx == null ? bbox.x + bbox.width / 2 : cx;\n\t        cy = cy == null ? bbox.y + bbox.height / 2 : cy;\n\n\t        this.transform(this._.transform.concat([[\"s\", sx, sy, cx, cy]]));\n\t        this._.dirtyT = 1;\n\t        return this;\n\t    };\n\t    elproto.hide = function () {\n\t        !this.removed && (this.node.style.display = \"none\");\n\t        return this;\n\t    };\n\t    elproto.show = function () {\n\t        !this.removed && (this.node.style.display = E);\n\t        return this;\n\t    };\n\t    // Needed to fix the vml setViewBox issues\n\t    elproto.auxGetBBox = R.el.getBBox;\n\t    elproto.getBBox = function(){\n\t      var b = this.auxGetBBox();\n\t      if (this.paper && this.paper._viewBoxShift)\n\t      {\n\t        var c = {};\n\t        var z = 1/this.paper._viewBoxShift.scale;\n\t        c.x = b.x - this.paper._viewBoxShift.dx;\n\t        c.x *= z;\n\t        c.y = b.y - this.paper._viewBoxShift.dy;\n\t        c.y *= z;\n\t        c.width  = b.width  * z;\n\t        c.height = b.height * z;\n\t        c.x2 = c.x + c.width;\n\t        c.y2 = c.y + c.height;\n\t        return c;\n\t      }\n\t      return b;\n\t    };\n\t    elproto._getBBox = function () {\n\t        if (this.removed) {\n\t            return {};\n\t        }\n\t        return {\n\t            x: this.X + (this.bbx || 0) - this.W / 2,\n\t            y: this.Y - this.H,\n\t            width: this.W,\n\t            height: this.H\n\t        };\n\t    };\n\t    elproto.remove = function () {\n\t        if (this.removed || !this.node.parentNode) {\n\t            return;\n\t        }\n\t        this.paper.__set__ && this.paper.__set__.exclude(this);\n\t        R.eve.unbind(\"raphael.*.*.\" + this.id);\n\t        R._tear(this, this.paper);\n\t        this.node.parentNode.removeChild(this.node);\n\t        this.shape && this.shape.parentNode.removeChild(this.shape);\n\t        for (var i in this) {\n\t            this[i] = typeof this[i] == \"function\" ? R._removedFactory(i) : null;\n\t        }\n\t        this.removed = true;\n\t    };\n\t    elproto.attr = function (name, value) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        if (name == null) {\n\t            var res = {};\n\t            for (var a in this.attrs) if (this.attrs[has](a)) {\n\t                res[a] = this.attrs[a];\n\t            }\n\t            res.gradient && res.fill == \"none\" && (res.fill = res.gradient) && delete res.gradient;\n\t            res.transform = this._.transform;\n\t            return res;\n\t        }\n\t        if (value == null && R.is(name, \"string\")) {\n\t            if (name == fillString && this.attrs.fill == \"none\" && this.attrs.gradient) {\n\t                return this.attrs.gradient;\n\t            }\n\t            var names = name.split(separator),\n\t                out = {};\n\t            for (var i = 0, ii = names.length; i < ii; i++) {\n\t                name = names[i];\n\t                if (name in this.attrs) {\n\t                    out[name] = this.attrs[name];\n\t                } else if (R.is(this.paper.customAttributes[name], \"function\")) {\n\t                    out[name] = this.paper.customAttributes[name].def;\n\t                } else {\n\t                    out[name] = R._availableAttrs[name];\n\t                }\n\t            }\n\t            return ii - 1 ? out : out[names[0]];\n\t        }\n\t        if (this.attrs && value == null && R.is(name, \"array\")) {\n\t            out = {};\n\t            for (i = 0, ii = name.length; i < ii; i++) {\n\t                out[name[i]] = this.attr(name[i]);\n\t            }\n\t            return out;\n\t        }\n\t        var params;\n\t        if (value != null) {\n\t            params = {};\n\t            params[name] = value;\n\t        }\n\t        value == null && R.is(name, \"object\") && (params = name);\n\t        for (var key in params) {\n\t            eve(\"raphael.attr.\" + key + \".\" + this.id, this, params[key]);\n\t        }\n\t        if (params) {\n\t            for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], \"function\")) {\n\t                var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));\n\t                this.attrs[key] = params[key];\n\t                for (var subkey in par) if (par[has](subkey)) {\n\t                    params[subkey] = par[subkey];\n\t                }\n\t            }\n\t            // this.paper.canvas.style.display = \"none\";\n\t            if (params.text && this.type == \"text\") {\n\t                this.textpath.string = params.text;\n\t            }\n\t            setFillAndStroke(this, params);\n\t            // this.paper.canvas.style.display = E;\n\t        }\n\t        return this;\n\t    };\n\t    elproto.toFront = function () {\n\t        !this.removed && this.node.parentNode.appendChild(this.node);\n\t        this.paper && this.paper.top != this && R._tofront(this, this.paper);\n\t        return this;\n\t    };\n\t    elproto.toBack = function () {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        if (this.node.parentNode.firstChild != this.node) {\n\t            this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);\n\t            R._toback(this, this.paper);\n\t        }\n\t        return this;\n\t    };\n\t    elproto.insertAfter = function (element) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        if (element.constructor == R.st.constructor) {\n\t            element = element[element.length - 1];\n\t        }\n\t        if (element.node.nextSibling) {\n\t            element.node.parentNode.insertBefore(this.node, element.node.nextSibling);\n\t        } else {\n\t            element.node.parentNode.appendChild(this.node);\n\t        }\n\t        R._insertafter(this, element, this.paper);\n\t        return this;\n\t    };\n\t    elproto.insertBefore = function (element) {\n\t        if (this.removed) {\n\t            return this;\n\t        }\n\t        if (element.constructor == R.st.constructor) {\n\t            element = element[0];\n\t        }\n\t        element.node.parentNode.insertBefore(this.node, element.node);\n\t        R._insertbefore(this, element, this.paper);\n\t        return this;\n\t    };\n\t    elproto.blur = function (size) {\n\t        var s = this.node.runtimeStyle,\n\t            f = s.filter;\n\t        f = f.replace(blurregexp, E);\n\t        if (+size !== 0) {\n\t            this.attrs.blur = size;\n\t            s.filter = f + S + ms + \".Blur(pixelradius=\" + (+size || 1.5) + \")\";\n\t            s.margin = R.format(\"-{0}px 0 0 -{0}px\", round(+size || 1.5));\n\t        } else {\n\t            s.filter = f;\n\t            s.margin = 0;\n\t            delete this.attrs.blur;\n\t        }\n\t        return this;\n\t    };\n\n\t    R._engine.path = function (pathString, vml) {\n\t        var el = createNode(\"shape\");\n\t        el.style.cssText = cssDot;\n\t        el.coordsize = zoom + S + zoom;\n\t        el.coordorigin = vml.coordorigin;\n\t        var p = new Element(el, vml),\n\t            attr = {fill: \"none\", stroke: \"#000\"};\n\t        pathString && (attr.path = pathString);\n\t        p.type = \"path\";\n\t        p.path = [];\n\t        p.Path = E;\n\t        setFillAndStroke(p, attr);\n\t        vml.canvas && vml.canvas.appendChild(el);\n\t        var skew = createNode(\"skew\");\n\t        skew.on = true;\n\t        el.appendChild(skew);\n\t        p.skew = skew;\n\t        p.transform(E);\n\t        return p;\n\t    };\n\t    R._engine.rect = function (vml, x, y, w, h, r) {\n\t        var path = R._rectPath(x, y, w, h, r),\n\t            res = vml.path(path),\n\t            a = res.attrs;\n\t        res.X = a.x = x;\n\t        res.Y = a.y = y;\n\t        res.W = a.width = w;\n\t        res.H = a.height = h;\n\t        a.r = r;\n\t        a.path = path;\n\t        res.type = \"rect\";\n\t        return res;\n\t    };\n\t    R._engine.ellipse = function (vml, x, y, rx, ry) {\n\t        var res = vml.path(),\n\t            a = res.attrs;\n\t        res.X = x - rx;\n\t        res.Y = y - ry;\n\t        res.W = rx * 2;\n\t        res.H = ry * 2;\n\t        res.type = \"ellipse\";\n\t        setFillAndStroke(res, {\n\t            cx: x,\n\t            cy: y,\n\t            rx: rx,\n\t            ry: ry\n\t        });\n\t        return res;\n\t    };\n\t    R._engine.circle = function (vml, x, y, r) {\n\t        var res = vml.path(),\n\t            a = res.attrs;\n\t        res.X = x - r;\n\t        res.Y = y - r;\n\t        res.W = res.H = r * 2;\n\t        res.type = \"circle\";\n\t        setFillAndStroke(res, {\n\t            cx: x,\n\t            cy: y,\n\t            r: r\n\t        });\n\t        return res;\n\t    };\n\t    R._engine.image = function (vml, src, x, y, w, h) {\n\t        var path = R._rectPath(x, y, w, h),\n\t            res = vml.path(path).attr({stroke: \"none\"}),\n\t            a = res.attrs,\n\t            node = res.node,\n\t            fill = node.getElementsByTagName(fillString)[0];\n\t        a.src = src;\n\t        res.X = a.x = x;\n\t        res.Y = a.y = y;\n\t        res.W = a.width = w;\n\t        res.H = a.height = h;\n\t        a.path = path;\n\t        res.type = \"image\";\n\t        fill.parentNode == node && node.removeChild(fill);\n\t        fill.rotate = true;\n\t        fill.src = src;\n\t        fill.type = \"tile\";\n\t        res._.fillpos = [x, y];\n\t        res._.fillsize = [w, h];\n\t        node.appendChild(fill);\n\t        setCoords(res, 1, 1, 0, 0, 0);\n\t        return res;\n\t    };\n\t    R._engine.text = function (vml, x, y, text) {\n\t        var el = createNode(\"shape\"),\n\t            path = createNode(\"path\"),\n\t            o = createNode(\"textpath\");\n\t        x = x || 0;\n\t        y = y || 0;\n\t        text = text || \"\";\n\t        path.v = R.format(\"m{0},{1}l{2},{1}\", round(x * zoom), round(y * zoom), round(x * zoom) + 1);\n\t        path.textpathok = true;\n\t        o.string = Str(text);\n\t        o.on = true;\n\t        el.style.cssText = cssDot;\n\t        el.coordsize = zoom + S + zoom;\n\t        el.coordorigin = \"0 0\";\n\t        var p = new Element(el, vml),\n\t            attr = {\n\t                fill: \"#000\",\n\t                stroke: \"none\",\n\t                font: R._availableAttrs.font,\n\t                text: text\n\t            };\n\t        p.shape = el;\n\t        p.path = path;\n\t        p.textpath = o;\n\t        p.type = \"text\";\n\t        p.attrs.text = Str(text);\n\t        p.attrs.x = x;\n\t        p.attrs.y = y;\n\t        p.attrs.w = 1;\n\t        p.attrs.h = 1;\n\t        setFillAndStroke(p, attr);\n\t        el.appendChild(o);\n\t        el.appendChild(path);\n\t        vml.canvas.appendChild(el);\n\t        var skew = createNode(\"skew\");\n\t        skew.on = true;\n\t        el.appendChild(skew);\n\t        p.skew = skew;\n\t        p.transform(E);\n\t        return p;\n\t    };\n\t    R._engine.setSize = function (width, height) {\n\t        var cs = this.canvas.style;\n\t        this.width = width;\n\t        this.height = height;\n\t        width == +width && (width += \"px\");\n\t        height == +height && (height += \"px\");\n\t        cs.width = width;\n\t        cs.height = height;\n\t        cs.clip = \"rect(0 \" + width + \" \" + height + \" 0)\";\n\t        if (this._viewBox) {\n\t            R._engine.setViewBox.apply(this, this._viewBox);\n\t        }\n\t        return this;\n\t    };\n\t    R._engine.setViewBox = function (x, y, w, h, fit) {\n\t        R.eve(\"raphael.setViewBox\", this, this._viewBox, [x, y, w, h, fit]);\n\t        var paperSize = this.getSize(),\n\t            width = paperSize.width,\n\t            height = paperSize.height,\n\t            H, W;\n\t        if (fit) {\n\t            H = height / h;\n\t            W = width / w;\n\t            if (w * H < width) {\n\t                x -= (width - w * H) / 2 / H;\n\t            }\n\t            if (h * W < height) {\n\t                y -= (height - h * W) / 2 / W;\n\t            }\n\t        }\n\t        this._viewBox = [x, y, w, h, !!fit];\n\t        this._viewBoxShift = {\n\t            dx: -x,\n\t            dy: -y,\n\t            scale: paperSize\n\t        };\n\t        this.forEach(function (el) {\n\t            el.transform(\"...\");\n\t        });\n\t        return this;\n\t    };\n\t    var createNode;\n\t    R._engine.initWin = function (win) {\n\t            var doc = win.document;\n\t            if (doc.styleSheets.length < 31) {\n\t                doc.createStyleSheet().addRule(\".rvml\", \"behavior:url(#default#VML)\");\n\t            } else {\n\t                // no more room, add to the existing one\n\t                // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx\n\t                doc.styleSheets[0].addRule(\".rvml\", \"behavior:url(#default#VML)\");\n\t            }\n\t            try {\n\t                !doc.namespaces.rvml && doc.namespaces.add(\"rvml\", \"urn:schemas-microsoft-com:vml\");\n\t                createNode = function (tagName) {\n\t                    return doc.createElement('<rvml:' + tagName + ' class=\"rvml\">');\n\t                };\n\t            } catch (e) {\n\t                createNode = function (tagName) {\n\t                    return doc.createElement('<' + tagName + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">');\n\t                };\n\t            }\n\t        };\n\t    R._engine.initWin(R._g.win);\n\t    R._engine.create = function () {\n\t        var con = R._getContainer.apply(0, arguments),\n\t            container = con.container,\n\t            height = con.height,\n\t            s,\n\t            width = con.width,\n\t            x = con.x,\n\t            y = con.y;\n\t        if (!container) {\n\t            throw new Error(\"VML container not found.\");\n\t        }\n\t        var res = new R._Paper,\n\t            c = res.canvas = R._g.doc.createElement(\"div\"),\n\t            cs = c.style;\n\t        x = x || 0;\n\t        y = y || 0;\n\t        width = width || 512;\n\t        height = height || 342;\n\t        res.width = width;\n\t        res.height = height;\n\t        width == +width && (width += \"px\");\n\t        height == +height && (height += \"px\");\n\t        res.coordsize = zoom * 1e3 + S + zoom * 1e3;\n\t        res.coordorigin = \"0 0\";\n\t        res.span = R._g.doc.createElement(\"span\");\n\t        res.span.style.cssText = \"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;\";\n\t        c.appendChild(res.span);\n\t        cs.cssText = R.format(\"top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden\", width, height);\n\t        if (container == 1) {\n\t            R._g.doc.body.appendChild(c);\n\t            cs.left = x + \"px\";\n\t            cs.top = y + \"px\";\n\t            cs.position = \"absolute\";\n\t        } else {\n\t            if (container.firstChild) {\n\t                container.insertBefore(c, container.firstChild);\n\t            } else {\n\t                container.appendChild(c);\n\t            }\n\t        }\n\t        res.renderfix = function () {};\n\t        return res;\n\t    };\n\t    R.prototype.clear = function () {\n\t        R.eve(\"raphael.clear\", this);\n\t        this.canvas.innerHTML = E;\n\t        this.span = R._g.doc.createElement(\"span\");\n\t        this.span.style.cssText = \"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;\";\n\t        this.canvas.appendChild(this.span);\n\t        this.bottom = this.top = null;\n\t    };\n\t    R.prototype.remove = function () {\n\t        R.eve(\"raphael.remove\", this);\n\t        this.canvas.parentNode.removeChild(this.canvas);\n\t        for (var i in this) {\n\t            this[i] = typeof this[i] == \"function\" ? R._removedFactory(i) : null;\n\t        }\n\t        return true;\n\t    };\n\n\t    var setproto = R.st;\n\t    for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {\n\t        setproto[method] = (function (methodname) {\n\t            return function () {\n\t                var arg = arguments;\n\t                return this.forEach(function (el) {\n\t                    el[methodname].apply(el, arg);\n\t                });\n\t            };\n\t        })(method);\n\t    }\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }\n/******/ ])\n});\n;","import { DEFAULT_I18N } from './constants';\n\nfunction convertToListBoxItems(items) {\n  return items.map((item) => ({\n    text: item.name,\n    value: item.value || item.name,\n    protected: item.protected,\n    default: item.default,\n  }));\n}\n\n/**\n * Format multiple lists to array of group options for listbox\n * @param branches list of branches\n * @param tags list of tags\n * @param commits list of commits\n * @returns {*[]} array of group items with header and options\n */\nexport const formatListBoxItems = (branches, tags, commits) => {\n  const listBoxItems = [];\n\n  const addToFinalResult = (items, header) => {\n    if (items && items.length > 0) {\n      listBoxItems.push({\n        text: header,\n        options: convertToListBoxItems(items),\n      });\n    }\n  };\n\n  addToFinalResult(branches, DEFAULT_I18N.branches);\n  addToFinalResult(tags, DEFAULT_I18N.tags);\n  addToFinalResult(commits, DEFAULT_I18N.commits);\n\n  return listBoxItems;\n};\n\n/**\n * Check error existence and add to final array\n * @param branches list of branches\n * @param tags list of tags\n * @param commits list of commits\n * @returns {*[]} array of error messages\n */\nexport const formatErrors = (branches, tags, commits) => {\n  const errorsList = [];\n\n  if (branches && branches.error) {\n    errorsList.push(DEFAULT_I18N.branchesErrorMessage);\n  }\n\n  if (tags && tags.error) {\n    errorsList.push(DEFAULT_I18N.tagsErrorMessage);\n  }\n\n  if (commits && commits.error) {\n    errorsList.push(DEFAULT_I18N.commitsErrorMessage);\n  }\n\n  return errorsList;\n};\n","<script>\nimport { GlBadge, GlIcon, GlCollapsibleListbox } from '@gitlab/ui';\nimport { debounce, isArray } from 'lodash';\n// eslint-disable-next-line no-restricted-imports\nimport { mapActions, mapGetters, mapState } from 'vuex';\nimport { sprintf } from '~/locale';\nimport ProtectedBadge from '~/vue_shared/components/badges/protected_badge.vue';\nimport {\n  ALL_REF_TYPES,\n  SEARCH_DEBOUNCE_MS,\n  DEFAULT_I18N,\n  REF_TYPE_BRANCHES,\n  REF_TYPE_TAGS,\n  REF_TYPE_COMMITS,\n  TAG_REF_TYPE,\n  BRANCH_REF_TYPE,\n  TAG_REF_TYPE_ICON,\n  BRANCH_REF_TYPE_ICON,\n} from '../constants';\nimport createStore from '../stores';\nimport { formatListBoxItems, formatErrors } from '../format_refs';\n\nexport default {\n  name: 'RefSelector',\n  components: {\n    GlBadge,\n    GlIcon,\n    GlCollapsibleListbox,\n    ProtectedBadge,\n  },\n  inheritAttrs: false,\n  props: {\n    disabled: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n    enabledRefTypes: {\n      type: Array,\n      required: false,\n      default: () => ALL_REF_TYPES,\n      validator: (val) =>\n        // It has to be an array\n        isArray(val) &&\n        // with at least one item\n        val.length > 0 &&\n        // and only \"REF_TYPE_BRANCHES\", \"REF_TYPE_TAGS\", and \"REF_TYPE_COMMITS\" are allowed\n        val.every((item) => ALL_REF_TYPES.includes(item)) &&\n        // and no duplicates are allowed\n        val.length === new Set(val).size,\n    },\n    value: {\n      type: String,\n      required: false,\n      default: '',\n    },\n    queryParams: {\n      type: Object,\n      required: false,\n      default: () => {},\n    },\n    projectId: {\n      type: String,\n      required: true,\n    },\n    translations: {\n      type: Object,\n      required: false,\n      default: () => ({}),\n    },\n    useSymbolicRefNames: {\n      type: Boolean,\n      required: false,\n      default: false,\n    },\n\n    /** The validation state of this component. */\n    state: {\n      type: Boolean,\n      required: false,\n      default: true,\n    },\n\n    /* Underlying form field name for scenarios where ref_selector\n     * is used as part of submitting an HTML form\n     */\n    name: {\n      type: String,\n      required: false,\n      default: '',\n    },\n    toggleButtonClass: {\n      type: [String, Object, Array],\n      required: false,\n      default: null,\n    },\n  },\n  data() {\n    return {\n      query: '',\n    };\n  },\n  computed: {\n    ...mapState({\n      matches: (state) => state.matches,\n      lastQuery: (state) => state.query,\n      selectedRef: (state) => state.selectedRef,\n      params: (state) => state.params,\n    }),\n    ...mapGetters(['isLoading', 'isQueryPossiblyASha']),\n    i18n() {\n      return {\n        ...DEFAULT_I18N,\n        ...this.translations,\n      };\n    },\n    listBoxItems() {\n      return formatListBoxItems(this.branches, this.tags, this.commits);\n    },\n    branches() {\n      return this.enabledRefTypes.includes(REF_TYPE_BRANCHES) ? this.matches.branches.list : [];\n    },\n    tags() {\n      return this.enabledRefTypes.includes(REF_TYPE_TAGS) ? this.matches.tags.list : [];\n    },\n    commits() {\n      return this.enabledRefTypes.includes(REF_TYPE_COMMITS) ? this.matches.commits.list : [];\n    },\n    extendedToggleButtonClass() {\n      const classes = [\n        {\n          '!gl-shadow-inner-1-red-500': !this.state,\n          'gl-font-monospace': Boolean(this.selectedRef),\n        },\n        'gl-mb-0',\n      ];\n\n      if (Array.isArray(this.toggleButtonClass)) {\n        classes.push(...this.toggleButtonClass);\n      } else {\n        classes.push(this.toggleButtonClass);\n      }\n\n      return classes;\n    },\n    footerSlotProps() {\n      return {\n        isLoading: this.isLoading,\n        matches: this.matches,\n        query: this.lastQuery,\n      };\n    },\n    errors() {\n      return formatErrors(this.matches.branches, this.matches.tags, this.matches.commits);\n    },\n    selectedRefForDisplay() {\n      if (this.useSymbolicRefNames && this.selectedRef) {\n        return this.selectedRef.replace(/^refs\\/(tags|heads)\\//, '');\n      }\n\n      return this.selectedRef;\n    },\n    buttonText() {\n      return this.selectedRefForDisplay || this.i18n.noRefSelected;\n    },\n    noResultsMessage() {\n      return this.lastQuery\n        ? sprintf(this.i18n.noResultsWithQuery, {\n            query: this.lastQuery,\n          })\n        : this.i18n.noResults;\n    },\n    dropdownIcon() {\n      let icon;\n\n      if (this.selectedRef.includes(`refs/${TAG_REF_TYPE}`)) {\n        icon = TAG_REF_TYPE_ICON;\n      } else if (this.selectedRef.includes(`refs/${BRANCH_REF_TYPE}`)) {\n        icon = BRANCH_REF_TYPE_ICON;\n      }\n\n      return icon;\n    },\n  },\n  watch: {\n    // Keep the Vuex store synchronized if the parent\n    // component updates the selected ref through v-model\n    value: {\n      immediate: true,\n      handler() {\n        if (this.value !== this.selectedRef) {\n          this.setSelectedRef(this.value);\n        }\n      },\n    },\n  },\n  beforeCreate() {\n    // Setting the store here instead of using\n    // the built in `store` component option because\n    // we need each new `RefSelector` instance to\n    // create a new Vuex store instance.\n    // See https://github.com/vuejs/vuex/issues/414#issue-184491718.\n    this.$store = createStore();\n  },\n  created() {\n    // This method is defined here instead of in `methods`\n    // because we need to access the .cancel() method\n    // lodash attaches to the function, which is\n    // made inaccessible by Vue.\n    this.debouncedSearch = debounce(this.search, SEARCH_DEBOUNCE_MS);\n\n    this.setProjectId(this.projectId);\n    this.setParams(this.queryParams);\n\n    this.$watch(\n      'enabledRefTypes',\n      () => {\n        this.setEnabledRefTypes(this.enabledRefTypes);\n        this.search();\n      },\n      { immediate: true },\n    );\n\n    this.$watch(\n      'useSymbolicRefNames',\n      () => this.setUseSymbolicRefNames(this.useSymbolicRefNames),\n      { immediate: true },\n    );\n  },\n  methods: {\n    ...mapActions([\n      'setEnabledRefTypes',\n      'setUseSymbolicRefNames',\n      'setParams',\n      'setProjectId',\n      'setSelectedRef',\n    ]),\n    ...mapActions({ storeSearch: 'search' }),\n    onSearchBoxInput(searchQuery = '') {\n      this.query = searchQuery?.trim();\n      this.debouncedSearch();\n    },\n    selectRef(ref) {\n      if (this.disabled) {\n        return;\n      }\n\n      this.setSelectedRef(ref);\n      this.$emit('input', this.selectedRef);\n    },\n    search() {\n      this.storeSearch(this.query);\n    },\n    totalCountText(count) {\n      return count > 999 ? this.i18n.totalCountLabel : `${count}`;\n    },\n  },\n};\n</script>\n\n<template>\n  <div>\n    <gl-collapsible-listbox\n      class=\"ref-selector gl-w-full\"\n      block\n      searchable\n      :selected=\"selectedRef\"\n      :header-text=\"i18n.dropdownHeader\"\n      :items=\"listBoxItems\"\n      :no-results-text=\"noResultsMessage\"\n      :searching=\"isLoading\"\n      :search-placeholder=\"i18n.searchPlaceholder\"\n      :toggle-class=\"extendedToggleButtonClass\"\n      :toggle-text=\"buttonText\"\n      :icon=\"dropdownIcon\"\n      :disabled=\"disabled\"\n      v-bind=\"$attrs\"\n      v-on=\"$listeners\"\n      @hidden=\"$emit('hide')\"\n      @search=\"onSearchBoxInput\"\n      @select=\"selectRef\"\n    >\n      <template #group-label=\"{ group }\">\n        {{ group.text }} <gl-badge>{{ totalCountText(group.options.length) }}</gl-badge>\n      </template>\n      <template #list-item=\"{ item }\">\n        {{ item.text }}\n        <gl-badge v-if=\"item.default\" variant=\"info\">{{ i18n.defaultLabelText }}</gl-badge>\n        <protected-badge v-if=\"item.protected\" />\n      </template>\n      <template #footer>\n        <slot name=\"footer\" v-bind=\"footerSlotProps\"></slot>\n        <div\n          v-for=\"errorMessage in errors\"\n          :key=\"errorMessage\"\n          data-testid=\"red-selector-error-list\"\n          class=\"gl-mx-4 gl-my-3 gl-flex gl-items-start gl-text-red-500\"\n        >\n          <gl-icon name=\"error\" class=\"gl-mr-2 gl-mt-2 gl-shrink-0\" />\n          <span>{{ errorMessage }}</span>\n        </div>\n      </template>\n    </gl-collapsible-listbox>\n    <input\n      v-if=\"name\"\n      data-testid=\"selected-ref-form-field\"\n      type=\"hidden\"\n      :value=\"selectedRef\"\n      :name=\"name\"\n    />\n  </div>\n</template>\n","import mod from \"-!../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ref_selector.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../node_modules/thread-loader/dist/cjs.js??ref--13-0!../../../../../node_modules/babel-loader/lib/index.js??ref--13-1!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ref_selector.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ref_selector.vue?vue&type=template&id=02d8f25e\"\nimport script from \"./ref_selector.vue?vue&type=script&lang=js\"\nexport * from \"./ref_selector.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('gl-collapsible-listbox',_vm._g(_vm._b({staticClass:\"ref-selector gl-w-full\",attrs:{\"block\":\"\",\"searchable\":\"\",\"selected\":_vm.selectedRef,\"header-text\":_vm.i18n.dropdownHeader,\"items\":_vm.listBoxItems,\"no-results-text\":_vm.noResultsMessage,\"searching\":_vm.isLoading,\"search-placeholder\":_vm.i18n.searchPlaceholder,\"toggle-class\":_vm.extendedToggleButtonClass,\"toggle-text\":_vm.buttonText,\"icon\":_vm.dropdownIcon,\"disabled\":_vm.disabled},on:{\"hidden\":function($event){return _vm.$emit('hide')},\"search\":_vm.onSearchBoxInput,\"select\":_vm.selectRef},scopedSlots:_vm._u([{key:\"group-label\",fn:function({ group }){return [_vm._v(\"\\n      \"+_vm._s(group.text)+\" \"),_c('gl-badge',[_vm._v(_vm._s(_vm.totalCountText(group.options.length)))])]}},{key:\"list-item\",fn:function({ item }){return [_vm._v(\"\\n      \"+_vm._s(item.text)+\"\\n      \"),(item.default)?_c('gl-badge',{attrs:{\"variant\":\"info\"}},[_vm._v(_vm._s(_vm.i18n.defaultLabelText))]):_vm._e(),_vm._v(\" \"),(item.protected)?_c('protected-badge'):_vm._e()]}},{key:\"footer\",fn:function(){return [_vm._t(\"footer\",null,null,_vm.footerSlotProps),_vm._v(\" \"),_vm._l((_vm.errors),function(errorMessage){return _c('div',{key:errorMessage,staticClass:\"gl-mx-4 gl-my-3 gl-flex gl-items-start gl-text-red-500\",attrs:{\"data-testid\":\"red-selector-error-list\"}},[_c('gl-icon',{staticClass:\"gl-mr-2 gl-mt-2 gl-shrink-0\",attrs:{\"name\":\"error\"}}),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(errorMessage))])],1)})]},proxy:true}],null,true)},'gl-collapsible-listbox',_vm.$attrs,false),_vm.$listeners)),_vm._v(\" \"),(_vm.name)?_c('input',{attrs:{\"data-testid\":\"selected-ref-form-field\",\"type\":\"hidden\",\"name\":_vm.name},domProps:{\"value\":_vm.selectedRef}}):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }"],"sourceRoot":""}