Repository: pubnub/paper-chat Branch: gh-pages Commit: 7e6601ddb6c0 Files: 254 Total size: 1.7 MB Directory structure: gitextract_ygpo5qtv/ ├── .gitignore ├── LICENSE ├── README.md ├── bower.json ├── bower_components/ │ ├── core-component-page/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-component-page.html │ │ ├── demo.html │ │ └── index.html │ ├── core-drawer-panel/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-drawer-panel.css │ │ ├── core-drawer-panel.html │ │ ├── demo.html │ │ ├── index.html │ │ └── metadata.html │ ├── core-focusable/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-focusable.html │ │ ├── core-focusable.js │ │ ├── demo.html │ │ └── polymer-mixin.js │ ├── core-header-panel/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-header-panel.css │ │ ├── core-header-panel.html │ │ ├── demo.html │ │ ├── index.html │ │ └── metadata.html │ ├── core-icon/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-icon.css │ │ ├── core-icon.html │ │ ├── demo.html │ │ ├── index.html │ │ └── metadata.html │ ├── core-icon-button/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-icon-button.css │ │ ├── core-icon-button.html │ │ ├── demo.html │ │ ├── index.html │ │ └── metadata.html │ ├── core-icons/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── av-icons.html │ │ ├── bower.json │ │ ├── communication-icons.html │ │ ├── core-icons.html │ │ ├── demo.html │ │ ├── device-icons.html │ │ ├── editor-icons.html │ │ ├── hardware-icons.html │ │ ├── image-icons.html │ │ ├── index.html │ │ ├── maps-icons.html │ │ ├── notification-icons.html │ │ ├── png-icons.html │ │ └── social-icons.html │ ├── core-iconset/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-iconset.html │ │ ├── demo.html │ │ └── index.html │ ├── core-iconset-svg/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-iconset-svg.html │ │ ├── demo.html │ │ ├── index.html │ │ └── svg-sample-icons.html │ ├── core-input/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-input.css │ │ ├── core-input.html │ │ ├── demo.html │ │ ├── index.html │ │ ├── metadata.html │ │ └── test/ │ │ ├── a11y.html │ │ ├── basic.html │ │ └── index.html │ ├── core-item/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-item.css │ │ ├── core-item.html │ │ ├── demo.html │ │ ├── index.html │ │ └── metadata.html │ ├── core-media-query/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-media-query.html │ │ ├── demo.html │ │ └── index.html │ ├── core-meta/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-meta.html │ │ ├── demo.html │ │ └── index.html │ ├── core-scaffold/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-scaffold.html │ │ ├── demo.html │ │ ├── index.html │ │ └── metadata.html │ ├── core-selection/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-selection.html │ │ ├── demo.html │ │ ├── index.html │ │ └── test/ │ │ ├── basic.html │ │ ├── index.html │ │ └── multi.html │ ├── core-selector/ │ │ ├── .bower.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-selector.html │ │ ├── demo.html │ │ ├── index.html │ │ ├── metadata.html │ │ └── test/ │ │ ├── activate-event.html │ │ ├── basic.html │ │ ├── content.html │ │ ├── index.html │ │ ├── multi.html │ │ ├── next-previous.html │ │ ├── selected-attr-prop.html │ │ └── template-repeat.html │ ├── core-style/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-style.html │ │ ├── demo.html │ │ ├── elements.html │ │ ├── index.html │ │ └── my-theme.html │ ├── core-toolbar/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── core-toolbar.css │ │ ├── core-toolbar.html │ │ ├── demo.html │ │ ├── index.html │ │ ├── metadata.html │ │ └── test/ │ │ ├── basic.html │ │ └── index.html │ ├── font-roboto/ │ │ ├── .bower.json │ │ └── roboto.html │ ├── paper-button/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── demo.html │ │ ├── index.html │ │ ├── metadata.html │ │ ├── paper-button-base.html │ │ ├── paper-button.html │ │ └── test/ │ │ ├── a11y.html │ │ ├── basic.html │ │ └── index.html │ ├── paper-fab/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── demo.html │ │ ├── index.html │ │ ├── metadata.html │ │ ├── paper-fab.html │ │ └── test/ │ │ ├── a11y.html │ │ ├── basic.html │ │ └── index.html │ ├── paper-input/ │ │ ├── .bower.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── bower.json │ │ ├── demo.html │ │ ├── index.html │ │ ├── metadata.html │ │ ├── paper-autogrow-textarea.html │ │ ├── paper-input-decorator.css │ │ ├── paper-input-decorator.html │ │ ├── paper-input.html │ │ └── test/ │ │ ├── a11y.html │ │ ├── autogrow.html │ │ ├── decorator.html │ │ └── index.html │ ├── paper-ripple/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── demo.html │ │ ├── index.html │ │ ├── metadata.html │ │ ├── paper-ripple.html │ │ └── test/ │ │ ├── index.html │ │ └── position.html │ ├── paper-shadow/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── demo.html │ │ ├── index.html │ │ ├── metadata.html │ │ ├── paper-shadow.css │ │ ├── paper-shadow.html │ │ └── test/ │ │ ├── basic.html │ │ └── index.html │ ├── platform/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── build.log │ │ └── platform.js │ ├── polymer/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── build.log │ │ ├── layout.html │ │ ├── polymer.html │ │ └── polymer.js │ ├── pubnub-polymer/ │ │ ├── .bower.json │ │ ├── README.md │ │ ├── bower.json │ │ ├── demo-element.html │ │ ├── demo.html │ │ ├── index.html │ │ └── pubnub-element.html │ ├── time-elements/ │ │ ├── .bower.json │ │ ├── LICENSE │ │ ├── bower.json │ │ └── time-elements.js │ └── webcomponentsjs/ │ ├── .bower.json │ ├── CustomElements.js │ ├── HTMLImports.js │ ├── README.md │ ├── ShadowDOM.js │ ├── bower.json │ ├── build.log │ ├── package.json │ ├── webcomponents-lite.js │ └── webcomponents.js ├── css/ │ └── style.css ├── index.html ├── js/ │ └── app.js ├── lite.html └── x-chat-list.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .DS_Store node_modules ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2014 PubNub Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ *Note: I decided to separate a repo for the new Polymer 1.x Paper Chat, and it is available on [github.com/pubnub/polymer-cat-chat-v1](https://github.com/pubnub/polymer-cat-chat-v1). A huge thanks to [Whyser](https://github.com/Whyser) for the Polymer 1.0 migration help!!!* *Tomomi* ![Material Design and Polymer](http://pubnub.com/blog/wp-content/uploads/2015/01/paper-chat-cover.png "Material Design and Polymer") # Paper Chat Demo A simple chat room in Material Design build with Polymer 0.5.x. This demo is written for a tutorial to show how to create a simple chat app using [PubNub][pubnub] data stream JavaScript API for [Polymer][polymer], and Polymer's Paper elements to achieve [Material Design][md] user-experiences. This is not currently compatible with the new Polymer 1.0. If you build this app by yourself, make sure to use the appropriate version of Polymer and all other components, including `pubnub-element` v3.6.7. See the [bower.json](https://github.com/pubnub/paper-chat/blob/gh-pages/bower.json) for the working versions for all dependencies. ## Live Demo [Try this on multiple browsers including mobile](http://pubnub.github.io/paper-chat/index.html) ## Tutorial [Creating a Polymer Chat App with Material Design][blog] ### Photo & Graphic Credits The flat phone image that I used to create the banner on this ReadMe and Blog is create by [Andrew Beckwith](https://dribbble.com/shots/1093397-Flat-Phones-PSD-Freebie?list=users&offset=13) I used these photos as avatars: - Bengal: Tyler T CC BY-SA 3.0 - Siamese: Karin Langner-Bahmann CC BY-SA 3.0 - Sphinx: Christopher Voelker CC-BY-3.0 - Ragdoll: Simone Johnsson CC BY-SA 2.0 - Persian: UnionMaminia CC BY-SA 3.0 - Korat: Heikkisiltala CC BY-SA 3.0 - Japanese Bobtail: ようてい CC BY-SA 3.0 - Abyssinian: Karin Langner-Bahmann CC BY-SA 3.0 - Scottish Fold: Vladimir Chubarov CC BY-SA 3.0 Othwewise CC0. Tabby is my cat, Jamie :-) Thank you <3 [polymer]: https://www.polymer-project.org [md]: http://www.google.com/design/spec/material-design/introduction.html [pubnub]: http://www.pubnub.com/docs/javascript/javascript-sdk.html [blog]: http://www.pubnub.com/blog/creating-a-polymer-chat-app-with-material-design/ --- ## Polymer 1.x Support Since Polymer 0.5x (used in this app) and the new Polymer 1.x are incompatible, I decided to create a new repo for the updated Kitteh Anonymous. However, if you wish to try, the gh-pages is available on [http://pubnub.github.io/paper-chat-v1](http://pubnub.github.io/paper-chat-v1). The repo is still in private, but I will make it avalable sometimes. And a huge thank you to [Whyser](https://github.com/Whyser), who migrated the app to Polymer 1.0 and sent me the pull request. I am so sorry that I have not got a chance to work on it. I promise I will finish it up and write the tutorial! ================================================ FILE: bower.json ================================================ { "name": "paper-chat", "version": "0.0.1", "authors": [ "Tomomi Imura " ], "description": "A simple chat demo in Material Design", "keywords": [ "polymer", "material", "design", "pubnub", "chat" ], "license": "MIT", "homepage": "pubnub.com", "private": true, "ignore": [ "**/.*", "node_modules", "bower_components", "test", "tests" ], "dependencies": { "polymer": "Polymer/polymer#0.5.2", "core-scaffold": "Polymer/core-scaffold#0.5.2", "paper-input": "Polymer/paper-input#0.5.2", "paper-fab": "Polymer/paper-fab#0.5.2", "core-item": "Polymer/core-item#0.5.2", "pubnub-element": "3.6.7", "time-elements": "0.4.0" } } ================================================ FILE: bower_components/core-component-page/.bower.json ================================================ { "name": "core-component-page", "private": true, "dependencies": { "webcomponentsjs": "Polymer/webcomponentsjs#^0.5.0", "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-component-page", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "443d8dcbcb1b203ed88c6af64c98f76e6434ba53" }, "_source": "git://github.com/Polymer/core-component-page.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-component-page" } ================================================ FILE: bower_components/core-component-page/README.md ================================================ core-component-page =================== See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-component-page) for more information. Note: this is the vulcanized version of [`core-component-page-dev`](https://github.com/Polymer/core-component-page-dev) (the source). ================================================ FILE: bower_components/core-component-page/bower.json ================================================ { "name": "core-component-page", "private": true, "dependencies": { "webcomponentsjs": "Polymer/webcomponentsjs#^0.5.0", "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-component-page/core-component-page.html ================================================ ================================================ FILE: bower_components/core-component-page/demo.html ================================================ ================================================ FILE: bower_components/core-component-page/index.html ================================================ ================================================ FILE: bower_components/core-drawer-panel/.bower.json ================================================ { "name": "core-drawer-panel", "private": true, "dependencies": { "core-selector": "Polymer/core-selector#^0.5.0", "core-media-query": "Polymer/core-media-query#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-drawer-panel", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "5fdc586af1e062530ee9aa5a22bd251cf48944a5" }, "_source": "git://github.com/Polymer/core-drawer-panel.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-drawer-panel" } ================================================ FILE: bower_components/core-drawer-panel/README.md ================================================ core-drawer-panel ================== See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-drawer-panel) for more information. ================================================ FILE: bower_components/core-drawer-panel/bower.json ================================================ { "name": "core-drawer-panel", "private": true, "dependencies": { "core-selector": "Polymer/core-selector#^0.5.0", "core-media-query": "Polymer/core-media-query#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-drawer-panel/core-drawer-panel.css ================================================ /* Copyright (c) 2014 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ :host { display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; } core-selector > #drawer { position: absolute; top: 0; left: 0; height: 100%; will-change: transform; box-sizing: border-box; -moz-box-sizing: border-box; } .transition > #drawer { transition: -webkit-transform ease-in-out 0.3s, width ease-in-out 0.3s; transition: transform ease-in-out 0.3s, width ease-in-out 0.3s; } /* right-drawer: make drawer on the right side */ .right-drawer > #drawer { left: auto; right: 0; } .right-drawer.transition > #drawer { transition: -webkit-transform ease-in-out 0.3s, width ease-in-out 0.3s; transition: transform ease-in-out 0.3s, width ease-in-out 0.3s; } polyfill-next-selector { content: ':host [drawer]'; } ::content[select="[drawer]"] > * { position: absolute; top: 0; left: 0; width: 100%; height: 100%; box-sizing: border-box; -moz-box-sizing: border-box; } core-selector > #main { position: absolute; top: 0; right: 0; bottom: 0; } .transition > #main { transition: left ease-in-out 0.3s, padding ease-in-out 0.3s; } .right-drawer > #main { left: 0; } .right-drawer.transition > #main { transition: right ease-in-out 0.3s, padding ease-in-out 0.3s; } polyfill-next-selector { content: '#main > [main]'; } ::content[select="[main]"] > * { height: 100%; } #scrim { position: absolute; top: 0; right: 0; bottom: 0; left: 0; background-color: rgba(0, 0, 0, 0.3); visibility: hidden; opacity: 0; transition: opacity ease-in-out 0.38s, visibility ease-in-out 0.38s; } /* narrow layout */ .narrow-layout > #drawer.core-selected { box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.15); } .right-drawer.narrow-layout > #drawer.core-selected { box-shadow: -2px 2px 4px rgba(0, 0, 0, 0.15); } polyfill-next-selector { content: ':host .narrow-layout > #drawer > [drawer]'; } .narrow-layout > #drawer > ::content[select="[drawer]"] > * { border: 0; } .narrow-layout > #drawer:not(.core-selected) { -webkit-transform: translateX(-100%); transform: translateX(-100%); } .right-drawer.narrow-layout > #drawer:not(.core-selected) { left: auto; -webkit-transform: translateX(100%); transform: translateX(100%); } .narrow-layout > #main { left: 0 !important; padding: 0; } .right-drawer.narrow-layout > #main { left: 0; right: 0; padding: 0; } .narrow-layout > #main:not(.core-selected) > #scrim, .dragging #scrim { visibility: visible; opacity: 1; } polyfill-next-selector { content: ':host .narrow-layout > #main > [main]'; } .narrow-layout > #main > ::content[select="[main]"] > * { margin: 0; min-height: 100%; left: 0; right: 0; box-sizing: border-box; -moz-box-sizing: border-box; } polyfill-next-selector { content: 'core-selector:not(.narrow-layout) [core-drawer-toggle]'; } core-selector:not(.narrow-layout) ::content [core-drawer-toggle] { display: none; } ================================================ FILE: bower_components/core-drawer-panel/core-drawer-panel.html ================================================ ================================================ FILE: bower_components/core-drawer-panel/demo.html ================================================ core-drawer-panel
================================================ FILE: bower_components/core-drawer-panel/index.html ================================================ ================================================ FILE: bower_components/core-drawer-panel/metadata.html ================================================ ================================================ FILE: bower_components/core-focusable/.bower.json ================================================ { "name": "core-focusable", "private": false, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-focusable", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "54fda73ce01c1e68041a3e89d2d0656a8f9f8543" }, "_source": "git://github.com/Polymer/core-focusable.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-focusable" } ================================================ FILE: bower_components/core-focusable/README.md ================================================ core-focusable ============== owner: @morethanreal See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-focusable) for more information. ================================================ FILE: bower_components/core-focusable/bower.json ================================================ { "name": "core-focusable", "private": false, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-focusable/core-focusable.html ================================================ ================================================ FILE: bower_components/core-focusable/core-focusable.js ================================================ /** * @group Polymer Mixins * * `Polymer.CoreFocusable` is a mixin for elements that the user can interact with. * Elements using this mixin will receive attributes reflecting the focus, pressed * and disabled states. * * @element Polymer.CoreFocusable * @status unstable */ Polymer.CoreFocusable = { mixinPublish: { /** * If true, the element is currently active either because the * user is touching it, or the button is a toggle * and is currently in the active state. * * @attribute active * @type boolean * @default false */ active: {value: false, reflect: true}, /** * If true, the element currently has focus due to keyboard * navigation. * * @attribute focused * @type boolean * @default false */ focused: {value: false, reflect: true}, /** * If true, the user is currently holding down the button. * * @attribute pressed * @type boolean * @default false */ pressed: {value: false, reflect: true}, /** * If true, the user cannot interact with this element. * * @attribute disabled * @type boolean * @default false */ disabled: {value: false, reflect: true}, /** * If true, the button toggles the active state with each tap. * Otherwise, the button becomes active when the user is holding * it down. * * @attribute toggle * @type boolean * @default false */ toggle: false }, mixinDelegates: { contextMenu: '_contextMenuAction', down: '_downAction', up: '_upAction', focus: '_focusAction', blur: '_blurAction' }, mixinObserve: { disabled: '_disabledChanged' }, _disabledChanged: function() { if (this.disabled) { this.style.pointerEvents = 'none'; this.removeAttribute('tabindex'); this.setAttribute('aria-disabled', ''); } else { this.style.pointerEvents = ''; this.setAttribute('tabindex', 0); this.removeAttribute('aria-disabled'); } }, _downAction: function() { this.pressed = true; if (this.toggle) { this.active = !this.active; } else { this.active = true; } }, // Pulling up the context menu for an item should focus it; but we need to // be careful about how we deal with down/up events surrounding context // menus. The up event typically does not fire until the context menu // closes: so we focus immediately. // // This fires _after_ downAction. _contextMenuAction: function(e) { // Note that upAction may fire _again_ on the actual up event. this._upAction(e); this._focusAction(); }, _upAction: function() { this.pressed = false; if (!this.toggle) { this.active = false; } }, _focusAction: function() { if (!this.pressed) { // Only render the "focused" state if the element gains focus due to // keyboard navigation. this.focused = true; } }, _blurAction: function() { this.focused = false; } } ================================================ FILE: bower_components/core-focusable/demo.html ================================================ core-focusable
button toggle disabled
================================================ FILE: bower_components/core-focusable/polymer-mixin.js ================================================ Polymer.mixin2 = function(prototype, mixin) { // adds a single mixin to prototype if (mixin.mixinPublish) { prototype.publish = prototype.publish || {}; Polymer.mixin(prototype.publish, mixin.mixinPublish); } if (mixin.mixinDelegates) { prototype.eventDelegates = prototype.eventDelegates || {}; for (var e in mixin.mixinDelegates) { if (!prototype.eventDelegates[e]) { prototype.eventDelegates[e] = mixin.mixinDelegates[e]; } } } if (mixin.mixinObserve) { prototype.observe = prototype.observe || {}; for (var o in mixin.mixinObserve) { if (!prototype.observe[o] && !prototype[o + 'Changed']) { prototype.observe[o] = mixin.mixinObserve[o]; } } } Polymer.mixin(prototype, mixin); delete prototype.mixinPublish; delete prototype.mixinDelegates; delete prototype.mixinObserve; return prototype; }; ================================================ FILE: bower_components/core-header-panel/.bower.json ================================================ { "name": "core-header-panel", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-header-panel", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "4bf5782279fd9cb1ba5c25dc69438357583e4e42" }, "_source": "git://github.com/Polymer/core-header-panel.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-header-panel" } ================================================ FILE: bower_components/core-header-panel/README.md ================================================ core-header-panel =================== See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-header-panel) for more information. ================================================ FILE: bower_components/core-header-panel/bower.json ================================================ { "name": "core-header-panel", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-header-panel/core-header-panel.css ================================================ /* Copyright (c) 2014 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ :host { display: block; position: relative; } #outerContainer { position: absolute; top: 0; right: 0; bottom: 0; left: 0; } #mainPanel { position: relative; } #mainContainer { position: relative; overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch; } #dropShadow { position: absolute; top: 0; left: 0; right: 0; height: 6px; box-shadow: inset 0px 5px 6px -3px rgba(0, 0, 0, 0.4); } #dropShadow.hidden { display: none; } /* mode: scroll */ :host([mode=scroll]) #mainContainer { overflow: visible; } :host([mode=scroll]) #outerContainer { overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch; } /* mode: cover */ :host([mode=cover]) #mainPanel { position: static; } :host([mode=cover]) #mainContainer { position: absolute; top: 0; right: 0; bottom: 0; left: 0; } :host([mode=cover]) #dropShadow { position: static; width: 100%; } ================================================ FILE: bower_components/core-header-panel/core-header-panel.html ================================================ ================================================ FILE: bower_components/core-header-panel/demo.html ================================================ core-header-panel
standard
seamed
waterfall
waterfall-tall
waterfall-tall (tallClass: medium-tall)
scroll
cover
================================================ FILE: bower_components/core-header-panel/index.html ================================================ ================================================ FILE: bower_components/core-header-panel/metadata.html ================================================ ================================================ FILE: bower_components/core-icon/.bower.json ================================================ { "name": "core-icon", "private": true, "dependencies": { "core-iconset": "Polymer/core-iconset#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-icon", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "4b6ec20167ad5c176c403ee4ca2387f73dd11532" }, "_source": "git://github.com/Polymer/core-icon.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-icon" } ================================================ FILE: bower_components/core-icon/README.md ================================================ core-icon ========= See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-icon) for more information. ================================================ FILE: bower_components/core-icon/bower.json ================================================ { "name": "core-icon", "private": true, "dependencies": { "core-iconset": "Polymer/core-iconset#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-icon/core-icon.css ================================================ /* Copyright (c) 2014 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ html /deep/ core-icon { display: inline-block; vertical-align: middle; background-repeat: no-repeat; fill: currentcolor; position: relative; height: 24px; width: 24px; } ================================================ FILE: bower_components/core-icon/core-icon.html ================================================ ================================================ FILE: bower_components/core-icon/demo.html ================================================ core-icon ================================================ FILE: bower_components/core-icon/index.html ================================================ ================================================ FILE: bower_components/core-icon/metadata.html ================================================ ================================================ FILE: bower_components/core-icon-button/.bower.json ================================================ { "name": "core-icon-button", "private": true, "dependencies": { "core-icons": "Polymer/core-icons#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-icon-button", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "427829ab8b58454987f27814921d504f64358126" }, "_source": "git://github.com/Polymer/core-icon-button.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-icon-button" } ================================================ FILE: bower_components/core-icon-button/README.md ================================================ core-icon-button ================ See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-icon-button) for more information. ================================================ FILE: bower_components/core-icon-button/bower.json ================================================ { "name": "core-icon-button", "private": true, "dependencies": { "core-icons": "Polymer/core-icons#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-icon-button/core-icon-button.css ================================================ /* Copyright (c) 2014 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE The complete set of authors may be found at http://polymer.github.io/AUTHORS The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS */ :host { display: inline-block; box-sizing: border-box; -moz-box-sizing: border-box; user-select: none; -moz-user-select: none; -webkit-user-select: none; border-radius: 2px; padding: 7px; margin: 2px; vertical-align: middle; font-size: 1rem; cursor: pointer; } :host([disabled]) { opacity: 0.6; pointer-events: none; } :host(.outline) { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); } :host(:hover:not([disabled])) { box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.1); } :host(.selected:not([disabled])) { background-color: rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.12); } :host(:active:not([disabled]), .selected:active:not([disabled])) { background-color: rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.12); } :host(.core-dark-theme.outline) { background-color: rgba(200, 200, 200, 0.05); box-shadow: 0 0 0 1px rgba(200, 200, 200, 0.1); } :host(.core-dark-theme:hover) { background-color: rgba(200, 200, 200, 0.05); box-shadow: 0 1px 0 0 rgba(200, 200, 200, 0.12), 0 0 0 1px rgba(200, 200, 200, 0.1); } :host(.core-dark-theme.selected) { background-color: rgba(220, 220, 220, 0.05); box-shadow: inset 0 1px 0 0 rgba(200, 200, 200, 0.05), 0 0 0 1px rgba(200, 200, 200, 0.12); } :host(.core-dark-theme:active, .core-dark-theme.selected:active) { background-color: rgba(200, 200, 200, 0.05); box-shadow: inset 0 1px 0 0 rgba(200, 200, 200, 0.1), 0 0 0 1px rgba(200, 200, 200, 0.12); } core-icon { pointer-events: none; } /* note: this is a polyfill aware selector */ :host ::content > :not(core-icon) { margin-left: 4px; } ================================================ FILE: bower_components/core-icon-button/core-icon-button.html ================================================ ================================================ FILE: bower_components/core-icon-button/demo.html ================================================ core-icon-button ================================================ FILE: bower_components/core-icon-button/index.html ================================================ ================================================ FILE: bower_components/core-icon-button/metadata.html ================================================ ================================================ FILE: bower_components/core-icons/.bower.json ================================================ { "name": "core-icons", "private": true, "dependencies": { "core-icon": "Polymer/core-icon#^0.5.0", "core-iconset-svg": "Polymer/core-iconset-svg#^0.5.0", "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-icons", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "d08341261f7b386fb331b1dd798fcd71727e7c85" }, "_source": "git://github.com/Polymer/core-icons.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-icons" } ================================================ FILE: bower_components/core-icons/README.md ================================================ core-icons ========= See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-icons) for more information. ================================================ FILE: bower_components/core-icons/av-icons.html ================================================ ================================================ FILE: bower_components/core-icons/bower.json ================================================ { "name": "core-icons", "private": true, "dependencies": { "core-icon": "Polymer/core-icon#^0.5.0", "core-iconset-svg": "Polymer/core-iconset-svg#^0.5.0", "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-icons/communication-icons.html ================================================ ================================================ FILE: bower_components/core-icons/core-icons.html ================================================ ================================================ FILE: bower_components/core-icons/demo.html ================================================ core-icons ================================================ FILE: bower_components/core-icons/device-icons.html ================================================ ================================================ FILE: bower_components/core-icons/editor-icons.html ================================================ ================================================ FILE: bower_components/core-icons/hardware-icons.html ================================================ ================================================ FILE: bower_components/core-icons/image-icons.html ================================================ ================================================ FILE: bower_components/core-icons/index.html ================================================ ================================================ FILE: bower_components/core-icons/maps-icons.html ================================================ ================================================ FILE: bower_components/core-icons/notification-icons.html ================================================ ================================================ FILE: bower_components/core-icons/png-icons.html ================================================ ================================================ FILE: bower_components/core-icons/social-icons.html ================================================ + ================================================ FILE: bower_components/core-iconset/.bower.json ================================================ { "name": "core-iconset", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-meta": "Polymer/core-meta#^0.5.0", "core-icon": "Polymer/core-icon#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-iconset", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "fabcd6967770984f460930ec1059b950b4126828" }, "_source": "git://github.com/Polymer/core-iconset.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-iconset" } ================================================ FILE: bower_components/core-iconset/README.md ================================================ core-iconset ============ See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-iconset) for more information. ================================================ FILE: bower_components/core-iconset/bower.json ================================================ { "name": "core-iconset", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-meta": "Polymer/core-meta#^0.5.0", "core-icon": "Polymer/core-icon#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-iconset/core-iconset.html ================================================ ================================================ FILE: bower_components/core-iconset/demo.html ================================================ core-iconset
================================================ FILE: bower_components/core-iconset/index.html ================================================ ================================================ FILE: bower_components/core-iconset-svg/.bower.json ================================================ { "name": "core-iconset-svg", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-iconset": "Polymer/core-iconset#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-iconset-svg", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "998ef1ee71f358cd0e95e6085945c0182d86c224" }, "_source": "git://github.com/Polymer/core-iconset-svg.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-iconset-svg" } ================================================ FILE: bower_components/core-iconset-svg/README.md ================================================ core-iconset-svg ========= See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-iconset-svg) for more information. ================================================ FILE: bower_components/core-iconset-svg/bower.json ================================================ { "name": "core-iconset-svg", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-iconset": "Polymer/core-iconset#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-iconset-svg/core-iconset-svg.html ================================================ ================================================ FILE: bower_components/core-iconset-svg/demo.html ================================================ core-iconset-svg ================================================ FILE: bower_components/core-iconset-svg/index.html ================================================ ================================================ FILE: bower_components/core-iconset-svg/svg-sample-icons.html ================================================ ================================================ FILE: bower_components/core-input/.bower.json ================================================ { "name": "core-input", "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.4" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-input", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "d6d72e5fc2bef134b937562e13a728c6a0241579" }, "_source": "git://github.com/Polymer/core-input.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-input" } ================================================ FILE: bower_components/core-input/README.md ================================================ core-input ========== ================================================ FILE: bower_components/core-input/bower.json ================================================ { "name": "core-input", "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.4" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-input/core-input.css ================================================ /* * @license * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ :host { display: inline-block; text-align: inherit; position: relative; width: 20em; } :host:hover { cursor: text; } input, textarea { font: inherit; color: inherit; width: 100%; margin: 0; padding: 0; background-color: transparent; border: none; outline: none; width: 100%; } textarea { resize: none; } textarea[rows=fit] { height: 100%; } ================================================ FILE: bower_components/core-input/core-input.html ================================================ ================================================ FILE: bower_components/core-input/demo.html ================================================ core-input ================================================ FILE: bower_components/core-input/index.html ================================================ ================================================ FILE: bower_components/core-input/metadata.html ================================================ ================================================ FILE: bower_components/core-input/test/a11y.html ================================================ core-input a11y tests ================================================ FILE: bower_components/core-input/test/basic.html ================================================ core-input basic tests ================================================ FILE: bower_components/core-input/test/index.html ================================================ core-input tests ================================================ FILE: bower_components/core-item/.bower.json ================================================ { "name": "core-item", "private": true, "dependencies": { "core-icon": "Polymer/core-icon#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-item", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "029c112752103e03377a0ab3d79b64e982703ddf" }, "_source": "git://github.com/Polymer/core-item.git", "_target": "~0.5.2", "_originalSource": "Polymer/core-item", "_direct": true } ================================================ FILE: bower_components/core-item/README.md ================================================ core-item ========= See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-item) for more information. ================================================ FILE: bower_components/core-item/bower.json ================================================ { "name": "core-item", "private": true, "dependencies": { "core-icon": "Polymer/core-icon#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-item/core-item.css ================================================ /* Copyright (c) 2014 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ :host { display: block; position: relative; min-height: 40px; white-space: nowrap; } :host(.font-scalable) { min-height: 2.5em; } :host(.core-selected) { font-weight: bold; } #icon { margin: 0 16px 0 4px; } :host(.font-scalable) #icon { margin: 0 1em 0 0.25em; height: 1.5em; width: 1.5em; } polyfill-next-selector { content: ':host > a'; } ::content > a { position: absolute; top: 0; right: 0; bottom: 0; left: 0; /* IE10 styling to ensure link is clickable. Cannot be completely transparent or minifiers change it to `transparent` which does not work. */ background-color: rgba(0, 0, 0, 0.000001); } ================================================ FILE: bower_components/core-item/core-item.html ================================================ ================================================ FILE: bower_components/core-item/demo.html ================================================ core-item

items with icon and label:

items with label only:

links (via <a>):

items sized with CSS:

custom item:

John Doe
123 A Street, San Francisco, CA
================================================ FILE: bower_components/core-item/index.html ================================================ ================================================ FILE: bower_components/core-item/metadata.html ================================================ ================================================ FILE: bower_components/core-media-query/.bower.json ================================================ { "name": "core-media-query", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-media-query", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "9baf59df5219ea3961552e9eaef468ea79b9c75e" }, "_source": "git://github.com/Polymer/core-media-query.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-media-query" } ================================================ FILE: bower_components/core-media-query/README.md ================================================ core-media-query ================ See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-media-query) for more information. ================================================ FILE: bower_components/core-media-query/bower.json ================================================ { "name": "core-media-query", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-media-query/core-media-query.html ================================================ ================================================ FILE: bower_components/core-media-query/demo.html ================================================ Polymer match media
  Log of 'mediachange' events on document, from polymer-match-media:
  
================================================ FILE: bower_components/core-media-query/index.html ================================================ ================================================ FILE: bower_components/core-meta/.bower.json ================================================ { "name": "core-meta", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-meta", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "d16e6c42ed1a4a2b3ada1d978859c85bdcedb79f" }, "_source": "git://github.com/Polymer/core-meta.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-meta" } ================================================ FILE: bower_components/core-meta/README.md ================================================ core-meta ========= See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-meta) for more information. ================================================ FILE: bower_components/core-meta/bower.json ================================================ { "name": "core-meta", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-meta/core-meta.html ================================================ ================================================ FILE: bower_components/core-meta/demo.html ================================================ core-meta

meta-data

meta-data (type: fruit)

================================================ FILE: bower_components/core-meta/index.html ================================================ ================================================ FILE: bower_components/core-scaffold/.bower.json ================================================ { "name": "core-scaffold", "private": true, "dependencies": { "core-drawer-panel": "Polymer/core-drawer-panel#^0.5.0", "core-header-panel": "Polymer/core-header-panel#^0.5.0", "core-icon-button": "Polymer/core-icon-button#^0.5.0", "core-toolbar": "Polymer/core-toolbar#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-scaffold", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "651a46880634b5df5394424a66705b47a717e232" }, "_source": "git://github.com/Polymer/core-scaffold.git", "_target": "~0.5.2", "_originalSource": "Polymer/core-scaffold", "_direct": true } ================================================ FILE: bower_components/core-scaffold/README.md ================================================ core-scaffold ============= See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-scaffold) for more information. ================================================ FILE: bower_components/core-scaffold/bower.json ================================================ { "name": "core-scaffold", "private": true, "dependencies": { "core-drawer-panel": "Polymer/core-drawer-panel#^0.5.0", "core-header-panel": "Polymer/core-header-panel#^0.5.0", "core-icon-button": "Polymer/core-icon-button#^0.5.0", "core-toolbar": "Polymer/core-toolbar#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-scaffold/core-scaffold.html ================================================ ================================================ FILE: bower_components/core-scaffold/demo.html ================================================ core-scaffold Application
Title
Content goes here...
================================================ FILE: bower_components/core-scaffold/index.html ================================================ ================================================ FILE: bower_components/core-scaffold/metadata.html ================================================ ================================================ FILE: bower_components/core-selection/.bower.json ================================================ { "name": "core-selection", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-selection", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "26eeb0c0098cfcf4e57fbc10c6e4d0c9279d7510" }, "_source": "git://github.com/Polymer/core-selection.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-selection" } ================================================ FILE: bower_components/core-selection/README.md ================================================ core-selection ============== See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-selection) for more information. ================================================ FILE: bower_components/core-selection/bower.json ================================================ { "name": "core-selection", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-selection/core-selection.html ================================================ ================================================ FILE: bower_components/core-selection/demo.html ================================================ Selection
  • Red
  • Green
  • Blue
  • ================================================ FILE: bower_components/core-selection/index.html ================================================ ================================================ FILE: bower_components/core-selection/test/basic.html ================================================ core-selection-basic ================================================ FILE: bower_components/core-selection/test/index.html ================================================ Tests ================================================ FILE: bower_components/core-selection/test/multi.html ================================================ core-selection-multi ================================================ FILE: bower_components/core-selector/.bower.json ================================================ { "name": "core-selector", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-selection": "Polymer/core-selection#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.4.2" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-selector", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "abe95a14ffb805fcacbd2369c937a3b16cac734d" }, "_source": "git://github.com/Polymer/core-selector.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-selector" } ================================================ FILE: bower_components/core-selector/.gitignore ================================================ /node_modules/ .DS_Store ================================================ FILE: bower_components/core-selector/README.md ================================================ core-selector ============== See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-selector) for more information. ================================================ FILE: bower_components/core-selector/bower.json ================================================ { "name": "core-selector", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-selection": "Polymer/core-selection#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.4.2" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-selector/core-selector.html ================================================ ================================================ FILE: bower_components/core-selector/demo.html ================================================ Selector ================================================ FILE: bower_components/core-selector/index.html ================================================ ================================================ FILE: bower_components/core-selector/metadata.html ================================================ ================================================ FILE: bower_components/core-selector/test/activate-event.html ================================================ core-selector-activate-event
    Item 1
    Item 2
    Item 3
    Item 4
    Item 5
    ================================================ FILE: bower_components/core-selector/test/basic.html ================================================ core-selector-basic
    Item 1
    Item 2
    Item 3
    Item 4
    Item 5


    Item 1
    Item 2
    Item 3
    Item 4
    Item 5
    ================================================ FILE: bower_components/core-selector/test/content.html ================================================ core-selector-content
    item0
    item1
    item2
    item3
    ================================================ FILE: bower_components/core-selector/test/index.html ================================================ Tests ================================================ FILE: bower_components/core-selector/test/multi.html ================================================ core-selector-multi
    Item 1
    Item 2
    Item 3
    Item 4
    Item 5
    ================================================ FILE: bower_components/core-selector/test/next-previous.html ================================================ core-selector-next-previous-wrap
    Item 1
    Item 2
    Item 3
    ================================================ FILE: bower_components/core-selector/test/selected-attr-prop.html ================================================ core-selector-selected-attr-prop
    Item 1
    Item 2
    Item 3
    Item 4
    Item 5
    ================================================ FILE: bower_components/core-selector/test/template-repeat.html ================================================ core-selector-template-repeat ================================================ FILE: bower_components/core-style/.bower.json ================================================ { "name": "core-style", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-style", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "bc692e4d4670de5378893af9778b2de93245d640" }, "_source": "git://github.com/Polymer/core-style.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-style" } ================================================ FILE: bower_components/core-style/README.md ================================================ core-style ========== See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-style) for more information. ================================================ FILE: bower_components/core-style/bower.json ================================================ { "name": "core-style", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-style/core-style.html ================================================ ================================================ FILE: bower_components/core-style/demo.html ================================================ core-style ================================================ FILE: bower_components/core-style/elements.html ================================================ :host { height: 54px; font-size: 1.3rem; background-color: steelblue; color: white; } polyfill-next-selector { content: ':host > *'; } ::content > * { margin: 8px; } :host { display: inline-block; height: 200px; width: calc({{ 100 / g.columns }}% - 16px); font-size: 50px; background: gray; margin: 8px; } ================================================ FILE: bower_components/core-style/index.html ================================================ ================================================ FILE: bower_components/core-style/my-theme.html ================================================ body { font-family: sans-serif; } section { overflow: auto; } button { border: 1px solid {{g.theme.colorOne | cycle(-50)}}; border-radius: 4px; background-color: {{g.theme.colorOne}}; color: {{g.theme.colorTwo}}; } button:active { border: 1px solid {{g.theme.colorTwo | cycle(50)}}; border-radius: 4px; background-color: {{g.theme.colorTwo}}; color: {{g.theme.colorOne}}; } :host { border-bottom: 8px solid {{g.theme.colorOne}}; color: {{g.theme.colorOne | cycle(100)}}; background-color: {{g.theme.colorTwo}}; } :host { box-sizing: border-box; background-color: {{g.theme.colorOne}}; border: 8px solid {{g.theme.colorOne | cycle(50)}}; color: {{g.theme.colorOne | cycle(-100)}}; } :host(:nth-of-type(2n + 1)) { background-color: {{g.theme.colorTwo}}; border: 8px solid {{g.theme.colorTwo | cycle(-50)}}; color: {{g.theme.colorTwo | cycle(100)}} } ================================================ FILE: bower_components/core-toolbar/.bower.json ================================================ { "name": "core-toolbar", "private": true, "dependencies": { "core-icon-button": "Polymer/core-icon-button#^0.5.0", "core-media-query": "Polymer/core-media-query#^0.5.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/core-toolbar", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "f9641e8d04900ce39538b22215d916fb777ab397" }, "_source": "git://github.com/Polymer/core-toolbar.git", "_target": "^0.5.0", "_originalSource": "Polymer/core-toolbar" } ================================================ FILE: bower_components/core-toolbar/README.md ================================================ core-toolbar ============ See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-toolbar) for more information. ================================================ FILE: bower_components/core-toolbar/bower.json ================================================ { "name": "core-toolbar", "private": true, "dependencies": { "core-icon-button": "Polymer/core-icon-button#^0.5.0", "core-media-query": "Polymer/core-media-query#^0.5.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/core-toolbar/core-toolbar.css ================================================ /* Copyright (c) 2014 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ :host { /* technical */ display: block; position: relative; box-sizing: border-box; -moz-box-sizing: border-box; /* size */ height: 64px; /* typography */ font-size: 1.3em; /* background */ background-color: #CFD8DC; } :host(.animate) { /* transition */ transition: height 0.18s ease-in; } :host(.medium-tall) { height: 128px; } :host(.tall) { height: 192px; } .toolbar-tools { position: relative; height: 64px; padding: 0 8px; pointer-events: none; } /* narrow layout */ :host(.core-narrow), :host-context(.core-narrow) { height: 56px; } polyfill-next-selector { content: ':host.core-narrow.medium-tall, .core-narrow :host.medium-tall'; } :host(.core-narrow.medium-tall), :host-context(.core-narrow):host(.medium-tall) { height: 112px; } polyfill-next-selector { content: ':host.core-narrow.tall, .core-narrow :host.tall'; } :host(.core-narrow.tall), :host-context(.core-narrow):host(.tall) { height: 168px; } polyfill-next-selector { content: ':host.core-narrow .toolbar-tools, .core-narrow :host .toolbar-tools'; } :host(.core-narrow) .toolbar-tools, :host-context(.core-narrow) .toolbar-tools { height: 56px; padding: 0; } /* middle bar */ #middleBar { position: absolute; top: 0; right: 0; left: 0; } :host(.tall, .medium-tall) #middleBar { -webkit-transform: translateY(100%); transform: translateY(100%); } /* bottom bar */ #bottomBar { position: absolute; right: 0; bottom: 0; left: 0; } /* make elements (e.g. buttons) respond to mouse/touch events */ polyfill-next-selector { content: '.toolbar-tools > *:not([disabled])'; } ::content > *:not([disabled]) { pointer-events: auto; } /* elements spacing */ polyfill-next-selector { content: '.toolbar-tools > *'; } ::content > * { margin: 0 8px; } /* misc helpers */ polyfill-next-selector { content: '.toolbar-tools > .fit'; } ::content > .fit { position: absolute; top: auto; right: 0; bottom: 0; left: 0; width: auto; margin: 0; } polyfill-next-selector { content: ':host .indent'; } ::content > .indent { margin-left: 60px; } ================================================ FILE: bower_components/core-toolbar/core-toolbar.html ================================================ ================================================ FILE: bower_components/core-toolbar/demo.html ================================================ core-toolbar Toolbar
    Toolbar: dark-theme
    Toolbar: tall
    Toolbar: tall with elements pin to the bottom
    Toolbar: medium-tall with label aligns to the bottom
    label aligns to the middle
    some stuffs align to the bottom

    element (e.g. progress) fits at the bottom of the toolbar
    ================================================ FILE: bower_components/core-toolbar/index.html ================================================ ================================================ FILE: bower_components/core-toolbar/metadata.html ================================================ ================================================ FILE: bower_components/core-toolbar/test/basic.html ================================================ core-range-basic ================================================ FILE: bower_components/core-toolbar/test/index.html ================================================ Tests ================================================ FILE: bower_components/font-roboto/.bower.json ================================================ { "name": "font-roboto", "homepage": "https://github.com/Polymer/font-roboto", "version": "0.5.2", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "868680d1e886091e9bc2539659ef6626a8cee5e8" }, "_source": "git://github.com/Polymer/font-roboto.git", "_target": "^0.5.0", "_originalSource": "Polymer/font-roboto" } ================================================ FILE: bower_components/font-roboto/roboto.html ================================================ ================================================ FILE: bower_components/paper-button/.bower.json ================================================ { "name": "paper-button", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-focusable": "Polymer/core-focusable#^0.5.0", "core-icon": "Polymer/core-icon#^0.5.0", "paper-ripple": "Polymer/paper-ripple#^0.5.0", "paper-shadow": "Polymer/paper-shadow#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.4" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/paper-button", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "8fc1b68fcf590bc867434ad0683b2971ecd5fe53" }, "_source": "git://github.com/Polymer/paper-button.git", "_target": "^0.5.0", "_originalSource": "Polymer/paper-button" } ================================================ FILE: bower_components/paper-button/README.md ================================================ paper-button =================== See the [component page](http://www.polymer-project.org/docs/elements/paper-elements.html#paper-button) for more information. ================================================ FILE: bower_components/paper-button/bower.json ================================================ { "name": "paper-button", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-focusable": "Polymer/core-focusable#^0.5.0", "core-icon": "Polymer/core-icon#^0.5.0", "paper-ripple": "Polymer/paper-ripple#^0.5.0", "paper-shadow": "Polymer/paper-shadow#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.4" }, "version": "0.5.2" } ================================================ FILE: bower_components/paper-button/demo.html ================================================ paper-button
    Flat buttons
    button colored disabled noink

    Raised buttons
    button colored disabled noink
    Custom button content
    ok cancel
    link
    Styling options
    hover custom ripple
    ================================================ FILE: bower_components/paper-button/index.html ================================================ ================================================ FILE: bower_components/paper-button/metadata.html ================================================ ================================================ FILE: bower_components/paper-button/paper-button-base.html ================================================ ================================================ FILE: bower_components/paper-button/paper-button.html ================================================ ================================================ FILE: bower_components/paper-button/test/a11y.html ================================================ paper-button a11y tests button ================================================ FILE: bower_components/paper-button/test/basic.html ================================================ paper-button basic tests button ================================================ FILE: bower_components/paper-button/test/index.html ================================================ paper-button tests ================================================ FILE: bower_components/paper-fab/.bower.json ================================================ { "name": "paper-fab", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-icon": "Polymer/core-icon#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0", "paper-button": "Polymer/paper-button#^0.5.0", "paper-ripple": "Polymer/paper-ripple#^0.5.0", "paper-shadow": "Polymer/paper-shadow#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.4" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/paper-fab", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "3556bba36845ab17a4cd60e5d7b08ef5ea482ad0" }, "_source": "git://github.com/Polymer/paper-fab.git", "_target": "~0.5.2", "_originalSource": "Polymer/paper-fab", "_direct": true } ================================================ FILE: bower_components/paper-fab/README.md ================================================ paper-fab =================== See the [component page](http://www.polymer-project.org/docs/elements/paper-elements.html#paper-fab) for more information. ================================================ FILE: bower_components/paper-fab/bower.json ================================================ { "name": "paper-fab", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-icon": "Polymer/core-icon#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0", "paper-button": "Polymer/paper-button#^0.5.0", "paper-ripple": "Polymer/paper-ripple#^0.5.0", "paper-shadow": "Polymer/paper-shadow#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.4" }, "version": "0.5.2" } ================================================ FILE: bower_components/paper-fab/demo.html ================================================ paper-fab
    Regular
    Mini
    ================================================ FILE: bower_components/paper-fab/index.html ================================================ ================================================ FILE: bower_components/paper-fab/metadata.html ================================================ ================================================ FILE: bower_components/paper-fab/paper-fab.html ================================================ ================================================ FILE: bower_components/paper-fab/test/a11y.html ================================================ paper-fab a11y tests ================================================ FILE: bower_components/paper-fab/test/basic.html ================================================ paper-fab basic tests
    ================================================ FILE: bower_components/paper-fab/test/index.html ================================================ paper-fab tests ================================================ FILE: bower_components/paper-input/.bower.json ================================================ { "name": "paper-input", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-icon": "Polymer/core-icon#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0", "core-input": "Polymer/core-input#^0.5.0", "core-style": "Polymer/core-style#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.0.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/paper-input", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "8739c6e94d7c35c5c5e9509986c5f90c5f177ce4" }, "_source": "git://github.com/Polymer/paper-input.git", "_target": "~0.5.2", "_originalSource": "Polymer/paper-input", "_direct": true } ================================================ FILE: bower_components/paper-input/.gitignore ================================================ vulcanized.html ================================================ FILE: bower_components/paper-input/README.md ================================================ paper-input =================== See the [component page](http://www.polymer-project.org/docs/elements/paper-elements.html#paper-input) for more information. ================================================ FILE: bower_components/paper-input/bower.json ================================================ { "name": "paper-input", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0", "core-icon": "Polymer/core-icon#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0", "core-input": "Polymer/core-input#^0.5.0", "core-style": "Polymer/core-style#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.0.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/paper-input/demo.html ================================================ paper-input
    Standalone


    Decorator




    Validation
    Custom styling


    ================================================ FILE: bower_components/paper-input/index.html ================================================ ================================================ FILE: bower_components/paper-input/metadata.html ================================================ ================================================ FILE: bower_components/paper-input/paper-autogrow-textarea.html ================================================ ================================================ FILE: bower_components/paper-input/paper-input-decorator.css ================================================ /* * @license * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ :host { display: inline-block; outline: none; text-align: inherit; padding: 0.75em 0; } polyfill-next-selector { content: '.input-body > :not(.label)'; } ::content > *, ::content > input[is="core-input"] { padding: 0; margin: 0.5em 0 0.25em; width: 100%; } polyfill-next-selector { content: 'input, textarea'; } ::content input, ::content input[is=core-input], ::content textarea { font: inherit; color: inherit; background-color: transparent; border: none; outline: none; } polyfill-next-selector { content: ':invalid'; } ::content input:invalid, ::content textarea:invalid { box-shadow: none; } polyfill-next-selector { content: 'textarea'; } ::content textarea { resize: none; } [invisible] { visibility: hidden; } [animated] { visibility: visible !important; -webkit-transition: -webkit-transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .floated-label { font-size: 0.75em; background: transparent; white-space: nowrap; } .mirror-text { padding: 0.5em 0 0.25em; max-width: 100%; white-space: nowrap; } :host([multiline]) .mirror-text { white-space: pre-wrap; word-wrap: break-word; } .label { padding: 0.5em 0 0.25em; background: transparent; pointer-events: none; } .label-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: inline-block; max-width: 100%; -moz-transform-origin: 0% 0%; -webkit-transform-origin: 0% 0%; transform-origin: 0% 0%; } .underline { height: 0px; overflow: visible; } :host([disabled]) .underline { border-bottom: 1px dashed #757575; } .unfocused-underline { height: 1px; } .focused-underline { height: 2px; -webkit-transform: none; transform: none; } .focused-underline[invisible] { -webkit-transform: scale3d(0,1,1); transform: scale3d(0,1,1); } .error-text { font-size: 0.75em; padding: 0.5em 0; } .error-icon { height: 20px; width: 20px; } ================================================ FILE: bower_components/paper-input/paper-input-decorator.html ================================================ .label-text, .error { color: {{g.paperInput.labelColor}}; } ::-webkit-input-placeholder { color: {{g.paperInput.labelColor}}; } ::-moz-placeholder { color: {{g.paperInput.labelColor}}; } :-ms-input-placeholder { color: {{g.paperInput.labelColor}}; } .unfocused-underline { background-color: {{g.paperInput.labelColor}}; } :host([focused]) .floated-label .label-text { color: {{g.paperInput.focusedColor}}; } .focused-underline { background-color: {{g.paperInput.focusedColor}}; } :host(.invalid) .floated-label .label-text, .error { color: {{g.paperInput.invalidColor}}; } :host(.invalid) .unfocused-underline, :host(.invalid) .focused-underline { background-color: {{g.paperInput.invalidColor}}; } ================================================ FILE: bower_components/paper-input/paper-input.html ================================================ ================================================ FILE: bower_components/paper-input/test/a11y.html ================================================ paper-input a11y tests
    ================================================ FILE: bower_components/paper-input/test/autogrow.html ================================================ paper-autogrow-textarea ================================================ FILE: bower_components/paper-input/test/decorator.html ================================================ paper-input-decorator tests



    ================================================ FILE: bower_components/paper-input/test/index.html ================================================ Tests ================================================ FILE: bower_components/paper-ripple/.bower.json ================================================ { "name": "paper-ripple", "private": true, "dependencies": { "core-icon": "Polymer/core-icon#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0", "font-roboto": "Polymer/font-roboto#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.0.0" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/paper-ripple", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "0f2d08a81d6ec91924772b9b990937c6f1da58b4" }, "_source": "git://github.com/Polymer/paper-ripple.git", "_target": "^0.5.0", "_originalSource": "Polymer/paper-ripple" } ================================================ FILE: bower_components/paper-ripple/README.md ================================================ paper-ripple ============ See the [component page](http://www.polymer-project.org/docs/elements/paper-elements.html#paper-ripple) for more information. ================================================ FILE: bower_components/paper-ripple/bower.json ================================================ { "name": "paper-ripple", "private": true, "dependencies": { "core-icon": "Polymer/core-icon#^0.5.0", "core-icons": "Polymer/core-icons#^0.5.0", "font-roboto": "Polymer/font-roboto#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.0.0" }, "version": "0.5.2" } ================================================ FILE: bower_components/paper-ripple/demo.html ================================================ paper-ripple
    SUBMIT
    CANCEL
    COMPOSE
    OK
    +1
    +1
    +1
    Permission

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
    ACCEPT
    DECLINE
    ================================================ FILE: bower_components/paper-ripple/index.html ================================================ ================================================ FILE: bower_components/paper-ripple/metadata.html ================================================ ================================================ FILE: bower_components/paper-ripple/paper-ripple.html ================================================ ================================================ FILE: bower_components/paper-ripple/test/index.html ================================================ Tests ================================================ FILE: bower_components/paper-ripple/test/position.html ================================================ paper-ripple position tests
    tap here
    tap here
    ================================================ FILE: bower_components/paper-shadow/.bower.json ================================================ { "name": "paper-shadow", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.4" }, "version": "0.5.2", "homepage": "https://github.com/Polymer/paper-shadow", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "93d17c572223383944db8ac5c117d492add4651c" }, "_source": "git://github.com/Polymer/paper-shadow.git", "_target": "^0.5.0", "_originalSource": "Polymer/paper-shadow" } ================================================ FILE: bower_components/paper-shadow/README.md ================================================ paper-shadow ============ See the [component page](http://polymer-project.org/docs/elements/paper-elements.html#paper-shadow) for more information. ================================================ FILE: bower_components/paper-shadow/bower.json ================================================ { "name": "paper-shadow", "private": true, "dependencies": { "polymer": "Polymer/polymer#^0.5.0" }, "devDependencies": { "web-component-tester": "Polymer/web-component-tester#^1.1.4" }, "version": "0.5.2" } ================================================ FILE: bower_components/paper-shadow/demo.html ================================================ paper-shadow ================================================ FILE: bower_components/paper-shadow/index.html ================================================ ================================================ FILE: bower_components/paper-shadow/metadata.html ================================================ ================================================ FILE: bower_components/paper-shadow/paper-shadow.css ================================================ /* * @license * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ html /deep/ paper-shadow, html /deep/ paper-animated-shadow { display: block; position: relative; } html /deep/ paper-shadow::shadow #shadow-bottom, html /deep/ paper-shadow::shadow #shadow-top { border-radius: inherit; pointer-events: none; } html /deep/ paper-shadow::shadow #shadow-bottom[animated], html /deep/ paper-shadow::shadow #shadow-top[animated] { transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); } html /deep/ .paper-shadow-top-z-1 { box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.16); } html /deep/ .paper-shadow-bottom-z-1 { box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); } html /deep/ .paper-shadow-top-z-2 { box-shadow: 0 6px 20px 0 rgba(0, 0, 0, 0.19); } html /deep/ .paper-shadow-bottom-z-2 { box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2); } html /deep/ .paper-shadow-top-z-3 { box-shadow: 0 17px 50px 0 rgba(0, 0, 0, 0.19); } html /deep/ .paper-shadow-bottom-z-3 { box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24); } html /deep/ .paper-shadow-top-z-4 { box-shadow: 0 25px 55px 0 rgba(0, 0, 0, 0.21); } html /deep/ .paper-shadow-bottom-z-4 { box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22); } html /deep/ .paper-shadow-top-z-5 { box-shadow: 0 40px 77px 0 rgba(0, 0, 0, 0.22); } html /deep/ .paper-shadow-bottom-z-5 { box-shadow: 0 27px 24px 0 rgba(0, 0, 0, 0.2); } ================================================ FILE: bower_components/paper-shadow/paper-shadow.html ================================================ ================================================ FILE: bower_components/paper-shadow/test/basic.html ================================================ paper-shadow basic tests
    hi!
    ================================================ FILE: bower_components/paper-shadow/test/index.html ================================================ paper-shadow tests ================================================ FILE: bower_components/platform/.bower.json ================================================ { "name": "platform", "main": "platform.js", "homepage": "https://github.com/Polymer/platform", "authors": [ "The Polymer Authors" ], "description": "Integrate platform polyfills: load, build, test", "keywords": [ "polymer", "web", "components" ], "license": "BSD", "private": true, "version": "0.4.2", "_release": "0.4.2", "_resolution": { "type": "version", "tag": "0.4.2", "commit": "a2c58864021992690e6ee9ba170fbfa87af5bc9c" }, "_source": "git://github.com/Polymer/platform.git", "_target": "*", "_originalSource": "Polymer/platform" } ================================================ FILE: bower_components/platform/README.md ================================================ Platform ======== Aggregated polyfills the Polymer platform. [![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/platform/README)](https://github.com/igrigorik/ga-beacon) ================================================ FILE: bower_components/platform/bower.json ================================================ { "name": "platform", "main": "platform.js", "homepage": "https://github.com/Polymer/platform", "authors": [ "The Polymer Authors" ], "description": "Integrate platform polyfills: load, build, test", "keywords": [ "polymer", "web", "components" ], "license": "BSD", "private": true } ================================================ FILE: bower_components/platform/build.log ================================================ BUILD LOG --------- Build Time: 2014-10-02T15:20:01 NODEJS INFORMATION ================== nodejs: v0.10.32 chai: 1.9.1 grunt: 0.4.4 grunt-audit: 0.0.3 grunt-concat-sourcemap: 0.4.1 grunt-contrib-concat: 0.4.0 grunt-contrib-uglify: 0.5.0 grunt-contrib-yuidoc: 0.5.2 grunt-karma: 0.8.3 karma: 0.12.14 karma-crbot-reporter: 0.0.4 karma-firefox-launcher: 0.1.3 karma-ie-launcher: 0.1.5 karma-mocha: 0.1.4 karma-safari-launcher: 0.1.1 karma-script-launcher: 0.1.0 mocha: 1.20.1 Platform: 0.4.2 REPO REVISIONS ============== WeakMap: 027f63a0b3ad8dfd26754b7943aacadee50559b7 observe-js: b17a7aa27e4ed044ad503747e6d5a0011fb8d149 ShadowDOM: 9472cf7a992f8c903e9db4235bc7da5d2d9640fb URL: cf5d82e444d2a029834365a8b9d185fd792227f0 MutationObservers: a8aa7f9cc35c3ebef152be42f87ec2677a87f55e HTMLImports: 8d4f5ec4d6130c9035a5a4337c1a86f90e1b992d CustomElements: efdbbcb5a4ce27cd2c2b53312b15ba455554ffa8 BUILD HASHES ============ build/platform.js: 448870d9303bfd7d1cfff36b6702be0714b9c4f2 ================================================ FILE: bower_components/platform/platform.js ================================================ /** * @license * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ // @version: 0.4.2 window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f1&&console.log("Warning: platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];return d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0}),this},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){var b=a[this.name];if(!b)return!1;var c=b[0]===a;return b[0]=b[1]=void 0,c},has:function(a){var b=a[this.name];return b?b[0]===a:!1}},window.WeakMap=c}(),Platform.flags.shadow?(!function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function c(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if("undefined"!=typeof navigator&&navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function d(a){return+a===a>>>0&&""!==a}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:R(a)&&R(b)?!0:a!==a&&b!==b}function h(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function i(){}function j(a){function b(){if(!(m>=a.length)){var b=a[m+1];return"inSingleQuote"==n&&"'"==b||"inDoubleQuote"==n&&'"'==b?(m++,d=b,o.append(),!0):void 0}}for(var c,d,e,f,g,j,k,l=[],m=-1,n="beforePath",o={push:function(){void 0!==e&&(l.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};n;)if(m++,c=a[m],"\\"!=c||!b(n)){if(f=h(c),k=W[n],g=k[f]||k["else"]||"error","error"==g)return;if(n=g[0],j=o[g[1]]||i,d=void 0===g[2]?c:g[2],j(),"afterPath"===n)return l}}function k(a){return V.test(a)}function l(a,b){if(b!==X)throw Error("Use Path.get to retrieve path objects");for(var c=0;cc&&b.check_();)c++;return O&&(a.dirtyCheckCycleCount=c),c>0}function p(a){for(var b in a)return!1;return!0}function q(a){return p(a.added)&&p(a.removed)&&p(a.changed)}function r(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function s(){if(!ab.length)return!1;for(var a=0;a0)){for(var a=0;ab||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function L(a,b,c,d){for(var e=H(b,c,d),f=!1,g=0,h=0;h=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.indexi.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.indexh)continue;L(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function N(a,b){var c=[];return M(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(J(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var O=a.testingExposeCycleCount,P=b(),Q=c(),R=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},S="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},T="[$_a-zA-Z]",U="[$_a-zA-Z0-9]",V=new RegExp("^"+T+"+"+U+"*$"),W={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},X={},Y={};l.get=m,l.prototype=S({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;bd&&b);O&&(a.dirtyCheckCycleCount=d),lb=!1}},kb&&(a.Platform.clearObservers=function(){jb=[]}),A.prototype=S({__proto__:x.prototype,arrayObserve:!1,connect_:function(){P?this.directObserver_=u(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(P){if(!a)return!1;c={},b=G(this.value_,a,c)}else c=this.oldObject_,b=r(this.value_,this.oldObject_);return q(b)?!1:(P||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){P?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==fb&&(P?this.directObserver_.deliver(!1):o(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),B.prototype=S({__proto__:A.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(P){if(!a)return!1;b=N(this.value_,a)}else b=J(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(P||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),B.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;ej;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(ob):(e.push(pb),d=g),b--,c--):f==h?(e.push(rb),b--,d=h):(e.push(qb),c--,d=i)}else e.push(rb),b--;else e.push(qb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=H(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[H(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;od;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var sb=new I;a.Observer=x,a.Observer.runEOM_=bb,a.Observer.observerSentinel_=mb,a.Observer.hasObjectObserve=P,a.ArrayObserver=B,a.ArrayObserver.calculateSplices=function(a,b){return sb.calculateSplices(a,b)},a.ArraySplice=I,a.ObjectObserver=A,a.PathObserver=C,a.CompoundObserver=D,a.Path=l,a.ObserverTransform=F}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=N(b),d=0;d0){for(var k=0;k0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof T.Window&&(b=b.document);var e,f=M(b),g=M(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k0;f--)if(!s(b[f],a,e,b,d))return!1;return!0}function q(a,b,c,d){var e=fb,f=b[0]||c;return s(f,a,e,b,d)}function r(a,b,c,d){for(var e=gb,f=1;f0&&s(c,a,e,b,d)}function s(a,b,c,d,e){var f=U.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===eb)return!0;c===gb&&(c=fb)}else if(c===gb&&!b.bubbles)return!0;if("relatedTarget"in b){var i=R(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=S(j),m=k(b,a,l);if(m===g)return!0}else m=null;Z.set(b,m)}}$.set(b,c);var n=b.type,o=!1;X.set(b,g),Y.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===eb||r.capture&&c===gb))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),ab.get(b))return!1}catch(s){K||(K=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;pd;d++)b[d]=g(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(f(this)[b].apply(f(this),arguments))}}var f=a.unsafeUnwrap,g=a.wrap,h={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);P=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;P=!1;for(var g=0;ge;e++)d.appendChild(K(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=K(b),e=d.parentNode;e&&W.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=K(a),g=f.firstChild;g;)c=g.nextSibling,W.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;ch;h++)f=s(b[h]),!e&&(g=q(f).root)&&g instanceof a.wrappers.ShadowRoot||(d[c++]=f);return c}function c(a){return String(a).replace(/\/deep\//g," ")}function d(a,b){for(var c,e=a.firstElementChild;e;){if(e.matches(b))return e;if(c=d(e,b))return c;e=e.nextElementSibling}return null}function e(a,b){return a.matches(b)}function f(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===D}function g(){return!0}function h(a,b,c){return a.localName===c}function i(a,b){return a.namespaceURI===b}function j(a,b,c){return a.namespaceURI===b&&a.localName===c}function k(a,b,c,d,e,f){for(var g=a.firstElementChild;g;)d(g,e,f)&&(c[b++]=g),b=k(g,b,c,d,e,f),g=g.nextElementSibling;return b}function l(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,null);if(i instanceof B)h=w.call(i,f);else{if(!(i instanceof C))return k(this,d,e,c,f,null);h=v.call(i,f)}return b(h,d,e,g)}function m(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=y.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=x.call(i,f,g)}return b(h,d,e,!1)}function n(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=A.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=z.call(i,f,g)}return b(h,d,e,!1)}var o=a.wrappers.HTMLCollection,p=a.wrappers.NodeList,q=a.getTreeScope,r=a.unsafeUnwrap,s=a.wrap,t=document.querySelector,u=document.documentElement.querySelector,v=document.querySelectorAll,w=document.documentElement.querySelectorAll,x=document.getElementsByTagName,y=document.documentElement.getElementsByTagName,z=document.getElementsByTagNameNS,A=document.documentElement.getElementsByTagNameNS,B=window.Element,C=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",E={querySelector:function(b){var e=c(b),f=e!==b;b=e;var g,h=r(this),i=q(this).root;if(i instanceof a.wrappers.ShadowRoot)return d(this,b);if(h instanceof B)g=s(u.call(h,b));else{if(!(h instanceof C))return d(this,b);g=s(t.call(h,b))}return g&&!f&&(i=q(g).root)&&i instanceof a.wrappers.ShadowRoot?d(this,b):g},querySelectorAll:function(a){var b=c(a),d=b!==a;a=b;var f=new p;return f.length=l.call(this,e,0,f,a,d),f}},F={getElementsByTagName:function(a){var b=new o,c="*"===a?g:f;return b.length=m.call(this,c,0,b,a,a.toLowerCase()),b},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new o,d=null;return d="*"===a?"*"===b?g:h:"*"===b?i:j,c.length=n.call(this,d,0,c,a||null,b),c}};a.GetElementsByInterface=F,a.SelectorsInterface=E}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return h(this).data},set data(a){var b=h(this).data;e(this,"characterData",{oldValue:b}),h(this).data=a}}),f(b.prototype,c),g(i,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){d(a,this),this.ownerElement_=b}var d=a.setWrapper,e=a.unsafeUnwrap;c.prototype={constructor:c,get length(){return e(this).length},item:function(a){return e(this).item(a)},contains:function(a){return e(this).contains(a)},add:function(){e(this).add.apply(e(this),arguments),b(this.ownerElement_)},remove:function(){e(this).remove.apply(e(this),arguments),b(this.ownerElement_)},toggle:function(){var a=e(this).toggle.apply(e(this),arguments);return b(this.ownerElement_),a},toString:function(){return e(this).toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unsafeUnwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);n(this).polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return n(this).polymerShadowRoot_||null},setAttribute:function(a,d){var e=n(this).getAttribute(a);n(this).setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=n(this).getAttribute(a);n(this).removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(n(this),a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&";case"<":return"<";case">":return">";case'"':return""";case"\xa0":return" "}}function c(a){return a.replace(A,b)}function d(a){return a.replace(B,b)}function e(a){for(var b={},c=0;c";case Node.TEXT_NODE:var k=a.data;return b&&D[b.localName]?k:d(k);case Node.COMMENT_NODE:return"";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof z.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=x(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(y(f))}function i(a){o.call(this,a)}function j(a,b){var c=x(a.cloneNode(!1));c.innerHTML=b;for(var d,e=x(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return y(e)}function k(b){return function(){return a.renderAllPending(),w(this)[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),w(this)[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),w(this)[b].apply(w(this),arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unsafeUnwrap,x=a.unwrap,y=a.wrap,z=a.wrappers,A=/[&\u00A0"]/g,B=/[&\u00A0<>]/g,C=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),E=/MSIE/.test(navigator.userAgent),F=window.HTMLElement,G=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(E&&D[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof z.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!G&&this instanceof z.HTMLTemplateElement?h(this.content,a):w(this).innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)},get hidden(){return this.hasAttribute("hidden")},set hidden(a){a?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(F,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=f(this).getContext.apply(f(this),arguments);return a&&g(a)}}),e(h,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),b.prototype.constructor=b,e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=i(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!m){var b=c(a);k.set(this,j(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=a.unwrap,j=a.wrap,k=new WeakMap,l=new WeakMap,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{constructor:d,get content(){return m?j(h(this).content):k.get(this)}}),m&&g(m,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;e&&(b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;h&&(b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.SVGElementInstance;h&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return g(f(this).correspondingElement) },get correspondingUseElement(){return g(f(this).correspondingUseElement)},get parentNode(){return g(f(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return g(f(this).firstChild)},get lastChild(){return g(f(this).lastChild)},get previousSibling(){return g(f(this).previousSibling)},get nextSibling(){return g(f(this).nextSibling)}}),e(h,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrap,h=a.unwrapIfNeeded,i=a.wrap,j=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return i(f(this).canvas)},drawImage:function(){arguments[0]=h(arguments[0]),f(this).drawImage.apply(f(this),arguments)},createPattern:function(){return arguments[0]=g(arguments[0]),f(this).createPattern.apply(f(this),arguments)}}),d(j,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.WebGLRenderingContext;if(i){c(b.prototype,{get canvas(){return h(f(this).canvas)},texImage2D:function(){arguments[5]=g(arguments[5]),f(this).texImage2D.apply(f(this),arguments)},texSubImage2D:function(){arguments[6]=g(arguments[6]),f(this).texSubImage2D.apply(f(this),arguments)}});var j=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(i,b,j),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Range;b.prototype={get startContainer(){return h(e(this).startContainer)},get endContainer(){return h(e(this).endContainer)},get commonAncestorContainer(){return h(e(this).commonAncestorContainer)},setStart:function(a,b){e(this).setStart(g(a),b)},setEnd:function(a,b){e(this).setEnd(g(a),b)},setStartBefore:function(a){e(this).setStartBefore(g(a))},setStartAfter:function(a){e(this).setStartAfter(g(a))},setEndBefore:function(a){e(this).setEndBefore(g(a))},setEndAfter:function(a){e(this).setEndAfter(g(a))},selectNode:function(a){e(this).selectNode(g(a))},selectNodeContents:function(a){e(this).selectNodeContents(g(a))},compareBoundaryPoints:function(a,b){return e(this).compareBoundaryPoints(a,f(b))},extractContents:function(){return h(e(this).extractContents())},cloneContents:function(){return h(e(this).cloneContents())},insertNode:function(a){e(this).insertNode(g(a))},surroundContents:function(a){e(this).surroundContents(g(a))},cloneRange:function(){return h(e(this).cloneRange())},isPointInRange:function(a,b){return e(this).isPointInRange(g(a),b)},comparePoint:function(a,b){return e(this).comparePoint(g(a),b)},intersectsNode:function(a){return e(this).intersectsNode(g(a))},toString:function(){return e(this).toString()}},i.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return h(e(this).createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=l(k(a).ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;n.set(this,e),this.treeScope_=new d(this,g(e||a)),m.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unsafeUnwrap,l=a.unwrap,m=new WeakMap,n=new WeakMap,o=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{constructor:b,get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return n.get(this)||null},get host(){return m.get(this)||null},invalidateShadowRenderer:function(){return m.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return o.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(c,e,f){var g=H(c),h=H(e),i=f?H(f):null;if(d(e),b(e),f)c.firstChild===f&&(c.firstChild_=f),f.previousSibling_=f.previousSibling;else{c.lastChild_=c.lastChild,c.lastChild===c.firstChild&&(c.firstChild_=c.firstChild);var j=I(g.lastChild);j&&(j.nextSibling_=j.nextSibling)}a.originalInsertBefore.call(g,h,i)}function d(c){var d=H(c),e=d.parentNode;if(e){var f=I(e);b(c),c.previousSibling&&(c.previousSibling.nextSibling_=c),c.nextSibling&&(c.nextSibling.previousSibling_=c),f.lastChild===c&&(f.lastChild_=c),f.firstChild===c&&(f.firstChild_=c),a.originalRemoveChild.call(e,d)}}function e(a){J.set(a,[])}function f(a){var b=J.get(a);return b||J.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;ap;p++){var q=I(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&I(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){C(this)instanceof d||y(this),b.apply(C(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);H.call(B(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=E.get(this);return a?a:(a=new g(B(this).implementation),E.set(this,a),a)},get defaultView(){return C(B(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getDefaultComputedStyle,n=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},m&&(k.prototype.getDefaultComputedStyle=function(a,b){return j(this||window).getDefaultComputedStyle(i(a),b)}),k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(n.call(h(this)))},get document(){return j(h(this).document)}}),m&&(b.prototype.getDefaultComputedStyle=function(a,b){return g(),m.call(h(this),i(a),b)}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b;b=a instanceof f?a:new f(a&&e(a)),d(b,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unwrap,f=window.FormData;f&&(c(f,b,new f),a.wrappers.FormData=b)}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrapIfNeeded,c=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(a){return c.call(this,b(a))}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;id&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var b="link[rel=stylesheet]["+y+"]",c="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+b,HTMLImports.importer.importsPreloadSelectors+=","+b,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,b,c].join(",");var d=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var b=a.__importElement||a;if(!b.hasAttribute(y))return void d.call(this,a);a.__resource&&(b=a.ownerDocument.createElement("style"),b.textContent=a.__resource),HTMLImports.path.resolveUrlsInStyle(b),b.textContent=k.shimStyle(b),b.removeAttribute(y,""),b.setAttribute(z,""),b[z]=!0,b.parentNode!==C&&(a.parentNode===C?C.replaceChild(b,a):this.addElementToDocument(b)),b.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var e=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:e.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}})}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&" "!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query"; else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;ck&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return m?a.__loaded||a.import&&"loading"!==a.import.readyState:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import",l=k in document.createElement("link"),m=l,n=/Trident/.test(navigator.userAgent),o=Boolean(window.ShadowDOMPolyfill),p=function(a){return o?ShadowDOMPolyfill.wrapIfNeeded(a):a},q=p(document),r={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return p(a)},configurable:!0};Object.defineProperty(document,"_currentScript",r),Object.defineProperty(q,"_currentScript",r);var s=n?"complete":"interactive",t="readystatechange";m&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),q.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=m,a.isImportLoaded=g,a.whenReady=b,a.rootDocument=q,a.IMPORT_LINK_TYPE=k,a.isIE=n}(window.HTMLImports),function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;for(var f,g=this.pending[a],h=0,i=g.length;i>h&&(f=g[h]);h++)this.onload(a,f,d,c,e),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:a;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===j}function c(a){var b=d(a);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(b)}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g=a.rootDocument,h=a.flags,i=a.isIE,j=a.IMPORT_LINK_TYPE,k={documentSelectors:"link[rel="+j+"]",importsSelectors:["link[rel="+j+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},parseDynamic:function(a,b){this.dynamicElements.push(a),b||this.parseNext()},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,this.markDynamicParsingComplete(a),a.__importElement&&(a.__importElement.__importParsed=!0,this.markDynamicParsingComplete(a.__importElement)),this.parsingElement=null,h.parse&&console.log("completed",a)},markDynamicParsingComplete:function(a){var b=this.dynamicElements.indexOf(a);b>=0&&this.dynamicElements.splice(b,1)},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import&&(a.import.__importParsed=!0),this.markParsingComplete(a),a.dispatchEvent(a.__resource&&!a.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),this.addElementToDocument(a)},rootImportForElement:function(a){for(var b=a;b.ownerDocument.__importLink;)b=b.ownerDocument.__importLink;return b},addElementToDocument:function(a){for(var b=this.rootImportForElement(a.__importElement||a),c=b.__insertedElements=b.__insertedElements||0,d=b.nextElementSibling,e=0;c>e;e++)d=d&&d.nextElementSibling;b.parentNode.insertBefore(a,d)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),this.addElementToDocument(d)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(g)||this.nextToParseDynamic())},nextToParseInDoc:function(a,c){if(a&&this._mayParse.indexOf(a)<0){this._mayParse.push(a);for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0}return c},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===g?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},needsDynamicParsing:function(a){return this.dynamicElements.indexOf(a)>=0},hasResource:function(a){return b(a)&&void 0===a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n}(HTMLImports),function(a){function b(a){return c(a,g)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(g)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}var e=a.useNative,f=a.flags,g=a.IMPORT_LINK_TYPE;if(e)var h={};else{var i=a.rootDocument,j=(a.xhr,a.Loader),k=a.parser,h={documents:{},documentPreloadSelectors:"link[rel="+g+"]",importsPreloadSelectors:["link[rel="+g+"]"].join(","),loadNode:function(a){l.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);l.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===i?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e,g,h){if(f.load&&console.log("loaded",a,c),c.__resource=e,c.__error=g,b(c)){var i=this.documents[a];void 0===i&&(i=g?null:d(e,h||a),i&&(i.__importLink=c,this.bootDocument(i)),this.documents[a]=i),c.import=i}k.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),k.parseNext()},loadedAll:function(){k.parseNext()}},l=new j(h.loaded.bind(h),h.loadedAll.bind(h));if(!document.baseURI){var m={get:function(){var a=document.querySelector("base");return a?a.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",m),Object.defineProperty(i,"baseURI",m)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c})}a.importer=h,a.IMPORT_LINK_TYPE=g,a.importLoader=l}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,f,i,j,k=0,l=a.length;l>k&&(i=a[k]);k++)b||(b=i.ownerDocument,f=h.isParsed(b)),j=d(i),j&&g.loadNode(i),e(i)&&f&&h.parseDynamic(i,j),i.children&&i.children.length&&c(i.children)}function d(a){return 1===a.nodeType&&i.call(a,g.loadSelectorsForNode(a))}function e(a){return 1===a.nodeType&&i.call(a,h.parseSelectorsForNode(a))}function f(a){j.observe(a,{childList:!0,subtree:!0})}var g=(a.IMPORT_LINK_TYPE,a.importer),h=a.parser,i=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector,j=new MutationObserver(b);a.observe=f,g.observe=f}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return B.dom&&console.group("upgrade:",b.localName),a.upgrade(b),B.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(G.push(a),!F){F=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){F=!1;for(var a,b=G,c=0,d=b.length;d>c&&(a=b[c]);c++)a();G=[]}function l(a){D?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&B.dom)&&(B.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?B.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(B.dom&&console.log("inserted:",a.localName),a.attachedCallback())),B.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){D?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&B.dom)&&(B.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?B.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),B.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){B.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){w(a)}function u(a){if(B.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(H(a.addedNodes,function(a){a.localName&&g(a)}),H(a.removedNodes,function(a){a.localName&&n(a)}))}),B.dom&&console.groupEnd()}function v(a){for(a||(a=q(document));a.parentNode;)a=a.parentNode;var b=a.__observer;b&&(u(b.takeRecords()),k())}function w(a){if(!a.__observer){var b=new MutationObserver(u);b.observe(a,{childList:!0,subtree:!0}),a.__observer=b}}function x(a){w(a)}function y(a){B.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),B.dom&&console.groupEnd()}function z(a){E=[],A(a),E=null}function A(a){if(a=q(a),!(E.indexOf(a)>=0)){E.push(a);for(var b,c=a.querySelectorAll("link[rel="+C+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&A(b.import);y(a)}}var B=window.logFlags||{},C=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",D=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=D;var E,F=!1,G=[],H=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=C,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,Boolean(b.bubbles),Boolean(b.cancelable),b.detail),c},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){"use strict";function b(){window.Polymer===e&&(window.Polymer=function(){throw new Error('You tried to use polymer without loading it first. To load polymer, ')})}if(!window.performance){var c=Date.now();window.performance={now:function(){return Date.now()-c }}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var d=[],e=function(a){"string"!=typeof a&&1===arguments.length&&Array.prototype.push.call(arguments,document._currentScript),d.push(arguments)};window.Polymer=e,a.consumeDeclarations=function(b){a.consumeDeclarations=function(){throw"Possible attempt to load Polymer twice"},b&&b(d),d=null},HTMLImports.useNative?b():addEventListener("DOMContentLoaded",b)}(window.Platform),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window); //# sourceMappingURL=platform.js.map ================================================ FILE: bower_components/polymer/.bower.json ================================================ { "name": "polymer", "description": "Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.", "homepage": "http://www.polymer-project.org/", "keywords": [ "util", "client", "browser", "web components", "web-components" ], "author": "Polymer Authors ", "private": true, "dependencies": { "core-component-page": "Polymer/core-component-page#^0.5.0", "webcomponentsjs": "Polymer/webcomponentsjs#^0.5.0" }, "devDependencies": { "tools": "Polymer/tools#master", "web-component-tester": "Polymer/web-component-tester#^1.4.2" }, "version": "0.5.2", "_release": "0.5.2", "_resolution": { "type": "version", "tag": "0.5.2", "commit": "2a9ca53fa79ca09907e818f1adf806765409ec9c" }, "_source": "git://github.com/Polymer/polymer.git", "_target": "^0.5.0", "_originalSource": "Polymer/polymer" } ================================================ FILE: bower_components/polymer/README.md ================================================ # Polymer [![Polymer build status](http://www.polymer-project.org/build/polymer-dev/status.png "Polymer build status")](http://build.chromium.org/p/client.polymer/waterfall) ## Brief Overview For more detailed info goto [http://polymer-project.org/](http://polymer-project.org/). Polymer is a new type of library for the web, designed to leverage the existing browser infrastructure to provide the encapsulation and extendability currently only available in JS libraries. Polymer is based on a set of future technologies, including [Shadow DOM](http://w3c.github.io/webcomponents/spec/shadow/), [Custom Elements](http://w3c.github.io/webcomponents/spec/custom/) and Model Driven Views. Currently these technologies are implemented as polyfills or shims, but as browsers adopt these features natively, the platform code that drives Polymer evacipates, leaving only the value-adds. ## Tools & Testing For running tests or building minified files, consult the [tooling information](https://www.polymer-project.org/resources/tooling-strategy.html). ## Releases [Release (tagged) versions](https://github.com/Polymer/polymer/releases) of Polymer include concatenated and minified sources for your convenience. [![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/polymer/README)](https://github.com/igrigorik/ga-beacon) ================================================ FILE: bower_components/polymer/bower.json ================================================ { "name": "polymer", "description": "Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.", "homepage": "http://www.polymer-project.org/", "keywords": [ "util", "client", "browser", "web components", "web-components" ], "author": "Polymer Authors ", "private": true, "dependencies": { "core-component-page": "Polymer/core-component-page#^0.5.0", "webcomponentsjs": "Polymer/webcomponentsjs#^0.5.0" }, "devDependencies": { "tools": "Polymer/tools#master", "web-component-tester": "Polymer/web-component-tester#^1.4.2" }, "version": "0.5.2" } ================================================ FILE: bower_components/polymer/build.log ================================================ BUILD LOG --------- Build Time: 2014-12-11T12:46:30 NODEJS INFORMATION ================== nodejs: v0.10.33 grunt: 0.4.5 grunt-audit: 1.0.0 grunt-contrib-concat: 0.5.0 grunt-contrib-copy: 0.7.0 grunt-contrib-uglify: 0.6.0 grunt-string-replace: 1.0.0 REPO REVISIONS ============== polymer-expressions: 197c3a0150e7a13374cfcc72e7066113723a623d polymer-gestures: 17a6304916521be39409af292e8adf899bae0ce7 polymer: a74e9f36526361dccb6df91be439ff9c3e043f41 BUILD HASHES ============ dist/polymer.js: b9ad4c86af79c748cf4ea722f6d56671079fadf7 dist/polymer.min.js: 2f2021ba9682b0bb702ee7fb68fb6fbfd288eac2 dist/layout.html: 348d358a91712ecc2f8811efa430fcd954b4590c ================================================ FILE: bower_components/polymer/layout.html ================================================ ================================================ FILE: bower_components/polymer/polymer.html ================================================ ================================================ FILE: bower_components/polymer/polymer.js ================================================ /** * @license * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ // @version 0.5.1 window.PolymerGestures = {}; (function(scope) { var HAS_FULL_PATH = false; // test for full event path support var pathTest = document.createElement('meta'); if (pathTest.createShadowRoot) { var sr = pathTest.createShadowRoot(); var s = document.createElement('span'); sr.appendChild(s); pathTest.addEventListener('testpath', function(ev) { if (ev.path) { // if the span is in the event path, then path[0] is the real source for all events HAS_FULL_PATH = ev.path[0] === s; } ev.stopPropagation(); }); var ev = new CustomEvent('testpath', {bubbles: true}); // must add node to DOM to trigger event listener document.head.appendChild(pathTest); s.dispatchEvent(ev); pathTest.parentNode.removeChild(pathTest); sr = s = null; } pathTest = null; var target = { shadow: function(inEl) { if (inEl) { return inEl.shadowRoot || inEl.webkitShadowRoot; } }, canTarget: function(shadow) { return shadow && Boolean(shadow.elementFromPoint); }, targetingShadow: function(inEl) { var s = this.shadow(inEl); if (this.canTarget(s)) { return s; } }, olderShadow: function(shadow) { var os = shadow.olderShadowRoot; if (!os) { var se = shadow.querySelector('shadow'); if (se) { os = se.olderShadowRoot; } } return os; }, allShadows: function(element) { var shadows = [], s = this.shadow(element); while(s) { shadows.push(s); s = this.olderShadow(s); } return shadows; }, searchRoot: function(inRoot, x, y) { var t, st, sr, os; if (inRoot) { t = inRoot.elementFromPoint(x, y); if (t) { // found element, check if it has a ShadowRoot sr = this.targetingShadow(t); } else if (inRoot !== document) { // check for sibling roots sr = this.olderShadow(inRoot); } // search other roots, fall back to light dom element return this.searchRoot(sr, x, y) || t; } }, owner: function(element) { if (!element) { return document; } var s = element; // walk up until you hit the shadow root or document while (s.parentNode) { s = s.parentNode; } // the owner element is expected to be a Document or ShadowRoot if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) { s = document; } return s; }, findTarget: function(inEvent) { if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) { return inEvent.path[0]; } var x = inEvent.clientX, y = inEvent.clientY; // if the listener is in the shadow root, it is much faster to start there var s = this.owner(inEvent.target); // if x, y is not in this root, fall back to document search if (!s.elementFromPoint(x, y)) { s = document; } return this.searchRoot(s, x, y); }, findTouchAction: function(inEvent) { var n; if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) { var path = inEvent.path; for (var i = 0; i < path.length; i++) { n = path[i]; if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) { return n.getAttribute('touch-action'); } } } else { n = inEvent.target; while(n) { if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) { return n.getAttribute('touch-action'); } n = n.parentNode || n.host; } } // auto is default return "auto"; }, LCA: function(a, b) { if (a === b) { return a; } if (a && !b) { return a; } if (b && !a) { return b; } if (!b && !a) { return document; } // fast case, a is a direct descendant of b or vice versa if (a.contains && a.contains(b)) { return a; } if (b.contains && b.contains(a)) { return b; } var adepth = this.depth(a); var bdepth = this.depth(b); var d = adepth - bdepth; if (d >= 0) { a = this.walk(a, d); } else { b = this.walk(b, -d); } while (a && b && a !== b) { a = a.parentNode || a.host; b = b.parentNode || b.host; } return a; }, walk: function(n, u) { for (var i = 0; n && (i < u); i++) { n = n.parentNode || n.host; } return n; }, depth: function(n) { var d = 0; while(n) { d++; n = n.parentNode || n.host; } return d; }, deepContains: function(a, b) { var common = this.LCA(a, b); // if a is the common ancestor, it must "deeply" contain b return common === a; }, insideNode: function(node, x, y) { var rect = node.getBoundingClientRect(); return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom); }, path: function(event) { var p; if (HAS_FULL_PATH && event.path && event.path.length) { p = event.path; } else { p = []; var n = this.findTarget(event); while (n) { p.push(n); n = n.parentNode || n.host; } } return p; } }; scope.targetFinding = target; /** * Given an event, finds the "deepest" node that could have been the original target before ShadowDOM retargetting * * @param {Event} Event An event object with clientX and clientY properties * @return {Element} The probable event origninator */ scope.findTarget = target.findTarget.bind(target); /** * Determines if the "container" node deeply contains the "containee" node, including situations where the "containee" is contained by one or more ShadowDOM * roots. * * @param {Node} container * @param {Node} containee * @return {Boolean} */ scope.deepContains = target.deepContains.bind(target); /** * Determines if the x/y position is inside the given node. * * Example: * * function upHandler(event) { * var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY); * if (innode) { * // wait for tap? * } else { * // tap will never happen * } * } * * @param {Node} node * @param {Number} x Screen X position * @param {Number} y screen Y position * @return {Boolean} */ scope.insideNode = target.insideNode; })(window.PolymerGestures); (function() { function shadowSelector(v) { return 'html /deep/ ' + selector(v); } function selector(v) { return '[touch-action="' + v + '"]'; } function rule(v) { return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}'; } var attrib2css = [ 'none', 'auto', 'pan-x', 'pan-y', { rule: 'pan-x pan-y', selectors: [ 'pan-x pan-y', 'pan-y pan-x' ] }, 'manipulation' ]; var styles = ''; // only install stylesheet if the browser has touch action support var hasTouchAction = typeof document.head.style.touchAction === 'string'; // only add shadow selectors if shadowdom is supported var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot; if (hasTouchAction) { attrib2css.forEach(function(r) { if (String(r) === r) { styles += selector(r) + rule(r) + '\n'; if (hasShadowRoot) { styles += shadowSelector(r) + rule(r) + '\n'; } } else { styles += r.selectors.map(selector) + rule(r.rule) + '\n'; if (hasShadowRoot) { styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n'; } } }); var el = document.createElement('style'); el.textContent = styles; document.head.appendChild(el); } })(); /** * This is the constructor for new PointerEvents. * * New Pointer Events must be given a type, and an optional dictionary of * initialization properties. * * Due to certain platform requirements, events returned from the constructor * identify as MouseEvents. * * @constructor * @param {String} inType The type of the event to create. * @param {Object} [inDict] An optional dictionary of initial event properties. * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`. */ (function(scope) { var MOUSE_PROPS = [ 'bubbles', 'cancelable', 'view', 'detail', 'screenX', 'screenY', 'clientX', 'clientY', 'ctrlKey', 'altKey', 'shiftKey', 'metaKey', 'button', 'relatedTarget', 'pageX', 'pageY' ]; var MOUSE_DEFAULTS = [ false, false, null, null, 0, 0, 0, 0, false, false, false, false, 0, null, 0, 0 ]; var NOP_FACTORY = function(){ return function(){}; }; var eventFactory = { // TODO(dfreedm): this is overridden by tap recognizer, needs review preventTap: NOP_FACTORY, makeBaseEvent: function(inType, inDict) { var e = document.createEvent('Event'); e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false); e.preventTap = eventFactory.preventTap(e); return e; }, makeGestureEvent: function(inType, inDict) { inDict = inDict || Object.create(null); var e = this.makeBaseEvent(inType, inDict); for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) { k = keys[i]; e[k] = inDict[k]; } return e; }, makePointerEvent: function(inType, inDict) { inDict = inDict || Object.create(null); var e = this.makeBaseEvent(inType, inDict); // define inherited MouseEvent properties for(var i = 0, p; i < MOUSE_PROPS.length; i++) { p = MOUSE_PROPS[i]; e[p] = inDict[p] || MOUSE_DEFAULTS[i]; } e.buttons = inDict.buttons || 0; // Spec requires that pointers without pressure specified use 0.5 for down // state and 0 for up state. var pressure = 0; if (inDict.pressure) { pressure = inDict.pressure; } else { pressure = e.buttons ? 0.5 : 0; } // add x/y properties aliased to clientX/Y e.x = e.clientX; e.y = e.clientY; // define the properties of the PointerEvent interface e.pointerId = inDict.pointerId || 0; e.width = inDict.width || 0; e.height = inDict.height || 0; e.pressure = pressure; e.tiltX = inDict.tiltX || 0; e.tiltY = inDict.tiltY || 0; e.pointerType = inDict.pointerType || ''; e.hwTimestamp = inDict.hwTimestamp || 0; e.isPrimary = inDict.isPrimary || false; e._source = inDict._source || ''; return e; } }; scope.eventFactory = eventFactory; })(window.PolymerGestures); /** * This module implements an map of pointer states */ (function(scope) { var USE_MAP = window.Map && window.Map.prototype.forEach; var POINTERS_FN = function(){ return this.size; }; function PointerMap() { if (USE_MAP) { var m = new Map(); m.pointers = POINTERS_FN; return m; } else { this.keys = []; this.values = []; } } PointerMap.prototype = { set: function(inId, inEvent) { var i = this.keys.indexOf(inId); if (i > -1) { this.values[i] = inEvent; } else { this.keys.push(inId); this.values.push(inEvent); } }, has: function(inId) { return this.keys.indexOf(inId) > -1; }, 'delete': function(inId) { var i = this.keys.indexOf(inId); if (i > -1) { this.keys.splice(i, 1); this.values.splice(i, 1); } }, get: function(inId) { var i = this.keys.indexOf(inId); return this.values[i]; }, clear: function() { this.keys.length = 0; this.values.length = 0; }, // return value, key, map forEach: function(callback, thisArg) { this.values.forEach(function(v, i) { callback.call(thisArg, v, this.keys[i], this); }, this); }, pointers: function() { return this.keys.length; } }; scope.PointerMap = PointerMap; })(window.PolymerGestures); (function(scope) { var CLONE_PROPS = [ // MouseEvent 'bubbles', 'cancelable', 'view', 'detail', 'screenX', 'screenY', 'clientX', 'clientY', 'ctrlKey', 'altKey', 'shiftKey', 'metaKey', 'button', 'relatedTarget', // DOM Level 3 'buttons', // PointerEvent 'pointerId', 'width', 'height', 'pressure', 'tiltX', 'tiltY', 'pointerType', 'hwTimestamp', 'isPrimary', // event instance 'type', 'target', 'currentTarget', 'which', 'pageX', 'pageY', 'timeStamp', // gesture addons 'preventTap', 'tapPrevented', '_source' ]; var CLONE_DEFAULTS = [ // MouseEvent false, false, null, null, 0, 0, 0, 0, false, false, false, false, 0, null, // DOM Level 3 0, // PointerEvent 0, 0, 0, 0, 0, 0, '', 0, false, // event instance '', null, null, 0, 0, 0, 0, function(){}, false ]; var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined'); var eventFactory = scope.eventFactory; // set of recognizers to run for the currently handled event var currentGestures; /** * This module is for normalizing events. Mouse and Touch events will be * collected here, and fire PointerEvents that have the same semantics, no * matter the source. * Events fired: * - pointerdown: a pointing is added * - pointerup: a pointer is removed * - pointermove: a pointer is moved * - pointerover: a pointer crosses into an element * - pointerout: a pointer leaves an element * - pointercancel: a pointer will no longer generate events */ var dispatcher = { IS_IOS: false, pointermap: new scope.PointerMap(), requiredGestures: new scope.PointerMap(), eventMap: Object.create(null), // Scope objects for native events. // This exists for ease of testing. eventSources: Object.create(null), eventSourceList: [], gestures: [], // map gesture event -> {listeners: int, index: gestures[int]} dependencyMap: { // make sure down and up are in the map to trigger "register" down: {listeners: 0, index: -1}, up: {listeners: 0, index: -1} }, gestureQueue: [], /** * Add a new event source that will generate pointer events. * * `inSource` must contain an array of event names named `events`, and * functions with the names specified in the `events` array. * @param {string} name A name for the event source * @param {Object} source A new source of platform events. */ registerSource: function(name, source) { var s = source; var newEvents = s.events; if (newEvents) { newEvents.forEach(function(e) { if (s[e]) { this.eventMap[e] = s[e].bind(s); } }, this); this.eventSources[name] = s; this.eventSourceList.push(s); } }, registerGesture: function(name, source) { var obj = Object.create(null); obj.listeners = 0; obj.index = this.gestures.length; for (var i = 0, g; i < source.exposes.length; i++) { g = source.exposes[i].toLowerCase(); this.dependencyMap[g] = obj; } this.gestures.push(source); }, register: function(element, initial) { var l = this.eventSourceList.length; for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) { // call eventsource register es.register.call(es, element, initial); } }, unregister: function(element) { var l = this.eventSourceList.length; for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) { // call eventsource register es.unregister.call(es, element); } }, // EVENTS down: function(inEvent) { this.requiredGestures.set(inEvent.pointerId, currentGestures); this.fireEvent('down', inEvent); }, move: function(inEvent) { // pipe move events into gesture queue directly inEvent.type = 'move'; this.fillGestureQueue(inEvent); }, up: function(inEvent) { this.fireEvent('up', inEvent); this.requiredGestures.delete(inEvent.pointerId); }, cancel: function(inEvent) { inEvent.tapPrevented = true; this.fireEvent('up', inEvent); this.requiredGestures.delete(inEvent.pointerId); }, addGestureDependency: function(node, currentGestures) { var gesturesWanted = node._pgEvents; if (gesturesWanted && currentGestures) { var gk = Object.keys(gesturesWanted); for (var i = 0, r, ri, g; i < gk.length; i++) { // gesture g = gk[i]; if (gesturesWanted[g] > 0) { // lookup gesture recognizer r = this.dependencyMap[g]; // recognizer index ri = r ? r.index : -1; currentGestures[ri] = true; } } } }, // LISTENER LOGIC eventHandler: function(inEvent) { // This is used to prevent multiple dispatch of events from // platform events. This can happen when two elements in different scopes // are set up to create pointer events, which is relevant to Shadow DOM. var type = inEvent.type; // only generate the list of desired events on "down" if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') { if (!inEvent._handledByPG) { currentGestures = {}; } // in IOS mode, there is only a listener on the document, so this is not re-entrant if (this.IS_IOS) { var ev = inEvent; if (type === 'touchstart') { var ct = inEvent.changedTouches[0]; // set up a fake event to give to the path builder ev = {target: inEvent.target, clientX: ct.clientX, clientY: ct.clientY, path: inEvent.path}; } // use event path if available, otherwise build a path from target finding var nodes = inEvent.path || scope.targetFinding.path(ev); for (var i = 0, n; i < nodes.length; i++) { n = nodes[i]; this.addGestureDependency(n, currentGestures); } } else { this.addGestureDependency(inEvent.currentTarget, currentGestures); } } if (inEvent._handledByPG) { return; } var fn = this.eventMap && this.eventMap[type]; if (fn) { fn(inEvent); } inEvent._handledByPG = true; }, // set up event listeners listen: function(target, events) { for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) { this.addEvent(target, e); } }, // remove event listeners unlisten: function(target, events) { for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) { this.removeEvent(target, e); } }, addEvent: function(target, eventName) { target.addEventListener(eventName, this.boundHandler); }, removeEvent: function(target, eventName) { target.removeEventListener(eventName, this.boundHandler); }, // EVENT CREATION AND TRACKING /** * Creates a new Event of type `inType`, based on the information in * `inEvent`. * * @param {string} inType A string representing the type of event to create * @param {Event} inEvent A platform event with a target * @return {Event} A PointerEvent of type `inType` */ makeEvent: function(inType, inEvent) { var e = eventFactory.makePointerEvent(inType, inEvent); e.preventDefault = inEvent.preventDefault; e.tapPrevented = inEvent.tapPrevented; e._target = e._target || inEvent.target; return e; }, // make and dispatch an event in one call fireEvent: function(inType, inEvent) { var e = this.makeEvent(inType, inEvent); return this.dispatchEvent(e); }, /** * Returns a snapshot of inEvent, with writable properties. * * @param {Event} inEvent An event that contains properties to copy. * @return {Object} An object containing shallow copies of `inEvent`'s * properties. */ cloneEvent: function(inEvent) { var eventCopy = Object.create(null), p; for (var i = 0; i < CLONE_PROPS.length; i++) { p = CLONE_PROPS[i]; eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i]; // Work around SVGInstanceElement shadow tree // Return the element that is represented by the instance for Safari, Chrome, IE. // This is the behavior implemented by Firefox. if (p === 'target' || p === 'relatedTarget') { if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) { eventCopy[p] = eventCopy[p].correspondingUseElement; } } } // keep the semantics of preventDefault eventCopy.preventDefault = function() { inEvent.preventDefault(); }; return eventCopy; }, /** * Dispatches the event to its target. * * @param {Event} inEvent The event to be dispatched. * @return {Boolean} True if an event handler returns true, false otherwise. */ dispatchEvent: function(inEvent) { var t = inEvent._target; if (t) { t.dispatchEvent(inEvent); // clone the event for the gesture system to process // clone after dispatch to pick up gesture prevention code var clone = this.cloneEvent(inEvent); clone.target = t; this.fillGestureQueue(clone); } }, gestureTrigger: function() { // process the gesture queue for (var i = 0, e, rg; i < this.gestureQueue.length; i++) { e = this.gestureQueue[i]; rg = e._requiredGestures; if (rg) { for (var j = 0, g, fn; j < this.gestures.length; j++) { // only run recognizer if an element in the source event's path is listening for those gestures if (rg[j]) { g = this.gestures[j]; fn = g[e.type]; if (fn) { fn.call(g, e); } } } } } this.gestureQueue.length = 0; }, fillGestureQueue: function(ev) { // only trigger the gesture queue once if (!this.gestureQueue.length) { requestAnimationFrame(this.boundGestureTrigger); } ev._requiredGestures = this.requiredGestures.get(ev.pointerId); this.gestureQueue.push(ev); } }; dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher); dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher); scope.dispatcher = dispatcher; /** * Listen for `gesture` on `node` with the `handler` function * * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled. * * @param {Element} node * @param {string} gesture * @return Boolean `gesture` is a valid gesture */ scope.activateGesture = function(node, gesture) { var g = gesture.toLowerCase(); var dep = dispatcher.dependencyMap[g]; if (dep) { var recognizer = dispatcher.gestures[dep.index]; if (!node._pgListeners) { dispatcher.register(node); node._pgListeners = 0; } // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes if (recognizer) { var touchAction = recognizer.defaultActions && recognizer.defaultActions[g]; var actionNode; switch(node.nodeType) { case Node.ELEMENT_NODE: actionNode = node; break; case Node.DOCUMENT_FRAGMENT_NODE: actionNode = node.host; break; default: actionNode = null; break; } if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) { actionNode.setAttribute('touch-action', touchAction); } } if (!node._pgEvents) { node._pgEvents = {}; } node._pgEvents[g] = (node._pgEvents[g] || 0) + 1; node._pgListeners++; } return Boolean(dep); }; /** * * Listen for `gesture` from `node` with `handler` function. * * @param {Element} node * @param {string} gesture * @param {Function} handler * @param {Boolean} capture */ scope.addEventListener = function(node, gesture, handler, capture) { if (handler) { scope.activateGesture(node, gesture); node.addEventListener(gesture, handler, capture); } }; /** * Tears down the gesture configuration for `node` * * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled. * * @param {Element} node * @param {string} gesture * @return Boolean `gesture` is a valid gesture */ scope.deactivateGesture = function(node, gesture) { var g = gesture.toLowerCase(); var dep = dispatcher.dependencyMap[g]; if (dep) { if (node._pgListeners > 0) { node._pgListeners--; } if (node._pgListeners === 0) { dispatcher.unregister(node); } if (node._pgEvents) { if (node._pgEvents[g] > 0) { node._pgEvents[g]--; } else { node._pgEvents[g] = 0; } } } return Boolean(dep); }; /** * Stop listening for `gesture` from `node` with `handler` function. * * @param {Element} node * @param {string} gesture * @param {Function} handler * @param {Boolean} capture */ scope.removeEventListener = function(node, gesture, handler, capture) { if (handler) { scope.deactivateGesture(node, gesture); node.removeEventListener(gesture, handler, capture); } }; })(window.PolymerGestures); (function(scope) { var dispatcher = scope.dispatcher; var pointermap = dispatcher.pointermap; // radius around touchend that swallows mouse events var DEDUP_DIST = 25; var WHICH_TO_BUTTONS = [0, 1, 4, 2]; var CURRENT_BUTTONS = 0; var FIREFOX_LINUX = /Linux.*Firefox\//i; var HAS_BUTTONS = (function() { // firefox on linux returns spec-incorrect values for mouseup.buttons // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent.buttons#See_also // https://codereview.chromium.org/727593003/#msg16 if (FIREFOX_LINUX.test(navigator.userAgent)) { return false; } try { return new MouseEvent('test', {buttons: 1}).buttons === 1; } catch (e) { return false; } })(); // handler block for native mouse events var mouseEvents = { POINTER_ID: 1, POINTER_TYPE: 'mouse', events: [ 'mousedown', 'mousemove', 'mouseup' ], exposes: [ 'down', 'up', 'move' ], register: function(target) { dispatcher.listen(target, this.events); }, unregister: function(target) { if (target === document) { return; } dispatcher.unlisten(target, this.events); }, lastTouches: [], // collide with the global mouse listener isEventSimulatedFromTouch: function(inEvent) { var lts = this.lastTouches; var x = inEvent.clientX, y = inEvent.clientY; for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) { // simulated mouse events will be swallowed near a primary touchend var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y); if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) { return true; } } }, prepareEvent: function(inEvent) { var e = dispatcher.cloneEvent(inEvent); e.pointerId = this.POINTER_ID; e.isPrimary = true; e.pointerType = this.POINTER_TYPE; e._source = 'mouse'; if (!HAS_BUTTONS) { var type = inEvent.type; var bit = WHICH_TO_BUTTONS[inEvent.which] || 0; if (type === 'mousedown') { CURRENT_BUTTONS |= bit; } else if (type === 'mouseup') { CURRENT_BUTTONS &= ~bit; } e.buttons = CURRENT_BUTTONS; } return e; }, mousedown: function(inEvent) { if (!this.isEventSimulatedFromTouch(inEvent)) { var p = pointermap.has(this.POINTER_ID); var e = this.prepareEvent(inEvent); e.target = scope.findTarget(inEvent); pointermap.set(this.POINTER_ID, e.target); dispatcher.down(e); } }, mousemove: function(inEvent) { if (!this.isEventSimulatedFromTouch(inEvent)) { var target = pointermap.get(this.POINTER_ID); if (target) { var e = this.prepareEvent(inEvent); e.target = target; // handle case where we missed a mouseup if ((HAS_BUTTONS ? e.buttons : e.which) === 0) { if (!HAS_BUTTONS) { CURRENT_BUTTONS = e.buttons = 0; } dispatcher.cancel(e); this.cleanupMouse(e.buttons); } else { dispatcher.move(e); } } } }, mouseup: function(inEvent) { if (!this.isEventSimulatedFromTouch(inEvent)) { var e = this.prepareEvent(inEvent); e.relatedTarget = scope.findTarget(inEvent); e.target = pointermap.get(this.POINTER_ID); dispatcher.up(e); this.cleanupMouse(e.buttons); } }, cleanupMouse: function(buttons) { if (buttons === 0) { pointermap.delete(this.POINTER_ID); } } }; scope.mouseEvents = mouseEvents; })(window.PolymerGestures); (function(scope) { var dispatcher = scope.dispatcher; var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding); var pointermap = dispatcher.pointermap; var touchMap = Array.prototype.map.call.bind(Array.prototype.map); // This should be long enough to ignore compat mouse events made by touch var DEDUP_TIMEOUT = 2500; var DEDUP_DIST = 25; var CLICK_COUNT_TIMEOUT = 200; var HYSTERESIS = 20; var ATTRIB = 'touch-action'; // TODO(dfreedm): disable until http://crbug.com/399765 is resolved // var HAS_TOUCH_ACTION = ATTRIB in document.head.style; var HAS_TOUCH_ACTION = false; // handler block for native touch events var touchEvents = { IS_IOS: false, events: [ 'touchstart', 'touchmove', 'touchend', 'touchcancel' ], exposes: [ 'down', 'up', 'move' ], register: function(target, initial) { if (this.IS_IOS ? initial : !initial) { dispatcher.listen(target, this.events); } }, unregister: function(target) { if (!this.IS_IOS) { dispatcher.unlisten(target, this.events); } }, scrollTypes: { EMITTER: 'none', XSCROLLER: 'pan-x', YSCROLLER: 'pan-y', }, touchActionToScrollType: function(touchAction) { var t = touchAction; var st = this.scrollTypes; if (t === st.EMITTER) { return 'none'; } else if (t === st.XSCROLLER) { return 'X'; } else if (t === st.YSCROLLER) { return 'Y'; } else { return 'XY'; } }, POINTER_TYPE: 'touch', firstTouch: null, isPrimaryTouch: function(inTouch) { return this.firstTouch === inTouch.identifier; }, setPrimaryTouch: function(inTouch) { // set primary touch if there no pointers, or the only pointer is the mouse if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) { this.firstTouch = inTouch.identifier; this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY}; this.firstTarget = inTouch.target; this.scrolling = null; this.cancelResetClickCount(); } }, removePrimaryPointer: function(inPointer) { if (inPointer.isPrimary) { this.firstTouch = null; this.firstXY = null; this.resetClickCount(); } }, clickCount: 0, resetId: null, resetClickCount: function() { var fn = function() { this.clickCount = 0; this.resetId = null; }.bind(this); this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT); }, cancelResetClickCount: function() { if (this.resetId) { clearTimeout(this.resetId); } }, typeToButtons: function(type) { var ret = 0; if (type === 'touchstart' || type === 'touchmove') { ret = 1; } return ret; }, findTarget: function(touch, id) { if (this.currentTouchEvent.type === 'touchstart') { if (this.isPrimaryTouch(touch)) { var fastPath = { clientX: touch.clientX, clientY: touch.clientY, path: this.currentTouchEvent.path, target: this.currentTouchEvent.target }; return scope.findTarget(fastPath); } else { return scope.findTarget(touch); } } // reuse target we found in touchstart return pointermap.get(id); }, touchToPointer: function(inTouch) { var cte = this.currentTouchEvent; var e = dispatcher.cloneEvent(inTouch); // Spec specifies that pointerId 1 is reserved for Mouse. // Touch identifiers can start at 0. // Add 2 to the touch identifier for compatibility. var id = e.pointerId = inTouch.identifier + 2; e.target = this.findTarget(inTouch, id); e.bubbles = true; e.cancelable = true; e.detail = this.clickCount; e.buttons = this.typeToButtons(cte.type); e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0; e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0; e.pressure = inTouch.webkitForce || inTouch.force || 0.5; e.isPrimary = this.isPrimaryTouch(inTouch); e.pointerType = this.POINTER_TYPE; e._source = 'touch'; // forward touch preventDefaults var self = this; e.preventDefault = function() { self.scrolling = false; self.firstXY = null; cte.preventDefault(); }; return e; }, processTouches: function(inEvent, inFunction) { var tl = inEvent.changedTouches; this.currentTouchEvent = inEvent; for (var i = 0, t, p; i < tl.length; i++) { t = tl[i]; p = this.touchToPointer(t); if (inEvent.type === 'touchstart') { pointermap.set(p.pointerId, p.target); } if (pointermap.has(p.pointerId)) { inFunction.call(this, p); } if (inEvent.type === 'touchend' || inEvent._cancel) { this.cleanUpPointer(p); } } }, // For single axis scrollers, determines whether the element should emit // pointer events or behave as a scroller shouldScroll: function(inEvent) { if (this.firstXY) { var ret; var touchAction = scope.targetFinding.findTouchAction(inEvent); var scrollAxis = this.touchActionToScrollType(touchAction); if (scrollAxis === 'none') { // this element is a touch-action: none, should never scroll ret = false; } else if (scrollAxis === 'XY') { // this element should always scroll ret = true; } else { var t = inEvent.changedTouches[0]; // check the intended scroll axis, and other axis var a = scrollAxis; var oa = scrollAxis === 'Y' ? 'X' : 'Y'; var da = Math.abs(t['client' + a] - this.firstXY[a]); var doa = Math.abs(t['client' + oa] - this.firstXY[oa]); // if delta in the scroll axis > delta other axis, scroll instead of // making events ret = da >= doa; } return ret; } }, findTouch: function(inTL, inId) { for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) { if (t.identifier === inId) { return true; } } }, // In some instances, a touchstart can happen without a touchend. This // leaves the pointermap in a broken state. // Therefore, on every touchstart, we remove the touches that did not fire a // touchend event. // To keep state globally consistent, we fire a // pointercancel for this "abandoned" touch vacuumTouches: function(inEvent) { var tl = inEvent.touches; // pointermap.pointers() should be < tl.length here, as the touchstart has not // been processed yet. if (pointermap.pointers() >= tl.length) { var d = []; pointermap.forEach(function(value, key) { // Never remove pointerId == 1, which is mouse. // Touch identifiers are 2 smaller than their pointerId, which is the // index in pointermap. if (key !== 1 && !this.findTouch(tl, key - 2)) { var p = value; d.push(p); } }, this); d.forEach(function(p) { this.cancel(p); pointermap.delete(p.pointerId); }, this); } }, touchstart: function(inEvent) { this.vacuumTouches(inEvent); this.setPrimaryTouch(inEvent.changedTouches[0]); this.dedupSynthMouse(inEvent); if (!this.scrolling) { this.clickCount++; this.processTouches(inEvent, this.down); } }, down: function(inPointer) { dispatcher.down(inPointer); }, touchmove: function(inEvent) { if (HAS_TOUCH_ACTION) { // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36 // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ if (inEvent.cancelable) { this.processTouches(inEvent, this.move); } } else { if (!this.scrolling) { if (this.scrolling === null && this.shouldScroll(inEvent)) { this.scrolling = true; } else { this.scrolling = false; inEvent.preventDefault(); this.processTouches(inEvent, this.move); } } else if (this.firstXY) { var t = inEvent.changedTouches[0]; var dx = t.clientX - this.firstXY.X; var dy = t.clientY - this.firstXY.Y; var dd = Math.sqrt(dx * dx + dy * dy); if (dd >= HYSTERESIS) { this.touchcancel(inEvent); this.scrolling = true; this.firstXY = null; } } } }, move: function(inPointer) { dispatcher.move(inPointer); }, touchend: function(inEvent) { this.dedupSynthMouse(inEvent); this.processTouches(inEvent, this.up); }, up: function(inPointer) { inPointer.relatedTarget = scope.findTarget(inPointer); dispatcher.up(inPointer); }, cancel: function(inPointer) { dispatcher.cancel(inPointer); }, touchcancel: function(inEvent) { inEvent._cancel = true; this.processTouches(inEvent, this.cancel); }, cleanUpPointer: function(inPointer) { pointermap['delete'](inPointer.pointerId); this.removePrimaryPointer(inPointer); }, // prevent synth mouse events from creating pointer events dedupSynthMouse: function(inEvent) { var lts = scope.mouseEvents.lastTouches; var t = inEvent.changedTouches[0]; // only the primary finger will synth mouse events if (this.isPrimaryTouch(t)) { // remember x/y of last touch var lt = {x: t.clientX, y: t.clientY}; lts.push(lt); var fn = (function(lts, lt){ var i = lts.indexOf(lt); if (i > -1) { lts.splice(i, 1); } }).bind(null, lts, lt); setTimeout(fn, DEDUP_TIMEOUT); } } }; // prevent "ghost clicks" that come from elements that were removed in a touch handler var STOP_PROP_FN = Event.prototype.stopImmediatePropagation || Event.prototype.stopPropagation; document.addEventListener('click', function(ev) { var x = ev.clientX, y = ev.clientY; // check if a click is within DEDUP_DIST px radius of the touchstart var closeTo = function(touch) { var dx = Math.abs(x - touch.x), dy = Math.abs(y - touch.y); return (dx <= DEDUP_DIST && dy <= DEDUP_DIST); }; // if click coordinates are close to touch coordinates, assume the click came from a touch var wasTouched = scope.mouseEvents.lastTouches.some(closeTo); // if the click came from touch, and the touchstart target is not in the path of the click event, // then the touchstart target was probably removed, and the click should be "busted" var path = scope.targetFinding.path(ev); if (wasTouched) { for (var i = 0; i < path.length; i++) { if (path[i] === touchEvents.firstTarget) { return; } } ev.preventDefault(); STOP_PROP_FN.call(ev); } }, true); scope.touchEvents = touchEvents; })(window.PolymerGestures); (function(scope) { var dispatcher = scope.dispatcher; var pointermap = dispatcher.pointermap; var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number'; var msEvents = { events: [ 'MSPointerDown', 'MSPointerMove', 'MSPointerUp', 'MSPointerCancel', ], register: function(target) { dispatcher.listen(target, this.events); }, unregister: function(target) { if (target === document) { return; } dispatcher.unlisten(target, this.events); }, POINTER_TYPES: [ '', 'unavailable', 'touch', 'pen', 'mouse' ], prepareEvent: function(inEvent) { var e = inEvent; e = dispatcher.cloneEvent(inEvent); if (HAS_BITMAP_TYPE) { e.pointerType = this.POINTER_TYPES[inEvent.pointerType]; } e._source = 'ms'; return e; }, cleanup: function(id) { pointermap['delete'](id); }, MSPointerDown: function(inEvent) { var e = this.prepareEvent(inEvent); e.target = scope.findTarget(inEvent); pointermap.set(inEvent.pointerId, e.target); dispatcher.down(e); }, MSPointerMove: function(inEvent) { var target = pointermap.get(inEvent.pointerId); if (target) { var e = this.prepareEvent(inEvent); e.target = target; dispatcher.move(e); } }, MSPointerUp: function(inEvent) { var e = this.prepareEvent(inEvent); e.relatedTarget = scope.findTarget(inEvent); e.target = pointermap.get(e.pointerId); dispatcher.up(e); this.cleanup(inEvent.pointerId); }, MSPointerCancel: function(inEvent) { var e = this.prepareEvent(inEvent); e.relatedTarget = scope.findTarget(inEvent); e.target = pointermap.get(e.pointerId); dispatcher.cancel(e); this.cleanup(inEvent.pointerId); } }; scope.msEvents = msEvents; })(window.PolymerGestures); (function(scope) { var dispatcher = scope.dispatcher; var pointermap = dispatcher.pointermap; var pointerEvents = { events: [ 'pointerdown', 'pointermove', 'pointerup', 'pointercancel' ], prepareEvent: function(inEvent) { var e = dispatcher.cloneEvent(inEvent); e._source = 'pointer'; return e; }, register: function(target) { dispatcher.listen(target, this.events); }, unregister: function(target) { if (target === document) { return; } dispatcher.unlisten(target, this.events); }, cleanup: function(id) { pointermap['delete'](id); }, pointerdown: function(inEvent) { var e = this.prepareEvent(inEvent); e.target = scope.findTarget(inEvent); pointermap.set(e.pointerId, e.target); dispatcher.down(e); }, pointermove: function(inEvent) { var target = pointermap.get(inEvent.pointerId); if (target) { var e = this.prepareEvent(inEvent); e.target = target; dispatcher.move(e); } }, pointerup: function(inEvent) { var e = this.prepareEvent(inEvent); e.relatedTarget = scope.findTarget(inEvent); e.target = pointermap.get(e.pointerId); dispatcher.up(e); this.cleanup(inEvent.pointerId); }, pointercancel: function(inEvent) { var e = this.prepareEvent(inEvent); e.relatedTarget = scope.findTarget(inEvent); e.target = pointermap.get(e.pointerId); dispatcher.cancel(e); this.cleanup(inEvent.pointerId); } }; scope.pointerEvents = pointerEvents; })(window.PolymerGestures); /** * This module contains the handlers for native platform events. * From here, the dispatcher is called to create unified pointer events. * Included are touch events (v1), mouse events, and MSPointerEvents. */ (function(scope) { var dispatcher = scope.dispatcher; var nav = window.navigator; if (window.PointerEvent) { dispatcher.registerSource('pointer', scope.pointerEvents); } else if (nav.msPointerEnabled) { dispatcher.registerSource('ms', scope.msEvents); } else { dispatcher.registerSource('mouse', scope.mouseEvents); if (window.ontouchstart !== undefined) { dispatcher.registerSource('touch', scope.touchEvents); } } // Work around iOS bugs https://bugs.webkit.org/show_bug.cgi?id=135628 and https://bugs.webkit.org/show_bug.cgi?id=136506 var ua = navigator.userAgent; var IS_IOS = ua.match(/iPad|iPhone|iPod/) && 'ontouchstart' in window; dispatcher.IS_IOS = IS_IOS; scope.touchEvents.IS_IOS = IS_IOS; dispatcher.register(document, true); })(window.PolymerGestures); /** * This event denotes the beginning of a series of tracking events. * * @module PointerGestures * @submodule Events * @class trackstart */ /** * Pixels moved in the x direction since trackstart. * @type Number * @property dx */ /** * Pixes moved in the y direction since trackstart. * @type Number * @property dy */ /** * Pixels moved in the x direction since the last track. * @type Number * @property ddx */ /** * Pixles moved in the y direction since the last track. * @type Number * @property ddy */ /** * The clientX position of the track gesture. * @type Number * @property clientX */ /** * The clientY position of the track gesture. * @type Number * @property clientY */ /** * The pageX position of the track gesture. * @type Number * @property pageX */ /** * The pageY position of the track gesture. * @type Number * @property pageY */ /** * The screenX position of the track gesture. * @type Number * @property screenX */ /** * The screenY position of the track gesture. * @type Number * @property screenY */ /** * The last x axis direction of the pointer. * @type Number * @property xDirection */ /** * The last y axis direction of the pointer. * @type Number * @property yDirection */ /** * A shared object between all tracking events. * @type Object * @property trackInfo */ /** * The element currently under the pointer. * @type Element * @property relatedTarget */ /** * The type of pointer that make the track gesture. * @type String * @property pointerType */ /** * * This event fires for all pointer movement being tracked. * * @class track * @extends trackstart */ /** * This event fires when the pointer is no longer being tracked. * * @class trackend * @extends trackstart */ (function(scope) { var dispatcher = scope.dispatcher; var eventFactory = scope.eventFactory; var pointermap = new scope.PointerMap(); var track = { events: [ 'down', 'move', 'up', ], exposes: [ 'trackstart', 'track', 'trackx', 'tracky', 'trackend' ], defaultActions: { 'track': 'none', 'trackx': 'pan-y', 'tracky': 'pan-x' }, WIGGLE_THRESHOLD: 4, clampDir: function(inDelta) { return inDelta > 0 ? 1 : -1; }, calcPositionDelta: function(inA, inB) { var x = 0, y = 0; if (inA && inB) { x = inB.pageX - inA.pageX; y = inB.pageY - inA.pageY; } return {x: x, y: y}; }, fireTrack: function(inType, inEvent, inTrackingData) { var t = inTrackingData; var d = this.calcPositionDelta(t.downEvent, inEvent); var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent); if (dd.x) { t.xDirection = this.clampDir(dd.x); } else if (inType === 'trackx') { return; } if (dd.y) { t.yDirection = this.clampDir(dd.y); } else if (inType === 'tracky') { return; } var gestureProto = { bubbles: true, cancelable: true, trackInfo: t.trackInfo, relatedTarget: inEvent.relatedTarget, pointerType: inEvent.pointerType, pointerId: inEvent.pointerId, _source: 'track' }; if (inType !== 'tracky') { gestureProto.x = inEvent.x; gestureProto.dx = d.x; gestureProto.ddx = dd.x; gestureProto.clientX = inEvent.clientX; gestureProto.pageX = inEvent.pageX; gestureProto.screenX = inEvent.screenX; gestureProto.xDirection = t.xDirection; } if (inType !== 'trackx') { gestureProto.dy = d.y; gestureProto.ddy = dd.y; gestureProto.y = inEvent.y; gestureProto.clientY = inEvent.clientY; gestureProto.pageY = inEvent.pageY; gestureProto.screenY = inEvent.screenY; gestureProto.yDirection = t.yDirection; } var e = eventFactory.makeGestureEvent(inType, gestureProto); t.downTarget.dispatchEvent(e); }, down: function(inEvent) { if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) { var p = { downEvent: inEvent, downTarget: inEvent.target, trackInfo: {}, lastMoveEvent: null, xDirection: 0, yDirection: 0, tracking: false }; pointermap.set(inEvent.pointerId, p); } }, move: function(inEvent) { var p = pointermap.get(inEvent.pointerId); if (p) { if (!p.tracking) { var d = this.calcPositionDelta(p.downEvent, inEvent); var move = d.x * d.x + d.y * d.y; // start tracking only if finger moves more than WIGGLE_THRESHOLD if (move > this.WIGGLE_THRESHOLD) { p.tracking = true; p.lastMoveEvent = p.downEvent; this.fireTrack('trackstart', inEvent, p); } } if (p.tracking) { this.fireTrack('track', inEvent, p); this.fireTrack('trackx', inEvent, p); this.fireTrack('tracky', inEvent, p); } p.lastMoveEvent = inEvent; } }, up: function(inEvent) { var p = pointermap.get(inEvent.pointerId); if (p) { if (p.tracking) { this.fireTrack('trackend', inEvent, p); } pointermap.delete(inEvent.pointerId); } } }; dispatcher.registerGesture('track', track); })(window.PolymerGestures); /** * This event is fired when a pointer is held down for 200ms. * * @module PointerGestures * @submodule Events * @class hold */ /** * Type of pointer that made the holding event. * @type String * @property pointerType */ /** * Screen X axis position of the held pointer * @type Number * @property clientX */ /** * Screen Y axis position of the held pointer * @type Number * @property clientY */ /** * Type of pointer that made the holding event. * @type String * @property pointerType */ /** * This event is fired every 200ms while a pointer is held down. * * @class holdpulse * @extends hold */ /** * Milliseconds pointer has been held down. * @type Number * @property holdTime */ /** * This event is fired when a held pointer is released or moved. * * @class release */ (function(scope) { var dispatcher = scope.dispatcher; var eventFactory = scope.eventFactory; var hold = { // wait at least HOLD_DELAY ms between hold and pulse events HOLD_DELAY: 200, // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold WIGGLE_THRESHOLD: 16, events: [ 'down', 'move', 'up', ], exposes: [ 'hold', 'holdpulse', 'release' ], heldPointer: null, holdJob: null, pulse: function() { var hold = Date.now() - this.heldPointer.timeStamp; var type = this.held ? 'holdpulse' : 'hold'; this.fireHold(type, hold); this.held = true; }, cancel: function() { clearInterval(this.holdJob); if (this.held) { this.fireHold('release'); } this.held = false; this.heldPointer = null; this.target = null; this.holdJob = null; }, down: function(inEvent) { if (inEvent.isPrimary && !this.heldPointer) { this.heldPointer = inEvent; this.target = inEvent.target; this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY); } }, up: function(inEvent) { if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) { this.cancel(); } }, move: function(inEvent) { if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) { var x = inEvent.clientX - this.heldPointer.clientX; var y = inEvent.clientY - this.heldPointer.clientY; if ((x * x + y * y) > this.WIGGLE_THRESHOLD) { this.cancel(); } } }, fireHold: function(inType, inHoldTime) { var p = { bubbles: true, cancelable: true, pointerType: this.heldPointer.pointerType, pointerId: this.heldPointer.pointerId, x: this.heldPointer.clientX, y: this.heldPointer.clientY, _source: 'hold' }; if (inHoldTime) { p.holdTime = inHoldTime; } var e = eventFactory.makeGestureEvent(inType, p); this.target.dispatchEvent(e); } }; dispatcher.registerGesture('hold', hold); })(window.PolymerGestures); /** * This event is fired when a pointer quickly goes down and up, and is used to * denote activation. * * Any gesture event can prevent the tap event from being created by calling * `event.preventTap`. * * Any pointer event can prevent the tap by setting the `tapPrevented` property * on itself. * * @module PointerGestures * @submodule Events * @class tap */ /** * X axis position of the tap. * @property x * @type Number */ /** * Y axis position of the tap. * @property y * @type Number */ /** * Type of the pointer that made the tap. * @property pointerType * @type String */ (function(scope) { var dispatcher = scope.dispatcher; var eventFactory = scope.eventFactory; var pointermap = new scope.PointerMap(); var tap = { events: [ 'down', 'up' ], exposes: [ 'tap' ], down: function(inEvent) { if (inEvent.isPrimary && !inEvent.tapPrevented) { pointermap.set(inEvent.pointerId, { target: inEvent.target, buttons: inEvent.buttons, x: inEvent.clientX, y: inEvent.clientY }); } }, shouldTap: function(e, downState) { var tap = true; if (e.pointerType === 'mouse') { // only allow left click to tap for mouse tap = (e.buttons ^ 1) && (downState.buttons & 1); } return tap && !e.tapPrevented; }, up: function(inEvent) { var start = pointermap.get(inEvent.pointerId); if (start && this.shouldTap(inEvent, start)) { // up.relatedTarget is target currently under finger var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget); if (t) { var e = eventFactory.makeGestureEvent('tap', { bubbles: true, cancelable: true, x: inEvent.clientX, y: inEvent.clientY, detail: inEvent.detail, pointerType: inEvent.pointerType, pointerId: inEvent.pointerId, altKey: inEvent.altKey, ctrlKey: inEvent.ctrlKey, metaKey: inEvent.metaKey, shiftKey: inEvent.shiftKey, _source: 'tap' }); t.dispatchEvent(e); } } pointermap.delete(inEvent.pointerId); } }; // patch eventFactory to remove id from tap's pointermap for preventTap calls eventFactory.preventTap = function(e) { return function() { e.tapPrevented = true; pointermap.delete(e.pointerId); }; }; dispatcher.registerGesture('tap', tap); })(window.PolymerGestures); /* * Basic strategy: find the farthest apart points, use as diameter of circle * react to size change and rotation of the chord */ /** * @module pointer-gestures * @submodule Events * @class pinch */ /** * Scale of the pinch zoom gesture * @property scale * @type Number */ /** * Center X position of pointers causing pinch * @property centerX * @type Number */ /** * Center Y position of pointers causing pinch * @property centerY * @type Number */ /** * @module pointer-gestures * @submodule Events * @class rotate */ /** * Angle (in degrees) of rotation. Measured from starting positions of pointers. * @property angle * @type Number */ /** * Center X position of pointers causing rotation * @property centerX * @type Number */ /** * Center Y position of pointers causing rotation * @property centerY * @type Number */ (function(scope) { var dispatcher = scope.dispatcher; var eventFactory = scope.eventFactory; var pointermap = new scope.PointerMap(); var RAD_TO_DEG = 180 / Math.PI; var pinch = { events: [ 'down', 'up', 'move', 'cancel' ], exposes: [ 'pinchstart', 'pinch', 'pinchend', 'rotate' ], defaultActions: { 'pinch': 'none', 'rotate': 'none' }, reference: {}, down: function(inEvent) { pointermap.set(inEvent.pointerId, inEvent); if (pointermap.pointers() == 2) { var points = this.calcChord(); var angle = this.calcAngle(points); this.reference = { angle: angle, diameter: points.diameter, target: scope.targetFinding.LCA(points.a.target, points.b.target) }; this.firePinch('pinchstart', points.diameter, points); } }, up: function(inEvent) { var p = pointermap.get(inEvent.pointerId); var num = pointermap.pointers(); if (p) { if (num === 2) { // fire 'pinchend' before deleting pointer var points = this.calcChord(); this.firePinch('pinchend', points.diameter, points); } pointermap.delete(inEvent.pointerId); } }, move: function(inEvent) { if (pointermap.has(inEvent.pointerId)) { pointermap.set(inEvent.pointerId, inEvent); if (pointermap.pointers() > 1) { this.calcPinchRotate(); } } }, cancel: function(inEvent) { this.up(inEvent); }, firePinch: function(type, diameter, points) { var zoom = diameter / this.reference.diameter; var e = eventFactory.makeGestureEvent(type, { bubbles: true, cancelable: true, scale: zoom, centerX: points.center.x, centerY: points.center.y, _source: 'pinch' }); this.reference.target.dispatchEvent(e); }, fireRotate: function(angle, points) { var diff = Math.round((angle - this.reference.angle) % 360); var e = eventFactory.makeGestureEvent('rotate', { bubbles: true, cancelable: true, angle: diff, centerX: points.center.x, centerY: points.center.y, _source: 'pinch' }); this.reference.target.dispatchEvent(e); }, calcPinchRotate: function() { var points = this.calcChord(); var diameter = points.diameter; var angle = this.calcAngle(points); if (diameter != this.reference.diameter) { this.firePinch('pinch', diameter, points); } if (angle != this.reference.angle) { this.fireRotate(angle, points); } }, calcChord: function() { var pointers = []; pointermap.forEach(function(p) { pointers.push(p); }); var dist = 0; // start with at least two pointers var points = {a: pointers[0], b: pointers[1]}; var x, y, d; for (var i = 0; i < pointers.length; i++) { var a = pointers[i]; for (var j = i + 1; j < pointers.length; j++) { var b = pointers[j]; x = Math.abs(a.clientX - b.clientX); y = Math.abs(a.clientY - b.clientY); d = x + y; if (d > dist) { dist = d; points = {a: a, b: b}; } } } x = Math.abs(points.a.clientX + points.b.clientX) / 2; y = Math.abs(points.a.clientY + points.b.clientY) / 2; points.center = { x: x, y: y }; points.diameter = dist; return points; }, calcAngle: function(points) { var x = points.a.clientX - points.b.clientX; var y = points.a.clientY - points.b.clientY; return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360; } }; dispatcher.registerGesture('pinch', pinch); })(window.PolymerGestures); (function (global) { 'use strict'; var Token, TokenName, Syntax, Messages, source, index, length, delegate, lookahead, state; Token = { BooleanLiteral: 1, EOF: 2, Identifier: 3, Keyword: 4, NullLiteral: 5, NumericLiteral: 6, Punctuator: 7, StringLiteral: 8 }; TokenName = {}; TokenName[Token.BooleanLiteral] = 'Boolean'; TokenName[Token.EOF] = ''; TokenName[Token.Identifier] = 'Identifier'; TokenName[Token.Keyword] = 'Keyword'; TokenName[Token.NullLiteral] = 'Null'; TokenName[Token.NumericLiteral] = 'Numeric'; TokenName[Token.Punctuator] = 'Punctuator'; TokenName[Token.StringLiteral] = 'String'; Syntax = { ArrayExpression: 'ArrayExpression', BinaryExpression: 'BinaryExpression', CallExpression: 'CallExpression', ConditionalExpression: 'ConditionalExpression', EmptyStatement: 'EmptyStatement', ExpressionStatement: 'ExpressionStatement', Identifier: 'Identifier', Literal: 'Literal', LabeledStatement: 'LabeledStatement', LogicalExpression: 'LogicalExpression', MemberExpression: 'MemberExpression', ObjectExpression: 'ObjectExpression', Program: 'Program', Property: 'Property', ThisExpression: 'ThisExpression', UnaryExpression: 'UnaryExpression' }; // Error messages should be identical to V8. Messages = { UnexpectedToken: 'Unexpected token %0', UnknownLabel: 'Undefined label \'%0\'', Redeclaration: '%0 \'%1\' has already been declared' }; // Ensure the condition is true, otherwise throw an error. // This is only to have a better contract semantic, i.e. another safety net // to catch a logic error. The condition shall be fulfilled in normal case. // Do NOT use this to enforce a certain condition on any user input. function assert(condition, message) { if (!condition) { throw new Error('ASSERT: ' + message); } } function isDecimalDigit(ch) { return (ch >= 48 && ch <= 57); // 0..9 } // 7.2 White Space function isWhiteSpace(ch) { return (ch === 32) || // space (ch === 9) || // tab (ch === 0xB) || (ch === 0xC) || (ch === 0xA0) || (ch >= 0x1680 && '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(String.fromCharCode(ch)) > 0); } // 7.3 Line Terminators function isLineTerminator(ch) { return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029); } // 7.6 Identifier Names and Identifiers function isIdentifierStart(ch) { return (ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore) (ch >= 65 && ch <= 90) || // A..Z (ch >= 97 && ch <= 122); // a..z } function isIdentifierPart(ch) { return (ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore) (ch >= 65 && ch <= 90) || // A..Z (ch >= 97 && ch <= 122) || // a..z (ch >= 48 && ch <= 57); // 0..9 } // 7.6.1.1 Keywords function isKeyword(id) { return (id === 'this') } // 7.4 Comments function skipWhitespace() { while (index < length && isWhiteSpace(source.charCodeAt(index))) { ++index; } } function getIdentifier() { var start, ch; start = index++; while (index < length) { ch = source.charCodeAt(index); if (isIdentifierPart(ch)) { ++index; } else { break; } } return source.slice(start, index); } function scanIdentifier() { var start, id, type; start = index; id = getIdentifier(); // There is no keyword or literal with only one character. // Thus, it must be an identifier. if (id.length === 1) { type = Token.Identifier; } else if (isKeyword(id)) { type = Token.Keyword; } else if (id === 'null') { type = Token.NullLiteral; } else if (id === 'true' || id === 'false') { type = Token.BooleanLiteral; } else { type = Token.Identifier; } return { type: type, value: id, range: [start, index] }; } // 7.7 Punctuators function scanPunctuator() { var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2; switch (code) { // Check for most common single-character punctuators. case 46: // . dot case 40: // ( open bracket case 41: // ) close bracket case 59: // ; semicolon case 44: // , comma case 123: // { open curly brace case 125: // } close curly brace case 91: // [ case 93: // ] case 58: // : case 63: // ? ++index; return { type: Token.Punctuator, value: String.fromCharCode(code), range: [start, index] }; default: code2 = source.charCodeAt(index + 1); // '=' (char #61) marks an assignment or comparison operator. if (code2 === 61) { switch (code) { case 37: // % case 38: // & case 42: // *: case 43: // + case 45: // - case 47: // / case 60: // < case 62: // > case 124: // | index += 2; return { type: Token.Punctuator, value: String.fromCharCode(code) + String.fromCharCode(code2), range: [start, index] }; case 33: // ! case 61: // = index += 2; // !== and === if (source.charCodeAt(index) === 61) { ++index; } return { type: Token.Punctuator, value: source.slice(start, index), range: [start, index] }; default: break; } } break; } // Peek more characters. ch2 = source[index + 1]; // Other 2-character punctuators: && || if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) { index += 2; return { type: Token.Punctuator, value: ch1 + ch2, range: [start, index] }; } if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) { ++index; return { type: Token.Punctuator, value: ch1, range: [start, index] }; } throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); } // 7.8.3 Numeric Literals function scanNumericLiteral() { var number, start, ch; ch = source[index]; assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point'); start = index; number = ''; if (ch !== '.') { number = source[index++]; ch = source[index]; // Hex number starts with '0x'. // Octal number starts with '0'. if (number === '0') { // decimal number starts with '0' such as '09' is illegal. if (ch && isDecimalDigit(ch.charCodeAt(0))) { throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); } } while (isDecimalDigit(source.charCodeAt(index))) { number += source[index++]; } ch = source[index]; } if (ch === '.') { number += source[index++]; while (isDecimalDigit(source.charCodeAt(index))) { number += source[index++]; } ch = source[index]; } if (ch === 'e' || ch === 'E') { number += source[index++]; ch = source[index]; if (ch === '+' || ch === '-') { number += source[index++]; } if (isDecimalDigit(source.charCodeAt(index))) { while (isDecimalDigit(source.charCodeAt(index))) { number += source[index++]; } } else { throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); } } if (isIdentifierStart(source.charCodeAt(index))) { throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); } return { type: Token.NumericLiteral, value: parseFloat(number), range: [start, index] }; } // 7.8.4 String Literals function scanStringLiteral() { var str = '', quote, start, ch, octal = false; quote = source[index]; assert((quote === '\'' || quote === '"'), 'String literal must starts with a quote'); start = index; ++index; while (index < length) { ch = source[index++]; if (ch === quote) { quote = ''; break; } else if (ch === '\\') { ch = source[index++]; if (!ch || !isLineTerminator(ch.charCodeAt(0))) { switch (ch) { case 'n': str += '\n'; break; case 'r': str += '\r'; break; case 't': str += '\t'; break; case 'b': str += '\b'; break; case 'f': str += '\f'; break; case 'v': str += '\x0B'; break; default: str += ch; break; } } else { if (ch === '\r' && source[index] === '\n') { ++index; } } } else if (isLineTerminator(ch.charCodeAt(0))) { break; } else { str += ch; } } if (quote !== '') { throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); } return { type: Token.StringLiteral, value: str, octal: octal, range: [start, index] }; } function isIdentifierName(token) { return token.type === Token.Identifier || token.type === Token.Keyword || token.type === Token.BooleanLiteral || token.type === Token.NullLiteral; } function advance() { var ch; skipWhitespace(); if (index >= length) { return { type: Token.EOF, range: [index, index] }; } ch = source.charCodeAt(index); // Very common: ( and ) and ; if (ch === 40 || ch === 41 || ch === 58) { return scanPunctuator(); } // String literal starts with single quote (#39) or double quote (#34). if (ch === 39 || ch === 34) { return scanStringLiteral(); } if (isIdentifierStart(ch)) { return scanIdentifier(); } // Dot (.) char #46 can also start a floating-point number, hence the need // to check the next character. if (ch === 46) { if (isDecimalDigit(source.charCodeAt(index + 1))) { return scanNumericLiteral(); } return scanPunctuator(); } if (isDecimalDigit(ch)) { return scanNumericLiteral(); } return scanPunctuator(); } function lex() { var token; token = lookahead; index = token.range[1]; lookahead = advance(); index = token.range[1]; return token; } function peek() { var pos; pos = index; lookahead = advance(); index = pos; } // Throw an exception function throwError(token, messageFormat) { var error, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace( /%(\d)/g, function (whole, index) { assert(index < args.length, 'Message reference must be in range'); return args[index]; } ); error = new Error(msg); error.index = index; error.description = msg; throw error; } // Throw an exception because of the token. function throwUnexpected(token) { throwError(token, Messages.UnexpectedToken, token.value); } // Expect the next token to match the specified punctuator. // If not, an exception will be thrown. function expect(value) { var token = lex(); if (token.type !== Token.Punctuator || token.value !== value) { throwUnexpected(token); } } // Return true if the next token matches the specified punctuator. function match(value) { return lookahead.type === Token.Punctuator && lookahead.value === value; } // Return true if the next token matches the specified keyword function matchKeyword(keyword) { return lookahead.type === Token.Keyword && lookahead.value === keyword; } function consumeSemicolon() { // Catch the very common case first: immediately a semicolon (char #59). if (source.charCodeAt(index) === 59) { lex(); return; } skipWhitespace(); if (match(';')) { lex(); return; } if (lookahead.type !== Token.EOF && !match('}')) { throwUnexpected(lookahead); } } // 11.1.4 Array Initialiser function parseArrayInitialiser() { var elements = []; expect('['); while (!match(']')) { if (match(',')) { lex(); elements.push(null); } else { elements.push(parseExpression()); if (!match(']')) { expect(','); } } } expect(']'); return delegate.createArrayExpression(elements); } // 11.1.5 Object Initialiser function parseObjectPropertyKey() { var token; skipWhitespace(); token = lex(); // Note: This function is called only from parseObjectProperty(), where // EOF and Punctuator tokens are already filtered out. if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) { return delegate.createLiteral(token); } return delegate.createIdentifier(token.value); } function parseObjectProperty() { var token, key; token = lookahead; skipWhitespace(); if (token.type === Token.EOF || token.type === Token.Punctuator) { throwUnexpected(token); } key = parseObjectPropertyKey(); expect(':'); return delegate.createProperty('init', key, parseExpression()); } function parseObjectInitialiser() { var properties = []; expect('{'); while (!match('}')) { properties.push(parseObjectProperty()); if (!match('}')) { expect(','); } } expect('}'); return delegate.createObjectExpression(properties); } // 11.1.6 The Grouping Operator function parseGroupExpression() { var expr; expect('('); expr = parseExpression(); expect(')'); return expr; } // 11.1 Primary Expressions function parsePrimaryExpression() { var type, token, expr; if (match('(')) { return parseGroupExpression(); } type = lookahead.type; if (type === Token.Identifier) { expr = delegate.createIdentifier(lex().value); } else if (type === Token.StringLiteral || type === Token.NumericLiteral) { expr = delegate.createLiteral(lex()); } else if (type === Token.Keyword) { if (matchKeyword('this')) { lex(); expr = delegate.createThisExpression(); } } else if (type === Token.BooleanLiteral) { token = lex(); token.value = (token.value === 'true'); expr = delegate.createLiteral(token); } else if (type === Token.NullLiteral) { token = lex(); token.value = null; expr = delegate.createLiteral(token); } else if (match('[')) { expr = parseArrayInitialiser(); } else if (match('{')) { expr = parseObjectInitialiser(); } if (expr) { return expr; } throwUnexpected(lex()); } // 11.2 Left-Hand-Side Expressions function parseArguments() { var args = []; expect('('); if (!match(')')) { while (index < length) { args.push(parseExpression()); if (match(')')) { break; } expect(','); } } expect(')'); return args; } function parseNonComputedProperty() { var token; token = lex(); if (!isIdentifierName(token)) { throwUnexpected(token); } return delegate.createIdentifier(token.value); } function parseNonComputedMember() { expect('.'); return parseNonComputedProperty(); } function parseComputedMember() { var expr; expect('['); expr = parseExpression(); expect(']'); return expr; } function parseLeftHandSideExpression() { var expr, args, property; expr = parsePrimaryExpression(); while (true) { if (match('[')) { property = parseComputedMember(); expr = delegate.createMemberExpression('[', expr, property); } else if (match('.')) { property = parseNonComputedMember(); expr = delegate.createMemberExpression('.', expr, property); } else if (match('(')) { args = parseArguments(); expr = delegate.createCallExpression(expr, args); } else { break; } } return expr; } // 11.3 Postfix Expressions var parsePostfixExpression = parseLeftHandSideExpression; // 11.4 Unary Operators function parseUnaryExpression() { var token, expr; if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) { expr = parsePostfixExpression(); } else if (match('+') || match('-') || match('!')) { token = lex(); expr = parseUnaryExpression(); expr = delegate.createUnaryExpression(token.value, expr); } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) { throwError({}, Messages.UnexpectedToken); } else { expr = parsePostfixExpression(); } return expr; } function binaryPrecedence(token) { var prec = 0; if (token.type !== Token.Punctuator && token.type !== Token.Keyword) { return 0; } switch (token.value) { case '||': prec = 1; break; case '&&': prec = 2; break; case '==': case '!=': case '===': case '!==': prec = 6; break; case '<': case '>': case '<=': case '>=': case 'instanceof': prec = 7; break; case 'in': prec = 7; break; case '+': case '-': prec = 9; break; case '*': case '/': case '%': prec = 11; break; default: break; } return prec; } // 11.5 Multiplicative Operators // 11.6 Additive Operators // 11.7 Bitwise Shift Operators // 11.8 Relational Operators // 11.9 Equality Operators // 11.10 Binary Bitwise Operators // 11.11 Binary Logical Operators function parseBinaryExpression() { var expr, token, prec, stack, right, operator, left, i; left = parseUnaryExpression(); token = lookahead; prec = binaryPrecedence(token); if (prec === 0) { return left; } token.prec = prec; lex(); right = parseUnaryExpression(); stack = [left, token, right]; while ((prec = binaryPrecedence(lookahead)) > 0) { // Reduce: make a binary expression from the three topmost entries. while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) { right = stack.pop(); operator = stack.pop().value; left = stack.pop(); expr = delegate.createBinaryExpression(operator, left, right); stack.push(expr); } // Shift. token = lex(); token.prec = prec; stack.push(token); expr = parseUnaryExpression(); stack.push(expr); } // Final reduce to clean-up the stack. i = stack.length - 1; expr = stack[i]; while (i > 1) { expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr); i -= 2; } return expr; } // 11.12 Conditional Operator function parseConditionalExpression() { var expr, consequent, alternate; expr = parseBinaryExpression(); if (match('?')) { lex(); consequent = parseConditionalExpression(); expect(':'); alternate = parseConditionalExpression(); expr = delegate.createConditionalExpression(expr, consequent, alternate); } return expr; } // Simplification since we do not support AssignmentExpression. var parseExpression = parseConditionalExpression; // Polymer Syntax extensions // Filter :: // Identifier // Identifier "(" ")" // Identifier "(" FilterArguments ")" function parseFilter() { var identifier, args; identifier = lex(); if (identifier.type !== Token.Identifier) { throwUnexpected(identifier); } args = match('(') ? parseArguments() : []; return delegate.createFilter(identifier.value, args); } // Filters :: // "|" Filter // Filters "|" Filter function parseFilters() { while (match('|')) { lex(); parseFilter(); } } // TopLevel :: // LabelledExpressions // AsExpression // InExpression // FilterExpression // AsExpression :: // FilterExpression as Identifier // InExpression :: // Identifier, Identifier in FilterExpression // Identifier in FilterExpression // FilterExpression :: // Expression // Expression Filters function parseTopLevel() { skipWhitespace(); peek(); var expr = parseExpression(); if (expr) { if (lookahead.value === ',' || lookahead.value == 'in' && expr.type === Syntax.Identifier) { parseInExpression(expr); } else { parseFilters(); if (lookahead.value === 'as') { parseAsExpression(expr); } else { delegate.createTopLevel(expr); } } } if (lookahead.type !== Token.EOF) { throwUnexpected(lookahead); } } function parseAsExpression(expr) { lex(); // as var identifier = lex().value; delegate.createAsExpression(expr, identifier); } function parseInExpression(identifier) { var indexName; if (lookahead.value === ',') { lex(); if (lookahead.type !== Token.Identifier) throwUnexpected(lookahead); indexName = lex().value; } lex(); // in var expr = parseExpression(); parseFilters(); delegate.createInExpression(identifier.name, indexName, expr); } function parse(code, inDelegate) { delegate = inDelegate; source = code; index = 0; length = source.length; lookahead = null; state = { labelSet: {} }; return parseTopLevel(); } global.esprima = { parse: parse }; })(this); // Copyright (c) 2014 The Polymer Project Authors. All rights reserved. // This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt // The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt // The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt // Code distributed by Google as part of the polymer project is also // subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt (function (global) { 'use strict'; function prepareBinding(expressionText, name, node, filterRegistry) { var expression; try { expression = getExpression(expressionText); if (expression.scopeIdent && (node.nodeType !== Node.ELEMENT_NODE || node.tagName !== 'TEMPLATE' || (name !== 'bind' && name !== 'repeat'))) { throw Error('as and in can only be used within